質問

カウント関数 $ \ {x \} ^ * \ {x \} ^ * \ {x \} ^ * \ rightarrow \ mathbb n $ $ x $

この関数を計算する(漸近的な)複雑さについて混乱しています。は、出力が単数以外のシステム(例えば、バイナリ)で表現されるべきです。私の直感は、これが線形であるべきであること、つまり $ O(n)$ ここで、 $ n $ 入力内のシンボル $ x $ の発生数です。

私の理解が行われる限り、計算の解釈 - 例えば、

  • 私の最善のアイデアが実行時間を実行したシングルバンドのチューリングマシン $ \ omomega(n ^ 2 \ log n)$ 私は(スパンクラス="math-container"> $ \ log n $ は、バイナリ後続関数が $ \ omomega(n)$ の実行時間を持つという仮定から来ます。 $ n $ は、自然数の2進表現の長さ、 $ n ^ 2 $ チューリングマシンは、現在のカウントに達するためのすべての $ x $ のすべての上に移動しなければならないという仮定から来ます)、
  • マルチバンドチューリングマシン、ランタイムのアイデアがあると思う $ \ omma(n \ log n)$
  • ランダムアクセスマシン、まったくわかりません。

だから私の質問は以下のものです。

様々な計算モデルにおけるカウント関数の計算の複雑さは何ですか?それらのいずれかに線形ですか?

関連性がある場合、私は抽象代数の観点から尋ねます。

役に立ちましたか?

解決

チューリングマシンは、いくつかの利点を持つ素晴らしいモデルです。ほとんどの単純さは、アルゴリズムを分析するときの最初の選択ではありません。アルゴリズムは通常、RAMマシンモデルで暗黙的に分析され、場合によっては BSSモデル

ここにはさまざまなモデルのカウントの計算量の複雑さに関するいくつかのコメントがあります:

シングルテープチューリング機:これらはそれらの上限が低いことが比較的簡単であるため、考慮されます。マルチテープチューリングマシンよりも現実的な計算モデルです。

マルチテープチューリング機:償却カウンタは、 $ o(1)$ 償却ビット操作。これは、 $ 1/2 + 2である変更されたビットの総数について、1分の1の1分の1の時間、1分の1の1分の1、2ビットだけが1つだけ変化するためです。 / 4 + 3/8 +¥CDOT= 2 $ 。チューリングマシンの複雑さは線形であり、カウントは $ o(n)$ で実装できます。

RAMマシン: RAMマシンは、かなり多くのレジスタとランダムアクセスメモリで構成されています。レジスタは $ o(\ log n)$ -bits longです。 $ n $ はサイズです。入力のレジスタに対する合理的な操作は一定の時間を取ります。特に、 $ \ mathit {poly}(n)$ にカウントすることができるカウンタを増やすと、 $ o(1 )$ 最悪の場合時間。特に、あなたの関数は $ o(n)$ で実行されます。

BSSマシン:算術演算をしても大量に注意しなければなりません。 RAMマシンでは、オペランドの大きさが $ \ mathit {poly}(n)$ の場合にのみ、算術演算は一定時間にかかります。 BSSマシンでは、実数を指定して、あるフィールドに値を格納する特殊レジスタにアクセスできます。定数算術と比較を実行できますが、Floorのような機能はありません。また、索引付けにそのような値を使用することもできません。 (あなたが十分に限定しないならば、あなたはすぐに多項式の時間にSATを解決するでしょう。)浮動小数点演算としてのBSSマシンを考えることができます。これは、実際には一定の時間をかけながら、それらに関与する有限の精度を無視しています。 。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top