一尘不染

从数字列表中获取所有可能的组合

c#

我正在寻找一种有效的方法来实现这一目标:

  • 您有一个数字列表1 … n(通常:1..5或1..7左右-相当小,但因情况而异)

  • 您需要这些数字的所有长度的所有组合,例如,仅一个数字的所有组合({1},{2},.... {n}),然后是两个不同数字的所有组合({1,2}, {1,3},{1,4} ..... {n-1,n}),则这些数字中的三个数字的所有组合({1,2,3},{1,2,4})依此类推

基本上,在组中,顺序是无关紧要的,因此{1,2,3}等效于{1,3,2}-这只是从列表中获取所有x个数字组的问题

似乎应该有一个简单的算法可以解决这个问题-
但到目前为止,我一直徒劳地搜索。大多数组合和置换算法似乎a)考虑了顺序(例如123不等于132),并且它们似乎总是对单个字符串或数字进行操作…。

任何人都有一个很棒的,不错的’n’n’quick算法?

谢谢!


阅读 576

收藏
2020-05-19

共1个答案

一尘不染

只需增加一个二进制数并取与设置的位相对应的元素。

例如,00101101将意味着采用索引0、2、3和5的元素。由于列表仅为1..n,因此元素仅为索引+ 1。

这将产生有序的排列。换句话说,只会{1, 2, 3}生成。没有{1, 3, 2}{2, 1, 3}{2, 3, 1}

2020-05-19