在排序数组上计算 GCD
Computing GCD on sorted array
如果数组已排序,是否可以对用于获取数组中数字的 gcd 的任何算法进行一些优化?
谢谢!
所以,让我们看看。查找数字数组的 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 的速度,但性能提升是否会抵消排序的成本尚不清楚。
我认为您可以确定的唯一方法是使用具有代表性的数据进行测试。
如果数组已排序,是否可以对用于获取数组中数字的 gcd 的任何算法进行一些优化? 谢谢!
所以,让我们看看。查找数字数组的 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 的速度,但性能提升是否会抵消排序的成本尚不清楚。
我认为您可以确定的唯一方法是使用具有代表性的数据进行测试。