我有一个 .Net 列表,我想知道最(或“合理地”接近)有效的方法是以下列方式组合它们:
鉴于列表有 3 个元素(“A”、“B”和“C”),我基本上需要从方法返回以下内容:
- 一个
- B
- C
- A B
- A C
- BC
- A B C
基本上,元素内部的顺序必须保持不变 (A > B > C) & 因此只有例如4.) 上面的 'A B' 是可能/应该返回的,但反过来 ('B A') 则不是。
我已经摆弄了一段时间了,但目前我的代码还很不优雅,但也许有人已经做过类似的事情并且知道如何正确/有效地做到这一点。
最佳答案
我能想到的生成这样集合的方式有3种:
元素的位表示 可以从1
开始迭代至 1 << length
(exclusivley) 并从设置位构建列表,在您的示例中:
1 001 {A}
2 010 {B}
3 011 {A, B}
4 100 {C}
5 101 {A, C}
6 110 {B, C}
7 111 {A, B, C}
列表的列表本身是有序的,当你以相反的方式进行时,即让最高位代表 A 而不是最低位。
二元递归 对列表的元素进行递归,在每个步骤中您沿着两条路径进行:包括当前元素或丢弃它。您将必须在递归时构建一个列表;处理完原始列表的所有元素后,将其添加到结果中。
这可能比每次都从位模式构建列表更有效。它还会生成空列表,您应该对其进行特殊处理。
填写以1 << length
开头空列表。将第一个元素放在后半部分的所有列表中。将第二个元素放在第二个和第四个季度的所有列表中。将每个列表中的第三个元素放在第二、第四、第六和第八个八分圆中。等等。这实际上只是递归方法的迭代变体,也会创建空列表。 (它也与位模式解决方案相关。)
关于.net - 构建 List<string> 的所有可能的排序组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562102/