1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【備忘録】Big O notationについて勉強した

Last updated at Posted at 2022-01-18

Big O notation

就活のためアルゴリズムやデータ構造の勉強を改めてやることにしました。今回 Big O 記法の勉強したのでそのまとめ。

まず、良いコードとは?

  1. Readable
  2. Scalable (Speed of runtime, Memory) -> Big O で測れる

コードを実行する際、それを実行するコンピューターの性能に依存するのではなく、プログラムそのものの性能を図るための指標として用いられる記法のこと。

Speed of runtime: インプット量が増える度に実行時間が比例してどのくらい増えるか(オペレーションの数が増えるか)

以下のチャートで、インプット数とオペレーションの数の関係がまとめられている。
プログラムを書く時、なるだけ Excellent になる Time Complexity を目指すべし。

Screen Shot 2022-01-17 at 21.09.32.png

基本

O(n) - Linear Time

インプットが増えるに伴い、オペレーションの数も比例して増える。

const arr = ['apple', 'banana', 'peach'];

function findApple(array) {
  for (let i = 0; i < array.length; i++) {
    if (array[i] === 'apple') {
      console.log('Found Apple!');
      // break ->見つけた時点で抜け出せるけど、最悪は最後までループするのでそのケースを想定
    }
  }
}

findApple(arr); // O(n)   --> Linear Time

O(1) - Constant Time

インプットが増えてもオペレーションの数は変わらない。必ず2回のオペレーションステップでい続けるので、グラフの場合線は並行である続ける。

const boxes = [0, 1, 2, 3, 4, 5];
function logFirstTwoBoxes(boxes) {
  console.log(boxes[0]); //O(1)
  console.log(boxes[1]); //O(1)
}

logFirstTwoBoxes(boxes); // O(2) everytime  -> O(1)

O(n^2) - Quadratic Time

ネストループ

// O(n^2)
const nums = ['a', 'b', 'c', 'd', 'e'];
function logAllPairsOfArray(array) {
  for (let i = 0; i < array.length; i++) {
    for (let j = 0; j < array.length; j++) {
      console.log(array[i], array[j]);
    }
  }
}

Time Complexity を計算する上でのルールがある。

BIG O ルール

  1. Worst Case

    (例:ループだと、一致するものを途中で見つける可能性もあるが、最悪のケース、毎回最後までループしなければいけないケースを想定する)

  2. Remove Constant

    (例:2n+ 100) -> O(n)となる。 より多くのインプット量を想定したとき、誤差の範囲内になる)

  3. Different terms of input

    (例:input が複数の場合。O(a + b) or O(a*b)と、Big O もそれぞれ用意。

    -> same indentation-> add

    -> anything different -> multiply というのが簡単な計算方法。

  4. Drop Non Dominants
    (2 と同じ考え方)
     

まとめ 

O(1) Constant

  • ループなし 

O(log N) Logarithmic

  • 通常は、Binary SearchなどのSearching AlgorithmsがO(log N) (ソートされてる前提)

O(n) Linear

  • n回for loopやwhile loopsを行う

O(n log(n)) Log Linear

  • 大抵はSorting operation

O(n^2) - Quadratic

  • コレクション内のすべての要素を比較する、 two nested loops

O(2^n) - Exponential

  • Nサイズの問題を解決するrecursive algorithm

O(n!) - Factorial

  • すべての要素にループを追加

 実行時間だけではなく、メモリの使用量もBig O で測ることができる。

Space Complexity

2 ways of storing memory 

Heap: store variables that are assigned 

stack: function calls

参考

こちらのUdemyで勉強しています。 
Master the Coding Interview: Data Structures and Algorithm

グラフの参考はこちらのサイトです。 
Big-O Cheat Sheet

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?