生き残るビッグO:パートI


正直にしましょう-ビッグOを学ぶ初心者のためのハードです.この記事は、あなたが大きいOのようなそのような無実の話題を恐れないように書かれます.このサバイバルミッションを始めましょう
簡単に言えば、ビッグOはあなたのアルゴリズムが最初から最後までかかるすべてのステップの合計です.誰かの前でフレックスをしたいなら、この定義を教えてください
ビッグO記法は、引数が特定の値または無限大に向かっているときの関数の制限された動作を記述する数学表記です
あなたも、これを理解しようとする必要はありません.私はこの定義がビッグOに関連している方法を知らない.
さて、ビッグOの重要性について話をしましょう.アルゴリズムを書いて、マシンで走るのに5ミリ秒かかりました.それで、あなたはあなたの友人に言いました.その後、あなたの友人も彼のマシンで同じアルゴリズムを実行し、それを実行する1ミリ秒かかりました.何ということだ!実際にどのように多くの秒を実行するには、CPU、プロセッサ、RAM、プログラミング言語などのようなものに依存する多くの秒に依存してどのように我々はどのように高速またはアルゴリズムをスロー知っているのですか?ここで私たちの大きなO表記は英雄です.
大きいOの助けを借りて、我々は大きな入力を与えられるならば、コードがどのように実行するかを理解することができます.簡単に言えば、与えられた大きな入力がどのくらいのステップになるか.
例を見ましょう
配列のすべての数を合計するプログラムを書いたとします.
def sum_of_array(numbers):
    sum = 0
    for num in numbers:
        sum += num

    return sum

まず変数名を宣言しましたsum . これは一歩です.ここで大きなOはO(1)です(大きいOの構文は資本Oです、そして、括弧の内側のステップの数).変数の後、配列をループします.どのように、我々はこのループの大きいOを数えますか?ループが配列の各要素を反復し、現在の数値をsum これは一歩です.配列に「n」要素があるならば、ループは現在の数「n」回を加えます.つまり、トータルステップは次のようになります-1 * n = n . それで、我々は我々の大きいo - o(1 + n)で「n」を加えます.その後、私たちはリターンステートメントを持っています.このreturn文は1ステップです.つまり、私たちの最後の大きなOは-O(1 + n + 1) = O(2 + n)今どのように我々は1つのステップは、1つのステップを知っているつもりですか?あなたがコードであるとき、1つのステップである入力サイズに依存しません、そして、それが「N」または「M」または「A」または「B」ステップをするとき.(注:nを取る必要はありません.上の例で手順を理解しましょう.最初の行で変数を宣言しますsum に0を割り当てる.入力サイズが何であれ、入力サイズの原因に依存しません.それで、それは1歩です.次に、forループのために、ループのために、これは入力配列サイズに依存します.そして、それは配列の終わりまで入力配列のすべての要素を通り抜けそうです.それで、5つの要素があるならば、それは5回走ります、そして、100000の要素があるならば、それは10 , 000回走ります.そこで、ここで「N」の手順を取っています.とうとう帰りますsum 変数.入力サイズが何であれ、私たちはsum 変数は、なぜその1つのステップの入力に依存しません.
あなたがこれを理解するならば、あなたはビッグOの基本を学びました.🤩🤩🤩
さあ、別の面白い例に飛び込みましょう
 def print_square(number):
    for i in range(number):
        for j in range(number):
            print("*")
        print()

ここでは、入れ子になったループの助けを借りて四角形を描きます.私はすべてのループのための入れ子の作品を知ってほしい.この動画はお気に入りから削除されています.ループの最初の値は、入力番号が何度も実行されます.番号が「N」であると言う、そして、ループのための第1のループは「n」回を実行する.そして、ループのための秒は第1のループの各々の反復のための「n」回を走らせる.これは、合計N * N回を実行することを意味します.最初の例で思い出してください.ここでは、nループの内部にn個のn個のn = n ^ 2を乗算します.ここで大きなOはO ( N ^ 2 )です.次はprint() ループの最初の内部の文を実行します.n * 1 = n . 最後の大きいoは- o ( n + n ^ 2 )です.
あなたが上記のすべてのものを理解するならば、大きいOを学ぶことは現在あなたにケーキの一部です.
今、私はあなたに3つの楽しい小さな演習をしたい.自分で最初にそれらを解決してみてください.

第1問題


def sum(arr):
    sum = 0
    for i in range(len(arr)):
        sum += arr[i]

    for j in range(len(arr)):
        sum += arr[j]
ここでいくつかの理由で、我々は同じ配列を2回ループしています(注意:入れ子になったループではありません)、そして、我々はすべてのアイテムをsum 両方のループの変数.

2番目の問題


def sum_of_two_array(arr1, arr2):
    sum1 = 0
    sum2 = 0
    for i in range(len(arr1)):
        sum1 += arr[i]

    for j in range(len(arr2)):
        sum2 += arr[j]
これは前のものとほぼ同じです.しかし、ここで2つの入力配列が与えられます.両方の配列に対して"n "を取ることができないことを覚えておいてください.私たちは別の入力のための別の文字を取る必要があります.ここでの原因は、第1の入力配列は、100000であり、第2の入力アレイは、サイズ5である.今すぐ問題を解決してください.

第3の問題


def print_hash(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr2)):
            print("#")
この問題は、前のものと同じように2つの入力もあります.しかし、これは入れ子になっています.

解決策

  • o ( 2 n )
    ここではループの2つを別の次から次の.それぞれのループが"N "ステップをとると、合計ステップは- O ( n + n )= O ( 2 n )となる
  • O ( n + m )
    注意:ここで任意の文字を取ることができます.“M”を取る必要はありません.
    ここでは、2つの異なる配列を次々と繰り返していきます.これはO ( n + m )です
  • o ( n * m )
    ここではループの入れ子になっていますが、2つの異なる配列の上にあります.これはループの最初の反復処理のために、ループのために2番目の“m”回を繰り返します.(ここでMは2番目の配列の要素数です).したがって、最初のループが“n”回実行されると、合計ステップはO(n * m)になります
  • あなたはビッグの基本を知っています.今、私たちはビッグOを簡素化する方法について話します.
  • 最悪ケース
  • 定数の削除
  • 入力のための異なる条件
  • ドロップドミノ
  • 規則1:最悪ケース
    アルゴリズムの大きなOを見つけるときはいつも最悪のケースについて心配しています.これは最悪の場合にアルゴリズムがどれだけのステップになるかです.例
    def search(numbers, target):
        for i in range(len(numbers)):
            if numbers[i] == target:
                return  i
    
    このコードでは、与えられた数を探しています.今、その大きいoはどんなように見えますか?ターゲット番号が配列の最初のインデックスにあるとします.それから、我々はちょうど1つのステップを必要とします.これはo ( 1 )を意味する.しかし、ターゲット番号が配列の最後のインデックスにある場合はどうですか?次に、o ( n )の配列全体を反復処理する必要があります.次に、本当の大きなOは何ですか?本当の大きなOは、私たちが常に大きいOを見つけるとき、我々が常に最悪のケースについて心配しているので、最悪のケースのためにコードを最適化することができるならば、それは他のケースにも最適化されるつもりです.
    規則2 :定数の削除
    大きいoにどんな定数があるならば、あなたはそれを保つ必要はありません.最初の問題で理解しましょう
    def sum(arr):
        sum = 0
        for i in range(len(arr)):
            sum += arr[i]
    
        for j in range(len(arr)):
            sum += arr[j]
    
    私たちは、ここの大きいOがO(2 n)であるのを見ました.ここの本当の大きいoはO(n)が大きいOから定数を取り除かなければならない原因です.
    規則3:入力のための異なる用語
    この規則は問題2と3で学んだ.問題3でもう一度理解しましょう.
    def print_hash(arr1, arr2):
        for i in range(len(arr1)):
            for j in range(len(arr2)):
                print("#")
    
    ここで2つの別々の入力配列が与えられます.そこで、2つの異なる入力に対して2つの異なる文字や用語を取る必要があります.ここで、大きいOはO(n * m)です
    規則4:非ドミナントを落とす
    私たちは長い時間前に例を見ました.
     def print_square(number):
        for i in range(number):
            for j in range(number):
                print("*")
            print()
    
    
    ここでは、大きなOはO ( n + n ^ 2 )ですが、"n "は"N ^ 2 "より小さいので、ここでは"N "となり、ここでの実OはO ( N ^ 2 )です
    これらは4つの規則でした.今、あなたは任意のアルゴリズムのビッグOを見つけることができます.次の部分では有名な大きなOSについて話します.そちらにお会いしましょう.