比较整数列表的两个乘积?


10

假设我有两个经度正整数的列表,并且取每个列表的所有元素的乘积。确定哪个产品更大的最佳方法是什么?

当然,我可以简单地计算每个乘积,但是我希望有一种更有效的方法,因为乘积中的位数将随着项的数量线性增加,因此整个计算是二次的。

如果我要添加而不是相乘,则可以使用“压缩策略”,即从第一个列表中增量添加项,然后从第二个列表中减去,从而避免了计算(大)总和的需求。产品的类似技术将是对条目的对数求和,但是现在的问题是,计算对数需要使用不精确的算法。除非有某种方法可以证明数值误差无关紧要?


如果我们知道最大整数值并且该值与n(即常数k)无关,则可以制作一个查找表,列出从1到k的所有数字的因数。现在,我想如果您将所有内容都写成基数[因数的乘积],则它会变成线性的,因为您可以用该基数以线性时间计算乘积,然后依次比较每个数字(从最高位开始),直到一个大于另一个。细节有些棘手,但如果k为常数,那应该可以。
菲利达

0nmC(m,m)+C(m,2m)+...+C(m,(n1)m)C(x,y)xy


天真的方法的改进:计算每个因子的出现次数(以线性时间为单位),并使用有效的赋能算法仅计算最后的乘积。这在时间起作用,即O nO(M(n))采用当前渐近最快的方法。O(nlogn2O(logn))
埃米尔·杰拉贝克(EmilJeřábek)'17

2
我会考虑所需的日志准确性。实际上可能更有效。
埃米尔·杰拉贝克(EmilJeřábek),

Answers:


6

(我了解问题的描述,因此输入数字受常数限制,因此我不会跟踪对界限的依赖性。)

使用对数和可以在线性时间和对数空间中解决该问题。更详细地,算法如下:

  1. 使用二进制计数器,对两个列表中每个可能的输入数字的出现次数进行计数。

O(n)O(logn)n

p1,,pkO(1)aaO(logn)

  1. β1,,βkO(logn)Λ:=i=1kβilogpi

  2. β1==βk=0

Λ0

|Λ|>2Clogn
CΛ
  1. i=1kβiπiπilogpim:=Clogn+k+1

M(m)mM(m)=O(mlogm2O(logm))O(m2)logpimO(M(m)logm)iβiπiO(M(m))O(M(m)logm)O(lognpoly(loglogn))

O(n)


谢谢!稍后,我将不得不处理所有细节,但这似乎很有希望!
user168715
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.