求一算法答案

luck0235 2016-08-22 04:59:51
一个简单的类

class item
{
public string name { get; set; }
public int level { get; set; }
}


构造演示数据

List<item> all = new List<item>();
all.Add(new item { name = "Red", level = 0 });
all.Add(new item { name = "Blue", level = 0 });

all.Add(new item { name = "S", level = 1 });
all.Add(new item { name = "M", level = 1 });
all.Add(new item { name = "L", level = 1 });

all.Add(new item { name = "Man", level = 2 });
all.Add(new item { name = "Woman", level = 2 });


算法要求根据level分组进行所有name的组合,结果如下:
Red - S - Man
Red - S - Woman
Red - M - Man
Red - M - Woman
Red - L - Man
Red - L - Woman
Blue - S - Man
Blue - S - Woman
Blue - M - Man
Blue - M - Woman
Blue - L - Man
Blue - L - Woman

如果level最大值固定的话没有问题,比如level最大值为2我可以这样:

foreach(var _0 in all.Where(m => m.level == 0))
{
foreach(var _1 in all.Where(m => m.level == 1))
{
foreach(var _2 in all.Where(m => m.level == 2))
{
System.Console.WriteLine(_0.name + "-" + _1.name + "-" + _2.name);
}
}
}


现在关键问题是level最大值不固定,可能为2,可能为5,可能为10...... 请教如何用动态的方式完成这样的组合?
PS:设定level以1递增,可用for(int i = 0; i < level; i++)的方式遍历level
很多年没来CSDN了,不知现在CSDN比Stackoverflow如何,谢谢各位
...全文
410 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
luck0235 2016-09-03
  • 打赏
  • 举报
回复
TKS各位,这是一个笛卡尔算法问题,因为项目中是用JS来实现,后来花了不少时间来做这个算法,还是感谢各位热心回复,也贴上我的最终结果:

public class Main
    {
        /// <summary>
        /// 笛卡尔乘积的递归方法
        /// </summary>
        /// <param name="result">结果</param>
        /// <param name="data">数据集</param>
        /// <param name="level">递增维度</param>
        /// <param name="path">中间值</param>
        static void Recursive(List<string> result, List<List<string>> data, int level, string path)
        {
            if (level >= data.Count)
            {
                result.Add(path);
                return;
            }
            foreach (var item in data[level])
                Recursive(result, data, level + 1, path == null ? item : path + "-" + item);
        }

        public void Go()
        {
            List<List<string>> data = new List<List<string>>();

            List<string> dataItem1 = new List<string>();
            dataItem1.Add("Red");
            dataItem1.Add("Blue");
            data.Add(dataItem1);

            List<string> dataItem2 = new List<string>();
            dataItem2.Add("S");
            dataItem2.Add("M");
            dataItem2.Add("L");
            data.Add(dataItem2);

            List<string> dataItem3 = new List<string>();
            dataItem3.Add("Man");
            dataItem3.Add("Woman");
            data.Add(dataItem3);

            List<string> result = new List<string>();
            Recursive(result, data, 0, null);

            foreach (var s in result)
                System.Console.WriteLine(s);
        }

    }//end class
xuzuning 2016-08-23
  • 打赏
  • 举报
回复
求笛卡尔积,一般用递归
引用 14 楼 twotuli_software 的回复:
锻炼下思想嘛。万一改用java实现呢。
维秀斯丢丢 2016-08-23
  • 打赏
  • 举报
回复
锻炼下思想嘛。万一改用java实现呢。
摇撼大地 2016-08-23
  • 打赏
  • 举报
回复
引用 12 楼 twotuli_software 的回复:
我觉得大家不能以来就用 .net自带的 算法。 要自己看如何实现,利用c#.
不要重复发明轮子。 不过你说的也没错呢。 但是他们用的.net基础类库的方法,其实都不很复杂。只是把一些模式化的工作简化了而已。 Linq完全可以用for循环来做。但是非要自己弄就很没有意义了呢。。。。。 lambda表达式也可以自己做一个委托。但是那样写起来的代码长的吓死人呢。反正两个写法生成的IL代码都一样的。干嘛不简单一点呢。
维秀斯丢丢 2016-08-23
  • 打赏
  • 举报
回复
我觉得大家不能以来就用 .net自带的 算法。 要自己看如何实现,利用c#.
摇撼大地 2016-08-23
  • 打赏
  • 举报
回复
引用 9 楼 luck0235 的回复:
项目中是一个Javascript的实现,我尝试下怎么用for循环来实现,TKS starfd .
引用 8 楼 lyj224170707 的回复:
别问为什么。。就是这么任性。。多少组都可以。。算法不用改


       class item
        {
            public string name { get; set; }
            public int level { get; set; }
        }

        static void Main(string[] args)
        {
            List<item> all = new List<item>();
            all.Add(new item { name = "Red", level = 0 });
            all.Add(new item { name = "Blue", level = 0 });

            all.Add(new item { name = "S", level = 1 });
            all.Add(new item { name = "M", level = 1 });
            all.Add(new item { name = "L", level = 1 });

            all.Add(new item { name = "Man", level = 2 });
            all.Add(new item { name = "Woman", level = 2 });
            var r = all.GroupBy(x => x.level)
                       .Select(x => x.Select(y => y.name))
                       .Aggregate((a, b) => a.SelectMany(x => b.Select(y => x + "-" + y)))
                       .ToList();
        }

鼓掌~~~Aggregate我还是不太会用呢
游离失所 2016-08-22
  • 打赏
  • 举报
回复
想到笛卡尔积,首先想到SelectMany。 想到多个组合而成,自然就想到Aggregate。 一句话就能搞定的问题
luck0235 2016-08-22
  • 打赏
  • 举报
回复
项目中是一个Javascript的实现,我尝试下怎么用for循环来实现,TKS starfd .
游离失所 2016-08-22
  • 打赏
  • 举报
回复
别问为什么。。就是这么任性。。多少组都可以。。算法不用改


       class item
        {
            public string name { get; set; }
            public int level { get; set; }
        }

        static void Main(string[] args)
        {
            List<item> all = new List<item>();
            all.Add(new item { name = "Red", level = 0 });
            all.Add(new item { name = "Blue", level = 0 });

            all.Add(new item { name = "S", level = 1 });
            all.Add(new item { name = "M", level = 1 });
            all.Add(new item { name = "L", level = 1 });

            all.Add(new item { name = "Man", level = 2 });
            all.Add(new item { name = "Woman", level = 2 });
            var r = all.GroupBy(x => x.level)
                       .Select(x => x.Select(y => y.name))
                       .Aggregate((a, b) => a.SelectMany(x => b.Select(y => x + "-" + y)))
                       .ToList();
        }

摇撼大地 2016-08-22
  • 打赏
  • 举报
回复
晚上回去我也写一个。看看能不能实现。下班喽~~~
摇撼大地 2016-08-22
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
List<item> all = new List<item>();
all.Add(new item { name = "Red", level = 0 });
all.Add(new item { name = "Blue", level = 0 });

all.Add(new item { name = "S", level = 1 });
all.Add(new item { name = "M", level = 1 });
all.Add(new item { name = "L", level = 1 });

all.Add(new item { name = "Man", level = 2 });
all.Add(new item { name = "Woman", level = 2 });

var gps = all.GroupBy(i => i.level).ToList();
var result = gps[0].Select(i => i.name).ToList();
for (var j = 1; j < gps.Count; j++)
{
    result = (from r in result
                from t in gps[j]
                select r + "-" + t.name).ToList();
}
foreach (var r in result)
{
    Console.WriteLine(r);
}
鼓掌。不过我更喜欢用.方法调用Linq。感觉sql语句形式的理解不能。。。。。
维秀斯丢丢 2016-08-22
  • 打赏
  • 举报
回复
public static List<List<T>> CartesianProduct<T>(this List<List<T>> lstSplit)
        {
            int count = 1;
            lstSplit.ForEach(item => count *= item.Count);
            //count = lstSplit.Aggregate(1, (result, next) => result * next.Count);
            var lstResult = new List<List<T>>();
            for (int i = 0; i < count; ++i)
            {
                var lstTemp = new List<T>();
                int j = 1;
                lstSplit.ForEach(item =>
                {
                    j *= item.Count;
                    lstTemp.Add(item[(i / (count / j)) % item.Count]);
                });
                lstResult.Add(lstTemp);
            }
            return lstResult;
        }
  • 打赏
  • 举报
回复
List<item> all = new List<item>();
all.Add(new item { name = "Red", level = 0 });
all.Add(new item { name = "Blue", level = 0 });

all.Add(new item { name = "S", level = 1 });
all.Add(new item { name = "M", level = 1 });
all.Add(new item { name = "L", level = 1 });

all.Add(new item { name = "Man", level = 2 });
all.Add(new item { name = "Woman", level = 2 });

var gps = all.GroupBy(i => i.level).ToList();
var result = gps[0].Select(i => i.name).ToList();
for (var j = 1; j < gps.Count; j++)
{
    result = (from r in result
                from t in gps[j]
                select r + "-" + t.name).ToList();
}
foreach (var r in result)
{
    Console.WriteLine(r);
}
mislrb 2016-08-22
  • 打赏
  • 举报
回复
建议将这些建成表格T1,T2,T3,....., 然后写个动态存储过程判断T开头的表格有几个,然后用无连接的select语句如:select a.idxcode,b.code,c.code from bomdb.dbo.Process a,bomdb.dbo.defcode b,bomdb.dbo.causecode c即可得到所有可能的组合了,仅供参考
luck0235 2016-08-22
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
这东西就是笛卡尔乘积…… Linq完美支持 首先你的代码都是同一个类,只是通过level 进行区分,所以首先就是list.GroupBy(r=>r.level ) 然后就是foreach进行linq的笛卡尔乘积
请给实现代码,谢谢
  • 打赏
  • 举报
回复
这东西就是笛卡尔乘积…… Linq完美支持 首先你的代码都是同一个类,只是通过level 进行区分,所以首先就是list.GroupBy(r=>r.level ) 然后就是foreach进行linq的笛卡尔乘积
作者:July、阿财。 时间:二零一一年十月十三日。 ------------------------------ 无私分享造就开源的辉煌。 今是二零一一年十月十三日,明日14日即是本人刚好开博一周年。在一周年之际,特此分享出微软面试 全部100题答案的完整版,以作为对本博客所有读者的回馈。 一年之前的10月14日,一个名叫July 的人在一个叫csdn 的论坛上开帖分享微软等公司数据结构+算法 面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之法 算法之道的编程面试与算法研究并重的博客,如今,此博客影响力逐步渗透到海外,及至到整个互联网。 在此之前,由于本人笨拙,这微软面试100题的答案只整理到了前60题(第1-60题答案可到本人资源下 载处下载:http://v_july_v.download.csdn.net/),故此,常有朋友留言或来信询问后面40题的答案。只是 因个人认为:一、答案只是作为一个参考,不可太过依赖;二、常常因一些事情耽搁(如在整理最新的今年 九月、十月份的面试题:九月腾讯,创新工场,淘宝等公司最新面试十三题、十月百度,阿里巴巴,迅雷搜狗 最新面试十一题);三、个人正在针对那100题一题一题的写文章,多种思路,不断优化,即成程序员编程 艺术系列。自此,后面40题的答案迟迟未得整理。且个人已经整理的前60题的答案,在我看来,是有诸多问 题与弊端的,甚至很多答案都是错误的。 互联网总是能给人带来惊喜。前几日,一位现居美国加州的名叫阿财的朋友发来一封邮件,并把他自己 做的全部100题的答案一并发予给我,自此,便似遇见了知己。十分感谢。 任何东西只有分享出来才更显其价值。本只需贴出后面40题的答案,因为前60题的答案本人早已整理上 传至网上,但多一种思路多一种参考亦未尝不可。特此,把阿财的答案再稍加整理番,然后把全部100题的答 案现今都贴出来。若有任何问题,欢迎不吝指正。谢谢。 上千上万的人都关注过此100题,且大都都各自贡献了自己的思路,或回复于微软100题维护地址上,或 回复于本博客内,人数众多,无法一一标明,特此向他们诸位表示敬意和感谢。谢谢大家,诸君的努力足以影 响整个互联网,咱们已经迎来一个分享互利的新时代。 感谢诸君,请享用.....
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。 本视频由微软全球最有价值专家尹成录制,拒绝念PPT,代码实战数据结构与算法导论。除了传统数据结构算法,加入高并发线程安全数据结构,分布式负载均衡算法,分布式哈希表,分布式排序等等现代算法。  算法,晦涩难懂,却又是IT领域受重视的素养之一。可以说,算法能力往往决定了一个程序员能够走多远。因此,BAT/FLAG等国内外各大名企非常喜欢在面试环节考核求职者的算法编程,这也成为了无数准程序员们过不去的一道“坎”。如何入门并成为一名出色的算法工程师?但无论半路出家还是科班出身,除学生时代搞算法竞赛的同学外真正用心学习过算法与数据结构太少太少。对于后期想要学习算法与数据结构却不得不面对以下问题:没有自己的知识框架,无法关联知识点,学习效率低有疑问而无人解答,有问题无法理解全靠猜测,一个问题卡好几天市面上资料题解质量参差不齐,正确性未可知Google算法-工程师尹成大哥学习算法
精选微软等数据结构+算法面试100题答案修正V0.2版本 -------------------- 此份答案是针对,前期已公布的最初的那份答案的,初步校正与修正。 http://download.csdn.net/source/2796735(V0.1版) 相比第一份V0.1版答案,此份答案V0.2版更加准确,亦修正了不少题目的答案。 此份20题的答案,思路更加清晰易懂,简介明了。 请享用。July、2010/11/06。 其它资源,下载地址: 1.[最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案] http://download.csdn.net/source/2832862 2.[第1题-60题汇总]微软等数据结构+算法面试100题 http://download.csdn.net/source/2826690 3.[答案V0.2版]精选微软数据结构+算法面试100题[前20题]--修正 http://download.csdn.net/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 4.[答案V0.1版]精选微软数据结构+算法面试100题[前25题] http://download.csdn.net/source/2796735 5.[第二部分]精选微软等公司结构+算法面试100题[前41-60题]: http://download.csdn.net/source/2811703 6.[第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] http://download.csdn.net/source/2778852 更多资源,下载地址: http://v_july_v.download.csdn.net/ ------------------------------------------------------ 各位,若对以上100题任何一道,或对已上传的任何一题的答案, 有任何问题,请把你的思路、想法,回复到此帖子上, 微软等100题系列,永久维护地址(2010年11.26日): http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html

110,545

社区成员

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

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

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