アルゴリズムのランダウ表記(Big OまたはTheta表記)をプログラムで見つけるには?


11

私は、アルゴリズムを可能な限り最適化するために、手作業でアルゴリズムのLandau(Big O、Theta ...)表記を検索するのに慣れていますが、関数が本当に大きく複雑になっているとき、それはうまくいきません手でやるには時間がかかりすぎます。また、ヒューマンエラーが発生しやすくなります。

私はCodi​​lity(コーディング/アルゴリズム演習)に時間を費やし、提出されたソリューションのLandau表記(TimeとMemoryの両方の使用量)が表示されることに気付きました。

私は彼らがそれをどのように行うのだろうと思っていました...どのようにあなたはそれをしますか?

字句解析またはコードの解析以外の方法はありますか?

この質問は主にPHPやJavaScriptに関係していますが、私はどんな言語や理論にも心を開いています。


4
SOからこの回答を確認してください。あなたが探しているように聞こえます。
デコ

2
アルゴリズムごとにこの問題を解決するプログラムを作成できれば、「チューリングを反証した男」として有名になります。
-user281377

1
実行時間を決定することは一般的に不可能であるという証拠については、ここここを参照ください -実際の答えは、実際にあなたが求める以上のものです。
アレックス10ブリンク

回答:


13

私は彼らがそれをどのように行うのだろうと思っていました...どのようにあなたはそれをしますか?

さまざまな問題サイズでプログラムを実行し、時間とスペースの使用量を測定し、結果に曲線をあてはめることで、彼らが実際にビッグO測定を推定していると思います。

このアプローチの問題は、Nが大きくなるにつれてコスト関数の形状が変わると、間違ってしまう可能性があることです。例えば1000 N + N^1.5

字句解析またはコードの解析以外の方法はありますか?

字句解析と解析は十分ではありません。また、アルゴリズムの動作について何らかの推論を行う必要があります。また、これまで未知のアルゴリズムに対して自動的にそれを行うことは困難です。


6
「これまで未知のアルゴリズムに対して自動的にそれを行うことは困難です」–より正確には、それは停止問題を解決することと同等です。
ヨルグWミットタグ

えーと…正確ではありません。停止問題を解決することはこれまで知られいなかったすべてのアルゴリズムに対してそれを行うことができるのと同等です。
スティーブンC

2
うん、ごめん。1つのアルゴリズムに対してこれを行うことは、終了を証明することと同等(またはむしろ暗示的)です。
ヨルグW

1
これの実用性は、1)一部のアルゴリズムの終了を証明または反証することは不可能ですが、2)ほとんどのアルゴリズムにはこの理論的な障害はありませんが、3)定理証明の最新技術は十分に進歩していませんとにかくこれを行うことができる...比較的簡単な場合を除いて。したがって、彼らがこれを別の方法で行っていると想像する私の声明。しかし、明らかに、コードを見ずに彼らが実際にこれを行っているかどうかはわかりません。
スティーブンC

3

彼らはコードを分析せずにはいられません。

複雑さの人為的な「インフレ/デフレ」を伴う以下の例は、単にプログラムの実行時間を測定するだけではBig-Oを確実に推定するには不十分であることを証明しています

void lets_trick_runtime(int n) {
   if (n == 10 || n == 25 || n == 118) {
      // unfair speed-up
      do_precalculated_solution_in_constant_time(n);
      return;
   }
   if (n == 11 || n == 26 || n == 119) {
      // unfair slow-down
      do_some_fake_processing_in_n_cube_time(n);
      return;
   }
   // fair solution
   do_general_solution_in_quadratic_time(n);
}

上記のランタイム推定nは、unfair slow-down「公正な」二次時間の代わりに、偽の推定- 事前に計算された解がある値の一定時間とキックインする値のキュービック時間-を与えることに成功します。


ただし、偶然「不公平」なケースをチェックしたとしても、最悪のケースでは実際にBig-Oの複雑さを推定していると想定できます。
ヤムマルコビッチ

1

これは不可能だと思います。

固定数の異なる入力サイズでいくつかのテストを実行すると、多項式を簡単に計算できます。これにより、測定した実行時間を近似できます。したがって、すべての可能なプログラムの多項式になります。つまり、P = NP(ええ!;))ということです。

シンボリック操作でそれを行おうとすると、最終的にになりますhalting problem。プログラムが停止するかどうかは判断できないため、実行時の複雑さを判断することはできません。

ただし、後者の方法が可能な非常に特殊な場合があります。しかし、これらのケースはおそらくそれほど小さく、努力が払われるかどうかは疑問です。


1
+1、停止する問題はまれと考えられると思いますが。
ヤムマルコビッチ

0

どうすればいいですか?私が座って解決したくないほとんどすべての問題を解決する方法。シミュレートします。

多くの問題では、さまざまなサイズを使用してアルゴリズムを何度も実行し、それらの結果に回帰曲線を当てはめるだけで十分な場合があります。これにより、アルゴリズムの特定の「固定」オーバーヘッドコスト(曲線の切片)と、問題の規模が大きくなるにつれてどのようにスケーリングするかをすばやく特定できます。

特に複雑なソリューションをキャプチャするにはいくつかの調整が必要になりますが、特にボールパークの見積もりを探している場合は、その方法でそれを取得し、実際の結果と見積もりがどのように異なるかを確認して、それが許容できる近似。

私のこの方法の最大の弱点は、アルゴリズムのスケーリングが非常に悪い場合、最初の「大量に実行する」ステップがくなることです。しかし、率直に言って、それは事実であり、それだけでは、物事を後戻りして再考したいと思うかもしれないという指標であるべきです。


0

私の直感では、この問題の一般的な解決策は不可能です。アルゴリズムを実行することなく、アルゴリズムの実行時間に関する先験的事実を主張する(語彙分析を暗示する)。それは(私たちはそれをすべての時間を行うので)それはアルゴリズムの(おそらく大)クラスのためのいくつかの発見的アルゴリズムは可能であるが、これを行うための一般的なアルゴリズムを解くことと同等になり、言っEntscheidungsproblem十分でないことが知られています可能です(Church、Turingなど)。私はそれについて考えるので、今これについて〜99.9%確信しています...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.