我有三个列表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种组合感兴趣。
任何帮助都将受到赞赏,包括教科书指南。
答案 0 :(得分:0)
假设我们希望时间复杂度为O(N * K)
,其中N
是列表数量,K
是K
- 产品。
我们在每个列表的开头都维护一个指针(为简单起见,我将这个P[i]
- i
指向列表i
,L[i]
- {{1} }'列表)。
每个列表最初i
(因为我们开始从0开始索引列表)
P[i] = 0
:第一个产品是Step 1
。
L[0][P[1]] * L[1][P[2]] * .. L[N][P[N]]
:对于下一步,我们有兴趣尽量减少下一个产品。
我们选择Step 2
为j (0<=j<=N)
最少的L[j][P[j] + 1]
。我们将P[j]
增加1
,然后转到Step 1
以计算下一个产品。我认为很明显,下一个产品应该是所有可能性中的最小值。
如果您想计算独特产品的数量,您只需维护一个计数器,只有当前产品与前一产品不同时才会递增。
您仍然可以使用优先级队列将此算法改进为O(log(N) * K)
,以便在Step 2
获得最小值。