Big-O表記とは何ですか?

Big-O表記とは何ですか?

自分が書いたプログラムの実行になぜこんなに時間がかかったのか疑問に思ったことはありませんか?おそらく、コードをより効率的にすることができるかどうかを知りたいと思うでしょう。コードの実行方法を理解すると、コードを次のレベルに引き上げることができます。 Big-O表記は、コードが実際にどれだけ効率的かを計算するための便利なツールです。





Big-O表記とは何ですか?

Big-O表記は、コードの実行にかかる時間を計算する方法を提供します。コードの実行にかかる時間を物理的に計ることはできますが、その方法では、わずかな時差を捉えることは困難です。たとえば、20行から50行のコードを実行するのにかかる時間は非常に短いです。ただし、大規模なプログラムでは、これらの非効率性が合計される可能性があります。





トレントのダウンロード速度を上げる方法

Big-O表記は、アルゴリズムがその効率を測定するために実行する必要のあるステップ数をカウントします。この方法でコードにアプローチすることは、効率を上げるためにコードを調整する必要がある場合に非常に効果的です。 Big-O表記を使用すると、実行に必要なステップ数によってさまざまなアルゴリズムを測定し、アルゴリズムの効率を客観的に比較できます。





Big-O表記をどのように計算しますか

引き出しの中にある靴下の数を数える2つの関数を考えてみましょう。各関数は、靴下のペアの数を受け取り、個々の靴下の数を返します。コードはPythonで記述されていますが、ステップ数のカウント方法には影響しません。

アルゴリズム1:



def sockCounter(numberOfPairs):
individualSocks = 0
for x in range(numberOfPairs):
individualSocks = individualSocks + 2
return individualSocks

アルゴリズム2:

def sockCounter(numberOfPairs):
return numberOfPairs * 2

これはばかげた例であり、どちらのアルゴリズムがより効率的であるかを簡単に見分けることができるはずです。しかし、練習のために、それぞれを実行してみましょう。





関連している: プログラミングの機能とは何ですか?

アルゴリズム1には多くのステップがあります。





  1. 変数individualSocksにゼロの値を割り当てます。
  2. 変数iに1の値を割り当てます。
  3. iの値をnumberOfPairsと比較します。
  4. それはindividualSocksに2を追加します。
  5. これは、individualSocksの増加した値をそれ自体に割り当てます。
  6. iを1つインクリメントします。
  7. 次に、(indiviualSocks-1)と同じ回数、ステップ3から6をループバックします。

アルゴリズム1で完了する必要のあるステップの数は、次のように表すことができます。

4n + 2

n回完了する必要がある4つのステップがあります。この場合、nはnumberOfPairsの値に等しくなります。 1回で完了する2つのステップもあります。

比較すると、アルゴリズム2には1つのステップしかありません。 numberOfPairsの値は2倍されます。私たちはそれを次のように表現します:

1

まだ明らかでない場合は、アルゴリズム2の方がかなり効率的であることが簡単にわかります。

Big-O分析

一般に、アルゴリズムのBig-O表記に関心がある場合は、全体的な効率に関心があり、ステップ数の詳細な分析には関心がありません。表記を単純化するために、効率の大きさを述べることができます。

上記の例では、アルゴリズム2は次のように表されます。

O(1)

ただし、アルゴリズム1は次のように簡略化されます。

O(n)

この簡単なスナップショットは、アルゴリズム1の効率がnの値にどのように関係しているかを示しています。数値が大きいほど、アルゴリズムが完了する必要のあるステップが多くなります。

線形コード

画像クレジット:Nick Fledderus / 名詞プロジェクト

nの値がわからないため、nの値が実行する必要のあるコードの量にどのように影響するかを考えるとより役立ちます。アルゴリズム1では、関係は線形であると言えます。ステップ数とnの値をプロットすると、直線が上がります。

二次コード

すべての関係が線形の例ほど単純なわけではありません。 2D配列があり、配列内の値を検索するとします。次のようなアルゴリズムを作成できます。

def searchForValue(targetValue, arraySearched):
foundTarget = False
for x in arraySearched:
for y in x:
if(y == targetValue):
foundTarget = True
return foundTarget

この例では、ステップ数はarraySearchedの配列の数と各配列の値の数によって異なります。したがって、簡略化されたステップ数はn * nまたはn²になります。

Wi-Fiに有効な構成がありません

画像クレジット:Nick Fledderus / 名詞プロジェクト

この関係は2次関係です。つまり、アルゴリズムのステップ数はnとともに指数関数的に増加します。 Big-O表記では、次のように記述します。

O(n²)

関連している: CSSファイルをチェック、クリーンアップ、最適化するための便利なツール

対数コード

他にも多くの関係がありますが、最後に見る関係は対数関係です。メモリを更新するために、数値の対数は、基数が指定された数値に到達するために必要な指数値です。例えば:

log 2 (8) = 3

底が2の場合、数値8に到達するには、指数値3が必要になるため、対数は3になります。

画像クレジット:Nick Fledderus / 名詞プロジェクト

したがって、対数関数の関係は、指数関係の反対です。 nが増加すると、アルゴリズムを実行するために必要な新しいステップが少なくなります。

一見すると、これは直感に反しているように見えます。アルゴリズムのステップがnより遅くなるにはどうすればよいですか?この良い例は二分探索です。一意の値の配列内の数値を検索するアルゴリズムを考えてみましょう。

  • 小さいものから大きいものの順に検索する配列から始めます。
  • 次に、配列の中央の値を確認します。
  • あなたの数が多い場合は、検索で小さい数を除外し、数が少ない場合は、大きい数を除外します。
  • 次に、残りの数字の中間の数字を見ていきます。
  • 繰り返しになりますが、目標値が中間値よりも高いか低いかに基づいて、数値の半分を除外します。
  • ターゲットが見つかるか、リストに含まれていないと判断されるまで、このプロセスを続行します。

ご覧のとおり、バイナリ検索ではパスごとに可能な値の半分が削除されるため、nが大きくなると、配列をチェックする回数への影響はほとんど影響を受けません。これをBig-O表記で表現するには、次のように記述します。

O(log(n))

Big-O表記の重要性

Big-O nationは、アルゴリズムの効率をすばやく簡単に伝える方法を提供します。これにより、異なるアルゴリズムを簡単に決定できます。これは、ライブラリのアルゴリズムを使用していて、コードがどのように見えるかを必ずしも知らない場合に特に役立ちます。

ウェブサイトのテキストを変更する方法

最初にコーディングを学ぶときは、線形関数から始めます。上のグラフからわかるように、それはあなたを非常に遠ざけるでしょう。しかし、経験を積み、より複雑なコードを作成し始めると、効率が問題になり始めます。コードの効率を定量化する方法を理解すると、効率のためにコードを調整し、アルゴリズムの長所と短所を比較検討するために必要なツールが得られます。

共有 共有 つぶやき Eメール 10最も一般的なプログラミングとコーディングの間違い

コーディングミスは非常に多くの問題につながる可能性があります。これらのヒントは、プログラミングの間違いを避け、コードを意味のあるものに保つのに役立ちます。

次を読む
関連トピック
  • プログラミング
  • プログラミング
著者について ジェニファー・シートン(21の記事が公開されました)

J. Seatonは、複雑なトピックの分析を専門とするサイエンスライターです。彼女はサスカチュワン大学で博士号を取得しています。彼女の研究は、ゲームベースの学習を利用してオンラインでの学生の関与を高めることに焦点を当てていました。彼女が働いていないとき、あなたは彼女が読書をしたり、ビデオゲームをしたり、ガーデニングをしたりしているのを見つけるでしょう。

ジェニファー・シートンのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください