Algorithm 最小乘法与集合覆盖问题
我有一个集合I={P1,P2,…,Pm},和I的n个有限子集,由R1,R2,…,Rn表示,如下所示: R1={P1,P2} R2={P2,P4} R3={P2,P3,P4} R4={P1,P2,P4} 其中Pi表示一个整数 对于每个Ri,我想计算它所有元素的乘积。 我的目标是通过在Ri(i=1,2,…,n)之间共享一些公共部分,尽可能少地使用多重化和分割 例如,如果我可以先计算P2*P4,那么这个结果可以用于计算R3和R4的所有元素的乘积 注意,除法也是允许的。例如,我可以先计算A=P1*P2*P3*P4,然后使用A/P1计算R3的所有元素的乘积,使用A/P3计算R4 如果我想使用最小乘法和除法来计算I的每个子集的所有乘积,这是一个集合覆盖问题吗?NP完全?顺便说一句,你能给出一个整数线性规划公式来描述它吗 如有任何建议,将不胜感激 社区编辑:添加假设:Algorithm 最小乘法与集合覆盖问题,algorithm,set,np-complete,linear-programming,set-cover,Algorithm,Set,Np Complete,Linear Programming,Set Cover,我有一个集合I={P1,P2,…,Pm},和I的n个有限子集,由R1,R2,…,Rn表示,如下所示: R1={P1,P2} R2={P2,P4} R3={P2,P3,P4} R4={P1,P2,P4} 其中Pi表示一个整数 对于每个Ri,我想计算它所有元素的乘积。 我的目标是通过在Ri(i=1,2,…,n)之间共享一些公共部分,尽可能少地使用多重化和分割 例如,如果我可以先计算P2*P4,那么这个结果可以用于计算R3和R4的所有元素的乘积 注意,除法也是允许的。例如,我可以先计算A=P1*P2
- 允许分割,与乘法的成本相同
- 给定集合中没有重复的元素。e、 g.
是不允许的R5={P1,P1,P1,P2}
首先,你不需要除法 这里不需要除法,它总是一个额外的计算 如果需要分割,则表示您已经执行了多次操作,因此,如果分割,将撤消您已经完成的工作 例如,如果您通过将Pi*Pj*Pk*Pn除以Pn来计算Pi*Pj*Pk,这意味着您之前计算了Pi*Pj*Pk*Pn,因此您之前计算了Pi*Pj*Pk (我假设你所有的数字都是素数) 我的解决方案 我有一个想法,没有考虑到分裂的可能性 你可以开始用你的Ri建立一个 那么乘法的数目就是树中的边的数目 示例: 使用您的示例,后缀树将是:
P2
/ \
P4 P1
/ \
P3 P1
得到4个乘法:
M1=P1*P2
M2=P2*P4
M3=M2*P1
M4=M2*P3
求最小乘法数相当于用最小边数构建后缀树
希望这能有所帮助。考虑一个元素Ri的图形,没有边。现在,我们可以按如下方式添加边:
- 在Ra之间添加定向边→Rb,用商Rb/Ra注释
log(log(log(…log(n)))
)慢);甚至可能在边的数量上存在随机线性时间算法,例如,因此此基本算法将花费| R | 2时间
然而,如果你只使用中间结果,你就失去了真正的最佳答案,因为我们有可能使用“即兴”表达来获得更好的表现。例如,您可能会考虑这种情况:
R1 = {P2, P3, P4, P5}
R2 = {P1, P3, P4, P5}
R3 = {P1, P2, P4, P5}
R4 = {P1, P2, P3, P5}
R5 = {P1, P2, P3, P4}
最佳解决方案是计算P1*P2*P3*P4*P5
,然后除以Pi,得到9个运算。而上面的方法只会执行类似R1=P2*P3*P4*P5的操作,然后每次执行乘法和除法以转到R1→R2,R2→R3,R3→R4,R4→R5,导致11次操作。(如果我们没有除法,我们也会有9个运算:b=P1*P2 c=b*P3 r5=c*P4 r4=c*P5,d=P4*P5,r3=b*d,e=P3*d,r1=e*P2,r2=e*P1。虽然我认为可能会造成需要除法的情况,但似乎找不到除法;如果我找不到除法,这可能是一个简单的多项式时间问题。)
我将这种方法称为“即兴表达”方法。如果我们选择计算一个即兴表达式(一开始是一个沉没成本),这将减少所有未来计算的成本,以便在我们选择使用它时遍历一条边(因为可能有选择使用多少个即兴表达式)
这给我们带来了一个非常小的旁注:
Theorem:
You should have at least one intermediate expression of each
length up to the maximum size of any R.
Proof (induction):
To build up a product of size N, you will need to do
have a product of size N-1.
注意到这个定理,我们发现上面有点错误。最佳解决方案是在计算P1*P2*P3*P5
的过程中记住P1*P2*P3*P4
。然后我们可以免费获得R5
(和R4
,只需通过另一种方法进行一次乘法,不幸的是,成本与以前相同),将总成本从9降低到8。这让我们猜测,在很长一段时间后,使用任意边执行可能也会产生最优解
无论如何,我们如何将这样一个系统整合到我们的解决方案中?我们不能添加一个节点,因为那样会弄乱MST算法。对于每个边,乘以或除以临时表达式E不会使某些P的幂P大于P(例如,对于P=2,我们允许使用中间临时表达式来创建产品,如P1*P4^2/P3
,但不允许类似P2^3
),我们在边上执行乘法和除法,并创建两条新边。(我们可能会不止一次这样做,或者在将来的某个日期)我们也会对边缘的所有子集这样做,我们会像上面那样回忆。如果使用MST算法,这种方法的代价是边的数量大幅增加,因此可能(| R |+#newedges)2=(|R | ^ | P |)2可能在更坏的情况下,显著增加了找到最佳答案所需的时间
因此,作为猜测,更一般的问题似乎是NP难问题;如果不是这样,请有人插话。不过,您可能可以使用heuris