假设我有两个经度正整数的列表,并且取每个列表的所有元素的乘积。确定哪个产品更大的最佳方法是什么?
当然,我可以简单地计算每个乘积,但是我希望有一种更有效的方法,因为乘积中的位数将随着项的数量线性增加,因此整个计算是二次的。
如果我要添加而不是相乘,则可以使用“压缩策略”,即从第一个列表中增量添加项,然后从第二个列表中减去,从而避免了计算(大)总和的需求。产品的类似技术将是对条目的对数求和,但是现在的问题是,计算对数需要使用不精确的算法。除非有某种方法可以证明数值误差无关紧要?
如果我们知道最大整数值并且该值与n(即常数k)无关,则可以制作一个查找表,列出从1到k的所有数字的因数。现在,我想如果您将所有内容都写成基数[因数的乘积],则它会变成线性的,因为您可以用该基数以线性时间计算乘积,然后依次比较每个数字(从最高位开始),直到一个大于另一个。细节有些棘手,但如果k为常数,那应该可以。
—
菲利达
天真的方法的改进:计算每个因子的出现次数(以线性时间为单位),并使用有效的赋能算法仅计算最后的乘积。这在时间起作用,即O (n采用当前渐近最快的方法。
—
埃米尔·杰拉贝克(EmilJeřábek)'17
我会考虑所需的日志准确性。实际上可能更有效。
—
埃米尔·杰拉贝克(EmilJeřábek),