按产品计算组合

时间:2013-09-01 16:44:17

标签: enumeration combinatorics

我有三个列表a,b,c。每个列表都按排序顺序包含多个整数。

为了举例,请:

a = [2, 2, 7]
b = [4, 6, 9]
c = [3, 6, 8]

我的目标是按递增顺序列举三个列表中所有可能的元素产品。

最小产品当然是a[0]*b[0]*c[0]。在该示例中,第二低的产品是a[0]*b[1]*c[0]。等等。

我正在尝试为任意数量的列表找到一般解决方案。我很难概括从第k个最低产品到(k + 1)最低产品的步骤。

我不想枚举所有可能的产品然后对它们进行排序,因为我正在处理可能非常大量的列表,并且可能只对例如前1000种组合感兴趣。

任何帮助都将受到赞赏,包括教科书指南。

1 个答案:

答案 0 :(得分:0)

假设我们希望时间复杂度为O(N * K),其中N是列表数量,KK - 产品。 我们在每个列表的开头都维护一个指针(为简单起见,我将这个P[i] - i指向列表iL[i] - {{1} }'列表)。

每个列表最初i(因为我们开始从0开始索引列表)

P[i] = 0:第一个产品是Step 1

L[0][P[1]] * L[1][P[2]] * .. L[N][P[N]]:对于下一步,我们有兴趣尽量减少下一个产品。 我们选择Step 2j (0<=j<=N)最少的L[j][P[j] + 1]。我们将P[j]增加1,然后转到Step 1以计算下一个产品。我认为很明显,下一个产品应该是所有可能性中的最小值。

如果您想计算独特产品的数量,您只需维护一个计数器,只有当前产品与前一产品不同时才会递增。

您仍然可以使用优先级队列将此算法改进为O(log(N) * K),以便在Step 2获得最小值。