[解決済み] ユークリッド・アルゴリズムの時間計算量
2022-10-12 18:10:03
質問
ユークリッドの最大公約数アルゴリズムの時間計算量がどの程度か判断に迷っています。このアルゴリズムを擬似コードで表すと
function gcd(a, b)
while b ≠ 0
t := b
b := a mod b
a := t
return a
に依存しているようです。 a と b . 私の考えでは、時間の複雑さはO(a % b)です。これは正しいのでしょうか?もっと良い書き方があるのでしょうか?
どのように解決するのですか?
ユークリッドのアルゴリズムの時間複雑性を分析する一つのコツは、2回の繰り返しで何が起こるかを追うことです。
a', b' := a % b, b % (a % b)
これでaとbが片方だけでなく両方減ることになり、解析がしやすくなりました。ケースに分けることができます。
-
小さなA
2a <= b
-
タイニーB
2b <= a
-
スモールA
2a > b
しかしa < b
-
スモールB
2b > a
しかしb < a
-
イコール
a == b
今度は、すべてのケースで合計が減少することを示します。
a+b
を少なくとも 4 分の 1 減少させることを示します。
-
タイニーA
b % (a % b) < a
そして2a <= b
というようにb
は少なくとも半分に減少するのでa+b
は少なくとも25%
-
タイニーB
a % b < b
そして2b <= a
というようにa
は少なくとも半分に減少するのでa+b
は少なくとも25%
-
小さいA
b
になります。b-a
よりも小さい。b/2
を減少させるa+b
を少なくとも25%
. -
スモールB
a
になります。a-b
よりも小さい。a/2
を減少させるa+b
を少なくとも25%
. -
イコール
a+b
に低下します。0
となり、明らかに減少しています。a+b
を少なくとも25%
.
したがって、ケース分析によって、すべてのダブルステップが減少します。
a+b
を少なくとも
25%
. この現象が起きる回数には上限があります。
a+b
を下回るよう強制されます。
1
. 総ステップ数(
S
) を満たす必要があります。
(4/3)^S <= A+B
. あとはそれを実行するだけです。
(4/3)^S <= A+B
S <= lg[4/3](A+B)
S is O(lg[4/3](A+B))
S is O(lg(A+B))
S is O(lg(A*B)) //because A*B asymptotically greater than A+B
S is O(lg(A)+lg(B))
//Input size N is lg(A) + lg(B)
S is O(N)
つまり、反復処理の回数は入力桁数に対して線形になります。CPUのレジスタに収まるような数であれば、反復に一定の時間がかかるとモデル化して 合計 の実行時間は線形であるかのように装います。
もちろん、大きな整数を扱う場合は、各反復内のモジュラス演算が一定のコストではないという事実を考慮する必要があります。大雑把に言うと、漸近的な実行時間の合計は n^2 x ポリロガス係数になります。
のような
n^2 lg(n) 2^O(log* n)
. ポリロガス的な要素を避けるには、代わりに
バイナリgcd
.
関連
-
[解決済み] バックトラッキングとダイナミックプログラミングの違い
-
[解決済み] ラジアンを度数に変換する方法は?
-
[解決済み] あるアルゴリズムの計算量がO(log log n)になる原因は何でしょうか?
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み] ヒープの構築はどうして時間計算量O(n)になるのですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】アルゴリズムの時間複雑性を求めるには?
-
[解決済み】big-O時間複雑度の高いアルゴリズムが低いアルゴリズムより好ましいと思うケースはありますか?
-
[解決済み] Dijkstraのアルゴリズムによる負の重み付け
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クイックソートとヒープソートの比較
-
[解決済み] アルゴリズム設計マニュアル』の解答はどこにあるのですか?[終了しました]
-
[解決済み] DFS-Forest Componentとは?
-
[解決済み] Octave : ロジスティック回帰 : fmincg と fminunc の違い
-
[解決済み] ベルマンフォードとダイクストラの比較。どのような状況下でベルマンフォードが優れているか?
-
[解決済み] CLRSの相対的漸近成長に関する問題(表)の解き方について教えてください。
-
[解決済み] 与えられた数列の中に現れない最小の正の整数を求めよ。
-
[解決済み] 再帰と反復
-
[解決済み] アルゴリズム設計マニュアル』の解答はどこにあるのですか?[クローズド]
-
[解決済み] 浮動小数点数を読みやすい分数に変換するには?