.net - 构建 List<string> 的所有可能的排序组合

标签 .net algorithm sorting combinations

我有一个 .Net 列表,我想知道最(或“合理地”接近)有效的方法是以下列方式组合它们:

鉴于列表有 3 个元素(“A”、“B”和“C”),我基本上需要从方法返回以下内容:

  1. 一个
  2. B
  3. C
  4. A B
  5. A C
  6. BC
  7. 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/

相关文章:

c# - 如何跨项目和客户端自定义类库配置设置

algorithm - 梯度下降和爬山之间的行为差​​异

css - 如何通过组合选择器和值对 CSS 样式表进行排序

javascript - 根据 1 个特定值的标识将对象拆分为多个有序数组

arrays - 在使用递归的冒泡排序算法中记录交换次数?

c# - UWP - 内部编译器错误 : An item with the same key has already been added

.net - 如何使用 OpenXML 修改 word 超链接

c# - 我对C#线程池的理解正确吗?

algorithm - 一种随机放置圆圈至少相隔 D 距离的算法

algorithm - 在一个数组中进行二进制搜索,除了两个元素之外,所有元素都被排序,即所有元素都被排序,然后交换两个相邻元素?