以下功能的时间复杂度

时间:2016-08-22 05:34:26

标签: c++ algorithm time-complexity big-o

在下面的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),但我没有得到如何计算?

2 个答案:

答案 0 :(得分:3)

在每次迭代中,n的值平均降低黄金比例。我建议尝试解决最坏的情况,它应该是n

的基数1.618

有关详细信息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循环的这两种可能性:

  1. 在下面给出的循环中,此循环的复杂性为O(n) 因为算法与输入n成比例增长:

    while (n > 0) {
        n = n-1;
        ...
    }
    
  2. 然而在下面给出的循环中,因为有一个嵌套循环,所以 时间是O(n^2)

    while(n>0) {
        n = n-1;
        while(m>0) {
            m = m-1;
            ...
        }
    }
    
  3. 但是,在您提供的算法中,您不是 遍历每个mn的循环;相反,你很简单 使用分而治之的方法,你只是探索部分 循环中的整个n。在每次迭代中,n的值 并不是只减少1因子,而是减少比例:

    while (m > 0) {
        n = n%m;
        swap(n, m);
    }