アルゴリズムは、任意の入力プログラムの時間の複雑さをどの程度予測できますか?


23

停止問題は、ために、別のプログラムを停止するかどうかを決定することができますプログラム書くことは不可能であると述べているすべての可能な入力プログラムを

ただし、次のようなプログラムの実行時間を計算できるプログラムを作成できます。

for(i=0; i<N; i++)
    { x = 1; }

時間計算量を実行せずに返します。N

他のすべての入力プログラムについては、時間の複雑さを判別できなかったことを示すフラグを返します。

私の質問はこれです:

特定のプログラムの時間的な複雑さをアルゴリズムで決定できるように、どのような条件を保持する必要がありますか?

*これに対する標準的な参照またはレビュー記事がある場合、コメントへのリンクをお願いします。


1
(1)「O表記法」は「時間の複雑さ」を意味するものではありません。(3)特定のプログラムが停止するかどうかを決定し、プログラムの時間の複雑さの明示的な上限を与えることは異なります。
伊藤剛

1
制限されたクラスのプログラムの時間の複雑さを推測することには慣れていませんが、チェックする価値のあるプログラムのクラスの1つは「時間制限ループプログラム」と呼ばれます。境界ループプログラムについては、2つのプログラムの等価性を判断するという文脈で、UweSchöningとRandall J. PruimによるGems of Theoretical Computer Scienceの第3章で説明されていることを覚えていますが、この章があなたの質問にどの程度関連しているかはわかりません。
伊藤剛

4
私は少し混乱しています。これはどのように範囲外ですか?OPの質問に対する合理的な答えの1つは、実行時間をアルゴリズムで決定できる言語フラグメント(またはフラグメントのクラス)です。
Suresh Venkat


7
私はこのコメントスレッドにひどく遅れています。投稿が初心者っぽいにおいがする瞬間を襲いそうです。私は指を指していない。私はこの本能を自分で感じています。たぶん私たちはもっと穏やかにすべきです。OPは、その分野または用語に精通していないことを認めました。自分が望むものを正確に知っている人だけを容認し、私たちの言語でそれを尋ねる場合、質問回答サイトのポイントは何ですか。
ビジェイD

回答:


23

TpT

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

pT

ただし、プログラムの複雑さを効果的に計算するために多くの作業が行われています。私は、特別な構成体または型規律を使用して、明確に定義された特定の複雑度クラスに属するプログラムのみを作成できる言語を作成することを目的とする暗黙的複雑度理論を特に好みます。私が奇跡のようなものだと考えることで、これらの言語はそのクラスで完全なものになることがよくあります!

J.-Yによるこの論文では、特に良い例が説明されています。Marionは、Pのアルゴリズムの特性化を可能にする情報フローおよびセキュリティ分析技術からヒントを得た型規律を備えた、小さな命令型言語を記述しています。


補足説明として、終了を保証できる言語であるEpigramも参照してください。
Realzスロー

これは良いスタートですが、言いたいことがありますか?(たとえば、特定の基本的な再帰関数のランタイムは計算が簡単でなければならないようですが、そのような関数は指数階層の問題を解決できます。...)
usul

入力プログラムが制限された言語で書かれていると判断できる限り、その言語が課す上限によって時間の複雑さが制限されると想定できます。ただし、多くのプリミティブな再帰関数には、より効率的な一般的な再帰的同等物があります。
Chris Pressey

1
(誤ってそのコメントを早期に保存し、5分間の制限を超えました。2番目の文は次のように読む必要があります)。より効率的な一般的な再帰的同等物)、実際には、制限のない分析しにくい言語の使用を促進します。
クリスプレッシー

それはとても面白いクリスです!参考文献はありますか?実際、それは反直感的なようです:プリミティブな再帰関数は、与えられたステップ数で一般的な再帰関数をシミュレートでき、スピードアップを一定の要因に制限すると思われます。
コーディ

11

あなたが提起する質問とあなたが説明する特定のカウンティングトリックは、プログラム分析の古典的なものです。複雑さの分析には理論的な問題があり、コードのパフォーマンスを自動的に推定するという点で実用的な兆候です。このような自動分析には、パフォーマンスバグの検出からクラウド内の一部の計算のコストの見積もりまで、いくつかのアプリケーションがあります。

コーディは、この問題は一般的に決定できないと指摘しました。この問題は、複雑さの限界を取得するとプログラムも終了するため、終了の証明よりも困難です。このような問題には2つのアプローチがあります。1つは、プログラム分析からです。カウンターを追加してその値を推定するという考えは、70年代から存在します。このエンコードにより、実行時間を決定する問題が不変式を計算する問題まで軽減されます。

2番目のアプローチは、特定の限定された複雑さのプログラムのみを許可するプログラミング言語を設計することです。これは、暗黙的な計算の複雑さの領域です

両方の領域に関するいくつかの参照が続きます。

  1. SPEEDプロジェクトは、プログラムに導入されたカウンターの境界を見つける方法に焦点を当てたプログラム分析作業の1つの特定の行です。カウンターは時間またはスペースの消費を測定できます。
  2. 多変量償却リソース分析、Jan Hoffman、Klaus Aehlig、Martin Hoffman、ACM TOPLAS 2012
  3. 命令型プログラムの決定可能な成長率特性、アミールベンアムラム、暗黙的計算ComplExity 2010の開発。これは、統語的制限により命令型プログラムの複雑さを制限する作業の美しいラインです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.