求高手排列组合算法

99guo 2014-08-07 10:33:47
例如下面的例子:
数组1: "S1","S2","S3"
数组2: "B2"
数组3: "C1","C2"
得到结果 "S1,B2,C1","S1,B2,C2",“S2,B2,C1”,“S2,B2,C2”,"S3,B2,C1","S3,B2,C2"

我想得到上面的所有排列组合算法,求大神有没方法,如何做??
...全文
477 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
数据量大时,或者你并不需要得到所有的值(例如只需要选择出“内容存在重复的”的前5个结果),那么应该使用“迭代器”技术来输出结果。它不但支持Linq的延迟加载技术,提前推出结果数据,同时也可以避免内存暴涨问题。
埋头苦练 2014-08-10
  • 打赏
  • 举报
回复
引用 15 楼 sp1234 的回复:
[quote=引用 11 楼 jshi123 的回复:] 多于三层这样写:

	var arrays = new[] 
	{
		new[]{"S1","S2","S3"},
		new[]{"B2"},
		new[]{"C1","C2"},
	};

	IEnumerable<string> result = new[]{""};
	result = arrays.Aggregate(result, (current, array) => current.SelectMany(y => array.Select(z => y + z)));
数据量小并且要求一次性得到所有值的时候这样描述算法也挺不错。[/quote] 学习。。。
  • 打赏
  • 举报
回复
引用 11 楼 jshi123 的回复:
多于三层这样写:

	var arrays = new[] 
	{
		new[]{"S1","S2","S3"},
		new[]{"B2"},
		new[]{"C1","C2"},
	};

	IEnumerable<string> result = new[]{""};
	result = arrays.Aggregate(result, (current, array) => current.SelectMany(y => array.Select(z => y + z)));
数据量小并且要求一次性得到所有值的时候这样描述算法也挺不错。
pgy_2464651707 2014-08-10
  • 打赏
  • 举报
回复
把B转成GB、MB、KB组合算法例子 const int GB = 1024 * 1024 * 1024;//定义GB的计算常量 const int MB = 1024 * 1024;//定义MB的计算常量 const int KB = 1024;//定义KB的计算常量 public string ByteConversionGBMBKB(Int64 KSize) { if (KSize / GB >= 1)//如果当前Byte的值大于等于1GB return (Math.Round(KSize / (float)GB, 2)).ToString() + "GB";//将其转换成GB else if (KSize / MB >= 1)//如果当前Byte的值大于等于1MB return (Math.Round(KSize / (float)MB, 2)).ToString() + "MB";//将其转换成MB else if (KSize / KB >= 1)//如果当前Byte的值大于等于1KB return (Math.Round(KSize / (float)KB, 2)).ToString() + "KB";//将其转换成KGB else return KSize.ToString() + "Byte";//显示Byte值 }
a8141036 2014-08-07
  • 打赏
  • 举报
回复

        string[] level1 = { "S1", "S2", "S3" };
        string[] level2 = { "B2" };
        string[] level3 = { "C1", "C2" };
        List<string> result = new List<string>();

        for(int i = 0;i< level1.Length;i++ )
        {
            for(int j = 0;j < level2.Length; j++)
            {
                for (int k = 0; k < level3.Length; k++)
                {
                    result.Add(string.Format("{0},{1},{2}", level1[i], level2[j], level3[k]));
                }
            }
        }
於黾 2014-08-07
  • 打赏
  • 举报
回复
for(int i;;) for(int j;;) for(int k;;) string s=数组1[i]+数组2[j]+数组3[k]; 然后你想把s直接输出还是保存到什么集合,就随便了.
於黾 2014-08-07
  • 打赏
  • 举报
回复
简单点,三重for循环,每个数组取一个值,拼接 如果想数组数量可以动态变化,需要写递归
Peng_baoqing 2014-08-07
  • 打赏
  • 举报
回复
引用 12 楼 Peng_baoqing 的回复:
求笛卡尔积啊。
http://blog.sina.com.cn/s/blog_53e74b270100oaim.html
Peng_baoqing 2014-08-07
  • 打赏
  • 举报
回复
求笛卡尔积啊。
jshi123 2014-08-07
  • 打赏
  • 举报
回复
多于三层这样写:

	var arrays = new[] 
	{
		new[]{"S1","S2","S3"},
		new[]{"B2"},
		new[]{"C1","C2"},
	};

	IEnumerable<string> result = new[]{""};
	result = arrays.Aggregate(result, (current, array) => current.SelectMany(y => array.Select(z => y + z)));
99guo 2014-08-07
  • 打赏
  • 举报
回复
谢谢各位 度娘给结果了: http://baike.baidu.com/view/348542.htm?from_id=1434391&type=syn&fromtitle=%E7%AC%9B%E5%8D%A1%E5%B0%94%E7%A7%AF&fr=aladdin
phommy 2014-08-07
  • 打赏
  • 举报
回复
var l1 = new[] {"S1", "S2", "S3"}; var l2 = new[] {"B2"}; var l3 = new[] {"C1", "C2"}; Func<string, string, string> joinFunc = (s, s1) => s + "," + s1; var result = l1.SelectMany(n => l2, joinFunc) .SelectMany(n => l3, joinFunc);
於黾 2014-08-07
  • 打赏
  • 举报
回复
写递归的话,你数组结构要改,都要放到一个大数组里(二维数组) 否则怎么知道循环到第几次,应该从哪个数组里取数据? 递归这样写:
void function(string[ ] s,int step,int maxStep)
{
for(int i=0;i<数组[step].Length;i++)
{
if(step==maxStep)
{
s[step]=数组[step][i];
//输出或保存s
}
else
{
function(s,step+1,maxStep);
}
}
}
调用的时候,执行 function(new string[数组长度],0,数组长度);
熙风 2014-08-07
  • 打赏
  • 举报
回复
99guo 2014-08-07
  • 打赏
  • 举报
回复
所以大家不要直接3层for语句了
99guo 2014-08-07
  • 打赏
  • 举报
回复
大家这只是比喻,数组可能多余3层。 写for语句是要只要了多少层。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧