在下面的C ++函数中,设n> = m。
int gcd(int n, int m) {
if (n%m ==0) return m;
if (n < m) swap(n, m);
while (m > 0) {
n = n%m;
swap(n, m);
}
return n;
}
假设n> 1,上述函数的时间复杂度是多少? M& 对这个问题的回答是O(log n),但我没有得到如何计算?
答案 0 :(得分:3)
在每次迭代中,n
的值平均降低黄金比例。我建议尝试解决最坏的情况,它应该是n
有关详细信息https://en.wikipedia.org/wiki/Euclidean_algorithm,其中注意到“如果欧几里德算法需要N个步骤来表示一对自然数a> b> 0,那么a和b的最小值是斐波那契数字分别为F(N + 2)和F(N + 1)。“
e.g。如果从Fib(n + 2)和Fib(n + 1)开始,则在下一次迭代时将得到Fib(n)和Fib(n + 1),直到你停在1。
答案 1 :(得分:0)
首先考虑while
循环的这两种可能性:
在下面给出的循环中,此循环的复杂性为O(n)
因为算法与输入n成比例增长:
while (n > 0) {
n = n-1;
...
}
然而在下面给出的循环中,因为有一个嵌套循环,所以
时间是O(n^2)
。
while(n>0) {
n = n-1;
while(m>0) {
m = m-1;
...
}
}
但是,在您提供的算法中,您不是
遍历每个m
或n
的循环;相反,你很简单
使用分而治之的方法,你只是探索部分
循环中的整个n
。在每次迭代中,n
的值
并不是只减少1
因子,而是减少比例:
while (m > 0) {
n = n%m;
swap(n, m);
}