通过重复迭代每个元素组合而不生成整个集合

时间:2018-01-17 13:24:34

标签: algorithm iteration combinations

我需要迭代每个可能的元素组合(重复),最多n个元素。

我找到了解决此问题的多种解决方案。但所有这些都是递归地生成每个可能组合的集合,然后迭代它。虽然这是有效的,但对于大型元素集合和组合大小,它会导致大量内存使用,所以我正在寻找一种解决方案,允许我从前一个组合计算下一个组合,知道元素数量和组合的最大大小。

这是否可行,是否有任何特定的算法可以在这里工作?

1 个答案:

答案 0 :(得分:2)

生成组合,以便对每个组合进行排序。 (这假设元素本身可以很容易地按顺序排列。只要它是一个总订单,精确的排序关系并不重要。)

从包含 n 重复最小元素的组合开始。从任何给定组合产生下一个组合:

  1. 向后扫描,直到找到不是最大元素的元素。如果你找不到,那就完成了。

  2. 将该元素和所有后续元素替换为该元素的下一个较大元素。

  3. 如果您希望所有长度的组合达到 n ,请为每个长度运行该算法,直到 n 。或者从包含空槽的向量开始,并使用上述算法,并理解"下一个更大的元素"在空槽之后是最小元素。

    示例:长度3的3个值:

    1 1 1
    1 1 2
    1 1 3
    1 2 2
    1 2 3
    1 3 3
    2 2 2
    2 2 3
    2 3 3
    3 3 3