5

漸近表記に頼ることなく、アルゴリズムの時間計算量を取得する唯一の方法を数える退屈なステップですか?そして、コードの各行のステップ数がなければ、任意のプログラムのビッグO表現に到達できますか?

詳細:特定の問題を解決するのに最適なアルゴリズムを決定するために、いくつかの数値解析アルゴリズムの複雑さを見つけようとしています。たとえば、eqnsを解くためのRegula-Falsi法またはNewton-Rhapson法の中から、各方法の正確な複雑さを評価してから、どちらの方法がそれほど複雑でないかを決定します('n'の値または任意の引数を入れます)。

4

3 に答える 3

5

複雑なアルゴリズムの正確な複雑さを見つけるための唯一の方法 --- 「簡単な」方法や困難な方法ではなく、合理的な唯一の方法 --- は、そのプロファイルを作成することです。アルゴリズムの最新の実装には、数値ライブラリと、CPU およびその浮動小数点ユニットとの複雑な相互作用があります。たとえば、キャッシュ内のメモリ アクセスは、キャッシュ外のメモリ アクセスよりもはるかに高速であり、その上、複数のレベルのキャッシュが存在する場合があります。ステップをカウントすることは、目的には不十分であると言う漸近的な複雑さに本当に適しています。

ただし、歩数を自動的にカウントしたい場合は、それを行う方法もあります。コードのすべての行にカウンター インクリメント コマンド (C の "bloof++;" など) を追加し、最後に値を表示することができます。

また、分析計算にも役立つ、より洗練された時間計算量の式 f(n)*(1+o(1)) についても知っておく必要があります。たとえば、n^2+2*n+7 は n^2*(1+o(1)) に単純化されます。通常の漸近表記 O(f(n)) について気になるのが定数係数である場合、この改良はそれを追跡し、無視できる項を捨てる方法です。

于 2010-07-28T04:57:34.847 に答える
2

「簡単な方法」はそれをシミュレートすることです。たくさんのnの値とたくさんの異なるデータを使ってアルゴリズムを試し、結果をプロットしてから、グラフの曲線を方程式に一致させます。

結果は厳密には正しくない可能性があり、適切なテストデータを生成する能力と同じくらい有効ですが、ほとんどの場合、これは機能します。

于 2010-07-28T03:00:10.230 に答える
0

たとえば、eqnsを解くためのRegula-Falsi法またはNewton-Rhapson法の中から、各方法の正確な複雑さを評価してから、どちらの方法がそれほど複雑でないかを決定します('n'の値または任意の引数を入れます)。

非線形ソルバーについては、一般的にこの質問に答えることはできないと思います。反復ごとに正確な数の計算を行うことはできますが、一般に、各ソルバーが収束するのに何回の反復が必要かを知ることはできません。ニュートンのためにジャコビアンを必要とするような他の複雑さは、複雑さの計算をさらに難しくする可能性があります。

要約すると、最も効率的な非線形ソルバーは、常に解決しようとしている問題に依存します。解決する問題の種類が非常に限られている場合は、さまざまなソルバーを使用して一連の実験を行い、反復回数とCPU時間を測定することで、より有用な情報が得られる可能性があります。

于 2010-07-29T00:38:24.933 に答える