13

一般に、複雑な関数を分析する場合、定義する変数は 1 つまたは 2 つだけではないため、"n" を定義するのが難しいのではないかと思います。

循環的複雑度の分析ツールはありますが、時間 (および/または空間) 複雑度の分析ツールはありますか? もしそうなら、それはどれですか?そうでないなら、なぜですか?それは実行不可能ですか?不可能?誰かがそれに慣れていないだけですか?

理想的には、アプリケーションの全体的な複雑さのようなもの (さまざまな可能な "n" を定義する) と、アプリ内の各メソッドのようなものがあるでしょう。

編集:停止問題のために正確な解決策は不可能のようですが、ある種のヒューリスティックな近似は可能ですか? 実用的な目的では、優れたプロファイラーがはるかに有用な情報を提供することを認識していますが、それは興味深い問題のようです。

また、プログラムの特定のサブセットを計算するものはどうですか?

4

4 に答える 4

13

残念ながら、停止問題と呼ばれるこの問題があります...

于 2009-03-11T19:06:47.380 に答える
7

いいえ、停止の問題があるため、これは不可能です。

アプリケーションを改善するためにこれを行いたい場合は、代わりにプロファイリングを検討してください。実際に最も時間がかかっているものを特定できます。このようにして、小さなデータセットでのみ実行される O(n^3) アルゴリズムの最適化に時間を費やす必要はありません。

于 2009-03-11T19:09:55.343 に答える
1

いくつかのこと:

実際のコンピューターはほぼ決定論的な有限状態マシンであるため、停止の問題は実際には実際の制限ではありません。実際の制限は、アルゴリズムの実行に、待っていると感じるよりも時間がかかり、力ずくの分析方法が除外されることです。

アルゴリズムの複雑さの大まかなアイデアを得るために、ランダムな入力のセットでいつでも実行し、かかった時間を測定できます。次に、データを通る曲線をプロットします。

アルゴリズムの時間の複雑さを分析することは、かなり複雑になる可能性があり、いくつかの創造的な手順が必要になります。(たとえば、クイックソートの分析を参照してください)。この問題は、論理定理の証明とプログラムの検証に密接に関連しています。複雑さの半自動解決を可能にする便利なツール、つまり人間からのヒントを与えられた解決策を体系的に検索するツールを構築することは実現可能かもしれませんが、それは確かに簡単ではありません。

于 2009-03-11T19:46:54.523 に答える
0

これを行うツールは見たことがありませんが、プロファイリング ツールを使用して、ボトルネックがどこにあるかをよりよく把握しています。それは常に明白であるとは限らず、長い時間がかかると思っていたことが実際にはほとんどかからなかったことに何度か驚かされました。.NET の世界では、ANTSJetBrainsツールを使用しました。

于 2009-03-11T19:22:37.747 に答える