2017-02-07 18 views
0
unsigned int gcd(unsigned int n, unsigned int m) 
{ 
if (n == 0) 
    return m; 
if (m == 0) 
    return n; 

while (m! = n) 
{ 
if (n > m) 
    n = n − m; 
else 
    m = m − n; 
} 
return n; 
} 

whileループを使用する反復GCDアルゴリズムのためのいくつかの擬似コード。私は2で割り切れる場所がないので、対数ではないと思います。 whileループはNに正比例する時間実行されるので、O(N)のように線形になりますか?GCDアルゴリズムの実行時間?

+0

これはバイナリGCDアルゴリズムの実装が壊れているようです:https://en.wikipedia.org/wiki/Binary_GCD_algorithm正しく実装されていると、O(log(m + n))ですが、これはO(m + n) –

+0

@MattTimmermansアルゴリズムクラスで宿題を作るために、故意に非効率的なように壊れていると私を殴ることはありません。 –

+0

@MattTimmermansそれはO(m + n)ですが、それは緊密な境界ではありません。 O((m + n)/ gcd(m、n))はより良い結びつきですが、私はそれもきついとは思いません。 –

答えて

1

私はbig-Oがn対mの対称でなければならないので、アルゴリズムはO(max(n,m))だと言います。 @PaulHankinはこれをO(max(n,m)/gcd(n,m))に改善しました。

+0

O(max(n、m))が関数の対称性に従うのはなぜですか?たとえば、gcd(n、kn)はO(k)時間で実行され、O(kn)では実行されないので、確かにタイトバインドではありません。 O(max(n、m)/ gcd(n、m))はより良い試行ですが、タイトではありません。 –

+0

ええ、O(max(n、m)/ gcd(n、m))は素晴らしいです。なぜそれはタイトではないと思いますか?私はO(max(n、m))が対称性に従うと言っているわけではありませんでした。アルゴリズムはnとmに対して対称であるので、Oも対称でなければならないと言っていました。 –

+0

gcd(fib(n)、fib(n + 1))はO(n)時間で実行されますが、gcd(fib(n)、fib(n + 1))= 1およびfib +1)は指数関数的にnより大きい。 (ここで、fib(k)= kthフィボナッチ数)。 –

関連する問題