加算の時間の複雑さ


11

ウィキペディアは、加算の時間の複雑さをとしてリストしています。ここで、はビット数です。nn

これは厳密な理論上の下限ですか?または、これは、現在最も高速な既知のアルゴリズムの複雑さだけです。加算が複雑であるため、他のすべての算術演算とそれらを使用するすべてのアルゴリズムが強調されているので、知りたいと思います。

o(n)で実行される追加アルゴリズムを取得することは理論的に不可能o(n)ですか?または、追加のために線形の複雑さに拘束されます。

回答:


17

アルゴリズムがn時間よりも漸近的に使用する場合、追加する数値のすべての桁を読み取るのに十分な時間がありません。非常に大きな数(たとえば、8MBのテキストファイルに格納されている)を処理していると想像してください。もちろん、数値の値に比べて非常に迅速に加算できます。Nが合計値の場合、O(log(N))時間で実行されますN

これは、少し高速化できるという意味ではありません。プロセッサが各操作を32ビットで処理する場合、時間を使用しますが、それでもではなくです。 Ononn32O(n)o(n)


理論的に必要なすべてのデータを読み取っています。任意の2つの数値と加算する場合。計算は、シフトを通じて演算で実行できます。追加し。考えてみてください。合計のより速い見積もりを見つけられない可能性があります。正しくなるまでその見積もりを調整してください。未満の操作で?B B + B 2 2 O 1 0 Nab,a:ab,a+b2a2aO(1)0n
Tobi Alafin 2016

3
はい、それは理論的な必要性です。なぜなら、入力の各ビットは出力で重要な意味で使用されます。重要な意味では、それは恒等関数ではないということです。あなたにはかどうか、例で計算することができます時間計算モデルによって異なります。追記場合は一定時間操作され、その後、はい。あなたはRAMへのアクセスを持っている場合は、必要がすでにの長さを知っていれば時間は少しのアドレスを書き込み、または使用すると、すべて読まなければならない場合、時間を見つけるために。この例では、多くの出力ビットは入力ビットの簡単な関数です。2 a O 1 0 O log n a O n a 2 a2a2aO(1)0O(log(n))aO(n)a2a
Lieuwe Vinkhuijzen 16

私は長発見アルゴリズム有しにおける。バイナリ検索を使用します。O log n aO(logn)
Tobi Alafin 2016

3
@TobiAlafinモデルがRAMアドレス指定をサポートしている場合、バイナリ検索はステップで実行されます。Turing Machineでは、メインメモリに読み込まれていないテキストファイルでは、時間かかります。どちらの場合でも、RAMアドレッシングの有無に関係なく、質問に答えるために、アルゴリズムは入力のすべてのビットを調べてを計算必要があります。そうではなく、ビットの入力では番目のビットを検査しないとします。その後、私はそのビットを反転することができ、それは間違った答えを与えるでしょう。O n a + b 42 6O(logn)O(n)a+b426
Lieuwe Vinkhuijzen 16

1
このため、基本的にすべての操作はです。唯一の例外は、何らかの方法で順序付けされたデータ構造を処理している場合です。たとえば、BST全体にアクセスして、特定の値が含まれているかどうかを確認する必要はありませんが、これは、BSTに付属する不変式のためにのみ当てはまります。Ω(n)
Bakuriu 16

7

複雑性分析が形式的に意味をなすためには、オブジェクト内のアルゴリズムが実行される形式的な計算モデル、または少なくとも、基本的な操作が何であるかを指定するコストモデルを指定する必要があります。彼らのコスト。

ほとんどのコンテキストでは、算術演算は時間かかると想定されています。関係する数値に関係なく、アルゴリズムの複雑さに関心があるため、これは通常妥当です。これは、均一コストモデルと呼ばれます。Θ(1)

数値が無制限に大きくなる可能性がある場合、または演算自体を分析することに関心がある場合、算術演算のコストは、入力のサイズに比例してになります。Θ(|x|)

さて、運用コストはそれよりも低いのでしょうか?しかし、おそらく、それが発生する可能性のある計算モデルを正式に定義する必要があります。


1
追加の例として、キャリールックアヘッドアダーは、適切な簡略化の仮定の下で、時間をかけて2つのビット数の合計を計算します。nΘ(logn)n
Fabio Somenzi、2016

3

加算の入力は2つの任意の数値です。それらは任意であるため、各ビットを読み取る必要があるため、アルゴリズムはです。Ω(n)

アルゴリズムが各ビットを読み取らずに1010100110と0010010110を正常に追加すると想像してください。アルゴリズムが任意の入力を追加できるようにするために、これらのビットのいずれかをランダムにフリップでき、アルゴリズムは正しい(ただし異なる)加算を出力します。しかし、アルゴリズムがすべてのビットを読み取らない場合、反転された入力が元の入力と異なっていたことがどうしてわかるのでしょうか?


私が考えていたのは、未満の操作で合計を概算する手段でした。n
Tobi Alafin 16

絶対に。アルゴリズムで「近似」の意味を定義するだけです。その定義に応じて、2つの最上位ビットを追加することは、o(n)時間で実行できるおおよその合計になる可能性があります。「加算」アルゴリズムに言及するとき、私たちは皆、答えが正確でなければならないことを意味すると考えています。
murrdpirate 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.