如果对数组进行排序,是否有可能对用于获取数组中数字的gcd的任何算法进行一些优化? 谢谢!
答案 0 :(得分:1)
那么,让我们看看。查找数字数组的GCD的一般方法是:
result = a[0]
for i = 1 to length(a)-1
result = gcd(result, a[i])
那么gcd算法的复杂性是什么?好吧,这是一个相当复杂的问题。例如,参见Time complexity of Euclid's Algorithm
如果我们假设接受的答案中假设GCD算法是恒定时间(即O(1)),则上述循环的复杂度为O(n)。对于适合计算机寄存器的数字,这是一个合理的假设。如果是这种情况,那么花O(n log n)的时间对数组进行排序几乎肯定会失败。
但是实际上,GCD的计算是两个数字中数字的线性关系。如果您的输入数据包含大量数字,则可能首先对数组进行排序将为您带来好处。原因是gcd(a, b)
的结果根据定义将为您提供一个不大于min(a,b)
的数字。因此,通过首先获取两个最小数字的GCD,可以限制必须处理的位数。这种限制是否会克服对数组排序的成本尚不清楚。
如果数字大于计算机寄存器可以容纳的位数(几百个数字),则GCD计算会更昂贵。但是话又说回来了。
因此,您的问题的答案是排序几乎可以肯定会提高计算数字数组的GCD的速度,但是性能的提高是否可以抵消排序的成本尚不清楚。
我认为您唯一可以确定的方法就是使用代表性数据进行测试。