web-dev-qa-db-ja.com

アルゴリズムの複雑さを数学的に証明する方法

基本的なアルゴリズムとその複雑さを知っています。たとえば、バイナリ検索に複雑度O(log n)がある場合、これを数学的に証明するにはどうすればよいですか?

3
sarat

入力に関してアルゴリズムの時間の複雑さを測定する方法(Nの増加に応じてアルゴリズムの時間も増加する方法)について質問していると思います。 1つの方法は、アルゴリズムを再帰方程式の形式でモデル化し、いくつかの手法で解くことです。一般的な手法は、マスター定理、代入、再帰ツリーなどです。

二分探索アルゴリズムは、比較によりNを半分に分割した反復と見なすことができます。したがって、T(n) = T(n/2) + 1.です。これをマスター定理で解いて、関数がlog nであることを示します。

この種のものの完全な概要については、次の2つのクラスを処理することをお勧めします。

http://aduni.org/courses/discrete および http://aduni.org/courses/algorithms

3
rreeverb

Big Ohは実際にはアルゴリズムの複雑さの説明ではありません。BigOhは、アルゴリズムによって使用されるコンピューティングリソースの説明または測定値であり、決定と分岐が何回行われるかを示します。

とにかく、複雑さの理論の背後にあるすべての複雑な数学に慣れ、P、NP、EXPTIME複雑度クラス、およびすべての楽しいものについて学ぶ必要があります。

http://en.wikipedia.org/wiki/Computational_complexity_theory

3
whatsisname

データ構造とアルゴリズムの紹介として、Cormen&al Introduction to Algorithms は本当に素晴らしいです。

複雑さを計算する特定のケースについては、それを再帰的な関係として表現し、その関係が真であることを証明してから、この再帰的な関係をより扱いやすい式に減らすことが一般的です。

マスター定理 は後のステップで役立ちます。ウィキペディアの記事を読んでください。簡単な例としては十分でしょう。

1
Matthieu M.

バイナリ検索のみ!

これが私のやり方です:

N要素を含むソートされたリストにバイナリ検索を実装するには、キーを「コーナー化」するまでリストを半分に分割し続けます。これにより、問題のサイズが半分に減少したことがわかります。 100:50:25:12:6:3:1]に達するまで(最悪の場合)1

これにより、Common Ratio = 1/2、N番目の項が1の幾何学的な進行が得られます。

GP式は次のとおりです。

= A1rn-1 につながる

1 = A1(1/2)n-1

この後で簡単になります:両側をAで割ります1、ログで乗算 2 そしてNのために解きます!

Aに到達するためのステップ数を与える必要があります これはログです 2A1 + 1これはO(log n)

1
Daniel C. Sahle

非公式には、次のような引数を使用します。n=要素でバイナリ検索を実行するために必要な操作の数をf(n)とします。次に、関係が

f(n) = 2 f(n/2) + c

保持し、マスター定理を使用します。

この理論の領域は(少なくともコンピュータサイエンスの紹介で提示されているように)正式な数学を漠然とした非公式の基礎に適用しようとしているように見えるため、正式に複雑さを「証明する」ことは常に私を悩ませてきました。 (たとえば、「操作」として正確に何がカウントされますか?)

1
user13278

Big-ohを証明する数学的手法があります。 IIRCには、いくつかの差分方程式が含まれています。トピックに関するまともな教科書は、あなたにロープを教えることができるはずです。

0
Macke