我需要迭代每个可能的元素组合(重复),最多n个元素。
我找到了解决此问题的多种解决方案。但所有这些都是递归地生成每个可能组合的集合,然后迭代它。虽然这是有效的,但对于大型元素集合和组合大小,它会导致大量内存使用,所以我正在寻找一种解决方案,允许我从前一个组合计算下一个组合,知道元素数量和组合的最大大小。
这是否可行,是否有任何特定的算法可以在这里工作?
答案 0 :(得分:2)
生成组合,以便对每个组合进行排序。 (这假设元素本身可以很容易地按顺序排列。只要它是一个总订单,精确的排序关系并不重要。)
从包含 n 重复最小元素的组合开始。从任何给定组合产生下一个组合:
向后扫描,直到找到不是最大元素的元素。如果你找不到,那就完成了。
将该元素和所有后续元素替换为该元素的下一个较大元素。
如果您希望所有长度的组合达到 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