big O

big Oํ‘œ๊ธฐ๋ฒ•์ด๋ž€

  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ฝ”๋“œ๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋กœ ๋น„๊ตํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•. ํ•œ ๋งˆ๋””๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ์„ ํ‘œ๊ธฐํ•ด์ฃผ๋Š” ํ‘œ๊ธฐ๋ฒ•

  • Big-O(๋˜๋Š” Big-Oh) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ๊ธฐ๋ฒ•

์ฝ”๋“œ๋ฅผ ์งค ๋•Œ ์ค‘์š”ํ•œ ์ 

  • faster?

  • less memory-intensive?

  • more readable?

๋ˆ„์ ๋œ ๊ฐ’ ๊ตฌํ•˜๊ธฐ

// ๋А๋ฆฐver
function addUpTo(n) {
  let total = 0;
  for (let i = 1; i <= n; i++) {
    total += i;
  }
  return total;
}

var t1 = performance.now();
addUpTo(1000000000);
var t2 = performance.now();
console.log(`Time Elapsed: ${(t2 - t1) / 1000} seconds.`);
// Time Elapsed: 0 seconds.

// ๋น ๋ฅธ ver
function addUpTo(n) {
  return (n * (n + 1)) / 2;
}

var time1 = performance.now();
addUpTo(1000000000);
var time2 = performance.now();
console.log(`Time Elapsed: ${(time2 - time1) / 1000} seconds.`);
// Time Elapsed: 0.9598000000119209 seconds.

๋น ๋ฅธ ver์€ addUpTo(n) ์˜ n์— ์–ด๋–ค ์ˆซ์ž๊ฐ€ ์˜ค๋”๋ผ๋„ 3๋ฒˆ์˜ ์—ฐ์‚ฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

(n * (n + 1)) / 2; : * + /

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ ์‹œ๊ฐ„์€ ๋งค๋ฒˆ ๊ฑฐ์˜ ๊ฐ™๋‹ค.

๋น ๋ฅธver O(1)

๋А๋ฆฐver O(n)


ex) 1

function countUpAndDown(n) {
  console.log('Going up!');
  for (let i = 0; i < n; i++) {
    console.log(i);
  }
// ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  console.log('At the top! \\nGoing down...');
  for (let j = n - 1; j >= 0; j--) {
    console.log(j);
  }
// ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  console.log('Back down. Bye!');
}

Going up!
0
1
...
9
At the top! 
Going down...
9
...
1
0
Back down. Bye!

10n

O(n) ์—ฐ์‚ฐ์€ countUpAndDown(n) ์˜ n๊ฐ’์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.

ex) 2

function printAllPairs(n) {
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      console.log(i, j);
    }
    // ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  }
  // ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
}

์—ฌ๊ธฐ์„œ์˜ big O๋Š” O(n^2)


big O ํ‘œํ˜„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ

O(2n) โ†’ O(n)

O(500) โ†’ O(1)

O(13n^2) โ†’ O(n^2)

  • O(500)์€ ์—ฐ์‚ฐ ๊ฐฏ์ˆ˜๊ฐ€ ์–ด๋–ค ์ƒํ™ฉ์—๋“  500๊ฐœ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป

function logAtLeast(n) {
  for(let i = 1; i <= Math.max(5, n); i++){
    console.log(i);
  }
}
// ์‹œ๊ฐ„๋ณต์žก๋„: O(n)

function logAtMost5(n) {
  for(let i = 1; i <= Math.min(5, n); i++){
    console.log(i);
  }
}
// ์‹œ๊ฐ„๋ณต์žก๋„: O(1)
function onlyElementsAtEvenIndex(array) {
    var newArray = Array(Math.ceil(array.length / 2));
    for (var i = 0; i < array.length; i++) {
        if (i % 2 === 0) {
            newArray[i / 2] = array[i];
        }
    }
    return newArray;
}
// ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
function subtotals(array) {
    var subtotalArray = Array(array.length);
    for (var i = 0; i < array.length; i++) {
        var subtotal = 0;
        for (var j = 0; j <= i; j++) {
            subtotal += array[j];
        }
        subtotalArray[i] = subtotal;
    }
    return subtotalArray;
}

// ์‹œ๊ฐ„๋ณต์žก๋„: O(n^2)

๊ณต๊ฐ„๋ณต์žก๋„

ex 1)

function sum(arr) {
  let total = 0;
  for (let i = 0; i < arr.length; i++) {
    total += arr[i];
  }
  return total;
}

// ๊ณต๊ฐ„๋ณต์žก๋„: O(1)

total ๋ณ€์ˆ˜์— 0์ด๋ผ๋Š” ์ˆซ์ž ํ• ๋‹น

i๋ณ€์ˆ˜์— 0์ด๋ผ๋Š” ์ˆซ์ž ํ• ๋‹น

๊ทธ๋Ÿฌ๋ฏ€๋กœ O(1)๊ณต๊ฐ„

ex 2)

function double(arr) {
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    newArr.push(2 * arr[i]);
  }
  return newArr;
}

// ๊ณต๊ฐ„๋ณต์žก๋„: O(n)

arr ์˜ ๊ธธ์ด๊ฐ€ 50์ด๋ฉด newArr์— 50์˜ ๊ธธ์ด๋งŒํผ ๋ฆฌํ„ดํ•œ๋‹ค.

์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์€ ์ž…๋ ฅ๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์™€ ๋น„๋ก€ํ•ด์„œ ์ปค์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ O(n) ๊ณต๊ฐ„

ex 3)

function subtotals(array) {
    var subtotalArray = Array(array.length);
    for (var i = 0; i < array.length; i++) {
        var subtotal = 0;
        for (var j = 0; j <= i; j++) {
            subtotal += array[j];
        }
        subtotalArray[i] = subtotal;
    }
    return subtotalArray;
}

// ๊ณต๊ฐ„๋ณต์žก๋„: O(n)

Last updated