関数のBig-O表記を計算できるものはありますか? Big-Oについて学習している間、基本的なルールを理解すれば頭の中で行うのはかなり簡単なことですが、それが真実であれば、この機能がさまざまなIDEに組み込まれることを期待しています。このようなツールは見たことがありません。
これはソフトウェアを介して簡単に解釈できるものですか、それとも開発者だけが利用できるコンテキストが必要ですか?
私が覚えている限り、理論的な複雑さを知っている各アルゴリズムには、時間対時間のプロットがあります。つまり、小さなデータサンプルの場合、実行時間が長くなる可能性があります。
現在のIDEのほとんどはパフォーマンスユニットテストをサポートしています。
ランダムサイズの異なるデータサンプルを生成して、単体テストに渡すことができます。
IDEは統計を収集します。
次に、サイズ対時間のプロットを見て、アルゴリズムの複雑さに関する仮定が正しいかどうかを確認できます。
非常に短い答え:停止問題の解決に使用できるため、これは不可能です。
直観的な回答#1:「このコードのアルゴリズムの複雑さは何ですか」は、「このコードが停止するか」よりも複雑な質問であり、決定できないことがわかっています。そのような単純な質問が決定できない場合、おそらくより複雑な質問もおそらくあります。
直感的な回答#2:そのようなツールを作成することができた場合、戻り値が無限大より小さいかどうかを確認し、この方法で停止問題を解決できます。私たちは停止問題が決定不可能であることを知っているので、そのようなツールはおそらく存在できません。
正解:(正解は、ここでは説明しませんが、決定不能性の証明になります。姉妹サイトのスタックオーバーフローの非常に類似した質問に対する証明のスケッチがあります this answer 。)
Big-O表記は体系的であり、コード内の制御フローに完全に依存しているため、確実に実行可能ですが、正確ではありません。
コンパイラーに最初の重い作業を行わせ、コンパイルされたバイトコードの制御操作を分析するだけでこれを行わせるのがおそらく最善でしょう。また、コンパイラーを研究することは、コンパイラーがどのように実行するかを学習するなど、これに役立つ可能性があります コード到達可能性分析 。
基本的に(私が知る限り)、後方分岐を除いて、すべての命令は一定の時間の複雑さです。
したがって、後方分岐命令に遭遇した場合は、特にそのループの終了条件に関するコンテキストデータを保存し、そのループのBig-Oを決定する必要があります。次に、その複雑さを、その中に含まれる命令の複雑さで乗算します。これは、他のメソッド呼び出しや、再帰的に分析する必要がある後方分岐である可能性があります。
コンパイラーに知られていない特別なコンテキストについて:Big-Oは最悪のケースを想定しているので気にしませんが、十分に賢明であると想定すれば、アナライザーにメソッドの複雑さに関する追加の事項を報告させることができます。