アルゴリズムの時間計算量分析: Big O 表記

アルゴリズムの時間計算量分析: Big O 表記

[[354643]]

開発の際、アルゴリズムの品質をどのように評価し、アルゴリズムの効率をどのように説明すればよいのでしょうか。より一般的な表現方法は、プログラムの実行が速いか遅いかですが、これは比較的大まかな説明にすぎません。それを直感的かつ科学的に説明するにはどうすればよいでしょうか。

実行時間を使って非常にわかりやすく直感的に説明できると言う生徒もいるかもしれません。ただし、言語、コンパイラ、CPU が異なれば、プログラムの処理にかかる時間も異なります。実行時間を単純に使用してアルゴリズムの実行効率を表すことはできません。また、処理するデータが増えると、アルゴリズムの基本操作を繰り返す回数も増え、増加率はアルゴリズムごとに異なります。

数学は確かに優れたツールです。アルゴリズムの実行時間の増加を説明するために、さまざまな数式を使用して分析することができます。コンピュータ サイエンスには、アルゴリズムの効率性を特徴付ける特別な用語があり、それが今日学習する Big O 表記法です。 Big O は、アルゴリズムの実行にかかる時間を示すものではありません。アルゴリズムの実行時間の増加率を示します。つまり、アルゴリズムの実行時間はさまざまな率で増加します。これは漸近的時間複雑度とも呼ばれます。

これは次の式で表すことができます。

通常、時間の複雑さを説明するために次のような表現があります。

  • O(1): 定数時間
  • O(n): 線形時間
  • O(log n): 対数時間
  • O(n^2): 2次時間
  • O(2^n): 指数時間
  • O(n!): 階乗時間

それぞれの時間計算量は異なります。これらの時間計算量を詳しく見てみましょう。

ビッグOの複雑さ

オー(1)

O(1) は、一定の時間計算量を意味します。サイズ n の入力が与えられた場合、n の値が何であっても、アルゴリズムの最終的な実行時間は一定です。例えば:

  1. int関数( intn )
  2. {
  3. n++;
  4. n*2を返します
  5. }

上記のプログラムでは、入力 n の値がどのように変化しても、プログラムの実行時間は常に一定です。単純化してみましょう。関数内の各ステートメントの実行時間が 1 の場合、実行時間の数式は次のようになります。

n がどれだけ大きくても、最終的な実行時間は 2 という固定値になります。実行時間は 2 ですが、ここでは O(1) を使用して表します。1 は定数を表します。

の上)

O(n) は線形時間計算量を表し、アルゴリズムの実行時間は入力 n のサイズに応じて線形に変化します。

  1. int関数( intn )
  2. {
  3. 整数 合計= 0;
  4. ( int i=0; i<n; i++)の場合
  5. {
  6. 合計=合計+ i;
  7. }
  8.  
  9. 戻る 合計;
  10. }

上記のプログラムでは、関数の実行時間は n に比例して変化します。

線形表現で表現できるこの状況では、O(n) を使用します。

なぜ式中の他の係数を省略できるのでしょうか? 主な理由は、n が無限大に近づくと、無限大の n に対する係数を無視できるためです。

O(n^2) の場合

O(n^2) は二次の時間計算量を表します。アルゴリズムの時間は、入力データ n の増加とともに二次的に増加します。

  1. int関数( intn )
  2. {
  3. 整数 合計= 0;
  4. ( int i=0; i<n; i++)の場合
  5. {
  6. ( int j=0; j<n; j++)の場合
  7. {
  8. 合計=合計+ i + j;
  9. }
  10. }
  11.  
  12. 戻る 合計;
  13. }

上記のプログラムは 2 つのループを持つプログラムであり、関数の実行時間は n の 2 乗です。

このタイプのプログラムの場合、O(n^2) と表現できます。ただし、この 2 層ループに加えて、3 層、4 層...n 層のループもあり、対応する複雑さは O(n^3)、O(n^4)...O(n^n) になります。

O(2^n)

O(2^n) は指数関数的な複雑さを表します。n が増加すると、アルゴリズムの実行時間は指数関数的に増加します。これは爆発的な増加の例です。

  1. int関数( intn )
  2. {
  3. n==0の場合は1を返します
  4.  
  5. func(n) + func(n-1)を返す
  6. }

上記のコードには 2 つの再帰呼び出しがあり、関数の実行時間は入力 n に指数的に関係します。

したがって、ここではO(2^n)を使用できます。

O(logn) です

O(log n) は対数時間計算量を意味し、アルゴリズムの実行時間と n は対数関係にあります。このタイプのアルゴリズムでは、プログラムの実行につれて、特定の機能を完了するためのステップが少なくなります。その中でも、私たちがよく知っている二分探索法は良い例です。たとえば、次のコードは順序付きリスト内の値の位置を見つけ、バイナリ検索を使用します。

  1. int関数( int a[], int  サイズ int数値)
  2. {
  3. 整数 = 0;
  4. 整数 =サイズ-1;
  5.  
  6. while(<=)
  7. {
  8. int中央 = (+)/2;
  9.  
  10. if(a[mid] > num)
  11. {
  12. = 中央 - 1;
  13. }
  14. そうでない場合 (a[mid] < num)
  15. {
  16. = 中央 + 1;
  17. }
  18. それ以外 
  19. {
  20. 数値を返します
  21. }
  22. }
  23.  
  24. -1 を返します
  25. }

最悪の場合、バイナリ検索で x 回分割した後、最後の要素が探している要素になります。次の式が得られます。

関数の実行時間は次のように表すことができます。

したがって、ここでは O(log n) を使用できます。

の上!)

階乗関係の複雑さの最も典型的な例は巡回セールスマン問題です。

n+1 都市を訪問したい旅行中のビジネスマンがいるとします。彼は進むべき道を選択する必要があります。この道の制約は、各都市を 1 回しか訪問できず、最後には元の出発都市に戻らなければならないことです。パス選択の目的は、すべてのパスの中で最小のパス長を取得することです。

この問題を解決する最も簡単な方法は、網羅的な列挙によってすべての順列と組み合わせをリストすることです。 n+1 個の都市がある場合、数学で学んだ順列と組み合わせの計算方法によれば、すべての組み合わせの数は n! であると計算できるため、この網羅的な方法に対応する時間計算量は O(n!) です。

この記事はWeChat公式アカウント「Will's Canteen」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Will’s Dashitang パブリックアカウントにご連絡ください。

<<:  エッジ AI とエッジ コンピューティングとは何ですか?

>>:  GoogleとDeepMindは、6つのタスクと複数のデータタイプに対する効率的なTransformer評価ベンチマークを提案

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

2つのセッションは「AI顔認識」と生体認証データの法制化と規制の緊急の必要性に焦点を当てています。

[[385416]]現在、両セッションは活発に行われており、全国のさまざまな分野の代表者が独自の提...

...

Cacti パーセンタイル監視アルゴリズム

Cactiパーセンテージ監視アルゴリズムの具体的な方法は次のとおりです。 cacti のテンプレート...

ついに、人工知能の3つの重要な機能を説明する人がいた。

人間の知性は広大かつ複雑です。人間の成果の中には、今日の機械では到底達成できないものもあり、機械がこ...

人工知能は私たちに何をもたらしてくれるのでしょうか?人工知能は非常に強力です

人工知能は皆さんにとって馴染み深いものかもしれませんが、では人工知能は一体何ができるのでしょうか?本...

彼は17歳でiOSの脱獄の父となり、25歳で自動運転車を開発した。

[[271960]]彼は5歳の時に初めてコンピュータプログラムを書きました。14歳の時、自作のマッ...

OpenAIは、歪んだ見解なしにAIが話すようにするために、わずか80のテキストを使用している

[[405587]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...

データを盗むために設計された8つの偽ChatGPTマルウェアアプリ

翻訳者 |陳俊レビュー | Chonglou現在、人々は、回答の検索、グラフィック コンテンツの生成...

AWS CISO: GenAI は単なるツールであり、万能薬ではない

Chris Betz 氏は、サイバーセキュリティにおける GenAI の役割について恐れたり、過度に...

Pythonは画像内のすべての顔を認識し、それを表示する機能を実装しています

Python3 を使用して、写真内のすべての顔を認識して表示します。コードは次のとおりです。 # -...

2018年の機械学習についてお話しましょう

記事全文を読み始める前に、「ロボットが私たちの仕事を奪っている」といったセンセーショナルなニュースの...

OpenAI セキュリティシステムディレクターが長文記事を執筆: 大規模モデルに対する敵対的攻撃と防御

ChatGPTのリリースにより、大規模な言語モデルのアプリケーションが加速し、大規模に展開されていま...

アメリカの科学者が新技術を開発:ロボットが行動する前によく考えさせる

カリフォルニア大学バークレー校の新しい研究によると、ロボットはビデオ認識技術を通じて物体を移動させる...

汎用人工知能(AGI)の分野で達成すべき4つの大きなマイルストーン

GPT と GAN で多くの進歩があったにもかかわらず、AGI は解決が難しい問題のままです。本質的...

CMU PhD により、インテリジェント エージェントが現実世界で競争できるようになります。 GPT-4が勝利したが成功率はわずか10%

私たちは長い間、人工知能の進歩によって推進される自律的なインテリジェントエージェントを作成するという...