数値の基本的な操作に一定の時間がかかると仮定するにはどうすればよいですか?


74

通常、アルゴリズムでは、数値の比較、加算、減算を気にしません-それらが時間実行されると仮定します。たとえば、比較ベースの並べ替えがであると言うときにこれを想定しが、数値が大きすぎてレジスタに収まらない場合、通常は配列として表現するため、基本操作には要素ごとに追加の計算が必要です。O n log n O(1)O(nlogn)

で2つの数値(または他のプリミティブな算術関数)の比較ができることを示す証拠はありますか?そうでない場合、比較ベースの並べ替えがと言っているのはなぜですか?O n log n O(1)O(nlogn)


SOの質問に答えたときにこの問題が発生し、遅かれ早かれbig-intを処理する必要があるため、アルゴリズムがはないことに気付きました。また、擬似多項式時間アルゴリズムではなく、でした。PO(n)P


3
数値の比較の複雑さを数える場合は、入力のビットサイズの観点から複雑さの境界も記述する必要があります。したがって、ビット数が与えられると、入力のビットサイズはあり、時間で並べ替えを行うことができます。w n = N w O N w log N = O n log n N wn=NwO(NwlogN)=O(nlogn)
サショニコロフ

2
複雑性の研究には、基本的に2つの「領域」または「体制」があります。一般に、演算は、固定幅演算に対して想定されます。これは、2〜4バイトの浮動小数点を含む固定幅の数値表現を持つほとんどのコンピューター言語の合理的な近似です(IEEE規格を参照)。次に、数値が任意のサイズであり、操作の複雑さをより注意深く/正確に研究する「任意精度演算」があります。前者のコンテキストは応用分析により多く、後者は理論的/抽象的分析により多くあります。O(1)
-vzn

回答:


75

私のように生計を立てるアルゴリズムを研究する人にとって、21世紀の計算の標準モデルは整数RAMです。このモデルは、チューリングマシンモデルよりも実際のコンピューターの動作をより正確に反映することを目的としています。実際のコンピューターは、並列ハードウェアを使用して、複数ビット整数を一定時間で処理します。任意の整数ではありませんが、(時間の経過とともに単語サイズが着実に増加するため)固定サイズの整数でもありません。

モデルは、単語サイズと呼ばれる単一のパラメーター依存します。各メモリアドレスは、単一のビット整数、またはwordを保持します。このモデルでは、入力サイズは入力内の単語の数であり、アルゴリズムの実行時間は単語に対する操作の数です。ワードに対する標準の算術演算(加算、減算、乗算、整数除算、剰余、比較)およびブール演算(ビットごとのand、or、xor、shift、rotate)は、定義により時間を必要としますw n O 1 wwnO(1)

正式にw、このモデルのアルゴリズムを分析するためのワードサイズは定数はありません。モデルを直感と一致させるために、必要です。そうでなければ、整数を単一の単語に格納することさえできません。それにもかかわらず、ほとんどの非数値アルゴリズムの場合、実行時間は実際にはに依存しません。これらのアルゴリズムは入力の基礎となるバイナリ表現を気にしないからです。Mergesortとheapsortは両方とも時間で実行され。最悪の場合、median-of-3-quicksortは時間で実行されます。1つの注目すべき例外は、時間で実行されるバイナリ基数ソートです。N W O N ログNをO N 2O N W wlog2nnwO(nlogn)O(n2)O(nw)

設定すると、従来の対数コストRAMモデルが得られます。しかし、いくつかの整数RAMアルゴリズムは、Andersson et al。の線形時間整数ソートアルゴリズムのように、より大きなワードサイズ用に設計されています。、これにはです。W = Ω ログ2 + ε nはw=Θ(logn)w=Ω(log2+εn)

実際に発生する多くのアルゴリズムでは、ワードサイズは単に問題ではなく、はるかに単純な均一コストのRAMモデルにフォールバックできます(そして実際にフォールバックできます)。唯一の深刻な問題は、非常に大きな整数を非常に迅速に構築するため使用できるネストされた乗算にあります。一定の時間で任意の整数の算術演算を実行できれば、多項式時間でPSPACEの問題を解決できます。w

更新:また、マルチテープチューリングマシン(または同等に「ビットRAM」)を使用するFürerの整数乗算アルゴリズム、および理論的に分析されるほとんどの幾何学的アルゴリズムなど、「標準モデル」には例外があることにも言及する必要がありますきれいだが理想的な「リアルRAM」モデル

はい、これはワームの缶です。


3
私はただ投票することになっていることは知っていますが、それを言うのを止めることはできません。秘Theは、(1)定義上、算術演算は一定の時間であり、理論的には任意のモデルを選択できるため問題ありません。(2)特定のモデルを選択する理由がいくつかあるはずです。
rgrig

私はrgigに同意します(また、私はちょうど投票することになっています)が、小さな問題は入力サイズが入力数に関連していないことです。例えば、入力がある場合、最大数はであり、計算モデルを選択した場合私が好きなように、これは擬似多項式時間アルゴリズムを、私は正しいですか?nmP

1
入力がビットを超える数で構成されている場合、実際の場合と同様に、モデルに合わせてそれらをビットチャンクに分割する必要があります。たとえば、入力がからまでの整数で構成される場合、実際の入力サイズはです。したがって、時間のような擬似多項式実行時間は、が大きい場合でも入力サイズで指数関数的です。wwN0MNlogwM=(NlgM)/(lgw)MO(NM)M
-JeffE

Real RAMモデルで分析されたアルゴリズムのうち、密かに「注文タイプRAM」アルゴリズムではないものはありますか?私はそれについてあまり考えたことがありませんが、そうではない例をすぐに思い付くことができません。
ルイ

1
@Louis:はい、たくさん:ボロノイ図、ユークリッド最短経路、再帰的な挿し木、単体パーティションの木、...しかし、最良の例ですで実行ガウスの消去、、実際のRAMモデル上の時間を(または単位コストの整数RAMですが、整数RAMで時間を必要としますO n 4O(n3)O(n4)
JeffE

24

コンテキストに依存します。アルゴリズムのビットレベルの複雑さを扱うとき、2つのビット数の加算がであるとは言わず、と言います。乗算なども同様です。O 1 O n nO(1)O(n)


参照記事から:「2つの異なる方法で測定できます:テストまたは乗算される整数の観点から、およびそれらの整数の2進数字(ビット)の数の観点から」、しかしこれは真実ではありません。常に入力のサイズで測定する必要があります。

1
@SaeedAmiri:使用されるエンコーディングに依存します。たとえば記事では、入力が単項符号化を使用して指定された整数場合、試行除算にはのみが必要です。これは、入力のサイズの多項式です!これは、試行分割による因数分解がことを意味しますか?いいえ、アルゴリズムは擬似多項式です。一般的なバイナリエンコーディングを使用すると、再び入力のサイズが指数アルゴリズムになります。前述のように、これは、入力ビット数がエンコードを変更して指数関数的に小さくなったために発生します。nθ(n1/2)Pn
マッシモカファロ

ちなみに、実際のインスタンスでのパラメータの大きさのオーダーがかなり低い場合、擬似多項式アルゴリズムは実際に役立つ場合があります。最も有名な例は、おそらくナップザック問題を解決するための擬似多項式アルゴリズムです。
マッシモカファロ

最初に、参照されたwikiページは良い参照がないため良くないことを言及する必要があります。また、入力サイズが通常バトルネックであるため、擬似多項式時間アルゴリズムについて話していると思う理由がわかりませんこの場合?しかし、私はそれらについて話していない、私はカンニングなどの入力サイズの仮定によっても問題について主に話しています、とにかく私たちはカンニングをすることができず、NPCの問題はにあると言うべきではないソートはであり、比較を無視するための正式な証拠がある場合を除き。PPO(nlogn)

入力のサイズに注意を集中し、誤解を招く可能性があることを示すために、擬似多項式アルゴリズムについて説明しています。別の例を示します。入力として自然数、たとえばが与えられ、アルゴリズムはループを実行し、回の反復で時間の操作を行います。入力サイズの関数として測定されるこの単純なループアルゴリズムの複雑さは、です。以来入力サイズであり、このアルゴリズムは、入力サイズに指数関数的です!これについて考える。これで、「コンテキストに依存する」という意味を理解できます。nO(1)nO(n)=O(2lgn)lgn
マッシモカファロ

16

前述の質問に答えるには:アルゴリズム論者はRAMモデルを使用して、かなり頻繁にそれを行います。ソートについては、多くの場合、人々はさらに単純な比較モデルを分析します。これについては、リンクされた回答でもう少し説明します。

なぜそうするのという暗黙の質問に答えるために:このモデルは、数値がすべて「小さく」、実際のマシンではレジスターに収まる特定のタイプの組み合わせアルゴリズムに対してかなり良い予測力を持っていると言えます。

数値アルゴリズムに関する暗黙的なフォローアップに答えるには:いいえ、ここではプレーンな古いRAMモデルは標準ではありません。ガウス消去法でさえも注意が必要な場合があります。通常、ランクの計算では、シュワルツ補題が入力されます(たとえば、ここのセクション5 )。別の標準的な例は、楕円体アルゴリズムの分析であり、分析には多少の注意が必要です。

そして最後に、人々は以前にも、最近でも文字列のソートについて考えてきました。

更新:この質問の問題は、「we」と「assume」がそれほど正確に指定されていないことです。RAMモデルで働く人々は、数値アルゴリズムや複雑さの理論を行っていません(除算の複雑さを決定することは有名な結果でした)


うーん、それは興味深い答えだと思われる

質問に完全に答えない理由はありますか?
ルイス

7

私はこれに関する研究を見つけることができませんでしたが、Kozenは「アルゴリズムの設計と分析」の紹介で、モデルは「中程度のデータに対して[log-cost modelより]サイズ(乗算には実際に1単位時間がかかるため)。」彼はまた、モデルがどのように悪用される可能性があるかの例として、この論文への参照を提供します。O(1)O(1)

これは絶対に正当な評価ではありません(特にPythonであるためです)が、およびで実行python -mtimeit "$a * $b"$aた場合の数値を。(Python構文が整数リテラルの受け入れを停止し、評価コードを少し切り替える必要があるため、66で停止しました。10{1,2,...,66}$b = 2*$a

各数値は10,000,000ループの平均であり、各ループで3回実行するのに最適な時間がかかります。私はエラーバーか何かをしますが、それはより多くの努力になるでしょう。:pいずれの場合でも、至るまで、私にはかなり一定に見えます。が43であるため、少し驚いています。この評価は特に偽であり、Cで行う必要があります。1050log10(sys.maxint)


この特別なケースでは仕事の経験があるかもしれませんが(しかし、私は確信していません:)、例えばこれを見てみると、のように見えますが、そうではなく、実際的な問題でもあります。また、ソートがあると言う論文を見ましたか?O(n)O(nlognlogm)

7

あなたは正しいです、一般的にそれらがと仮定することはできません。O(1)

厳密に言えば、比較を使用してN個の数値で配列をソートし、最大数がMである場合、最悪の場合、各比較にはビットレベルでの比較が含まれます。そして、アルゴリズムが比較を行う場合、その総複雑度はます。O N log N O N log N log M O(logM)O(NlogN)O(NlogNlogM)

ただし、Dougalの実験からわかるように、1つのレジスタに格納できない非常に大きな値についてのみ違いに気付くでしょう。M


O log n mO(logm)ではなく、セットの最大数はです。O(logn)m

はい、ただし、ソートするN個の異なる数がある場合、最大のサイズはビットです。O(logN)
エレルシーガルハレビ

いいえ、入力数とは関係ありません。また、入力数と関連付けたい場合は、入力番号があり、最大値はn n nnnnn

あなたは正しいです、私は私の答えを修正しました。
エレルシーガルハレビ

4

通常、32ビット整数または64ビット整数またはIEEE 754浮動小数点数のコンテキストで処理を行うため、O(1)算術演算を想定していると思います。O(1)は、おそらくこの種の算術演算のかなり良い近似値です。

しかし、一般的に、それは真実ではありません。一般に、加算、減算、乗算、除算を実行するアルゴリズムが必要です。Boolos、Burgess、JefferiesのComputability and Logicは、少なくとも私の第4版では、いくつかの異なる正式なシステム、再帰関数とそろばんマシンに関して、その証拠を理解する方法として思い浮かびます。

これらの2つの演算がO(1)ではない理由をわかりやすく説明するために、チャーチ数値による減算と除算のラムダ計算の項を見ることができます。足し算と掛け算とべき乗を見るのは少し難しいですが、教会の数字そのものの形を考えればそこにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.