按字典顺序生成k组合

时间:2015-07-29 08:57:46

标签: algorithm language-agnostic combinations

我不知道也不能找到一种算法来按字典顺序生成k项(即k子集)的组合。我知道算法生成n选择k的组合,但他们不会按字典顺序生成k子集。

有人可以帮我解决这个问题,还是指出我正确的方向?

2 个答案:

答案 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)

注意:

  • 此实现假定基于0的arrayindices
  • 如果输入是按顺序
  • ,则结果仅按字典顺序排序