我不知道也不能找到一种算法来按字典顺序生成k项(即k子集)的组合。我知道算法生成n选择k的组合,但他们不会按字典顺序生成k子集。
有人可以帮我解决这个问题,还是指出我正确的方向?
答案 0 :(得分:1)
以下算法将生成集合的所有元素组合:
procedure all_combinations(S)
if length(S) == 0
return {}
else
all_comb = {}
x = first element of S
Sx = S-{x}
for each C in all_combinations(Sx)
all_comb += C
all_comb += {x} ∪ C
return all_comb
对于集合{1,2,3},此算法可以...
all_combinations({2,3})
all_combinations({3})
all_combinations({}),返回{}
all_combinations({3})返回{{},{3}}
all_combinations({2,3})返回{{},{2},{3},{2,3}}
all_combinations({1,2,3})返回{{},{1},{2},{1,2},{3},{1,3},{2,3},{1 ,2,3}}
答案 1 :(得分:0)
此算法基本上使用一些简单的规则来确定组合中的下一个标记:假设大小为N
的集合n
和迄今为止填充的未完成组合C
{ {1}}个元素(搜索的组合长度为c < k
)。现在k
必须位于(包括两者)C[c + 1]
之间的范围内(每个元素必须高于上一个元素以确保顺序)和N[indexOf(C[c]) + 1]
(有N[k - c + 1]
个空格对于剩余的元素,它们必须高于它们之前的元素)。使用这个我们可以非常容易地递归生成组合:
k - (c - 1)
注意: