Big O Notation in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
μλ¬Έ μΆμ²: https://medium.com/cesars-tech-insights/big-o-notation-javascript-25c79f50b19b
"Big O Notation"μ΄λ 무μμΈκ°?
μ΄κ²μ κ°λ°μλ€μκ² λ§€μ° νν λ©΄μ μ§λ¬Έμ
λλ€.
κ°λ¨ν λ§ν΄μ, μ
λ ₯ μκ°μ λ°λΌ μκ³ λ¦¬μ¦μ΄ μ€νλλ λ° κ±Έλ¦¬λ μκ°μ μνμ μΌλ‘ ννν κ²μΈλ°, λ³΄ν΅ μ΅μ
μ κ²½μ° μλ리μ€μ λν΄ μ΄μΌκΈ°ν©λλ€.
μ€μ λ‘, μ°λ¦¬λ Big O Notationμ μ¬μ©νμ¬ μ
λ ₯ ν¬κΈ°μ λ³νμ λμνλ λ°©μμΌλ‘ μκ³ λ¦¬μ¦μ λΆλ₯ν©λλ€.
κ·Έλμ μ¦κ°μ¨μ΄ λμΌν μκ³ λ¦¬μ¦μ λμΌν Big O NotationμΌλ‘ ννλ©λλ€. ν¨μμ μ±μ₯λ₯ μ ν¨μμ μμλΌκ³ λ νκΈ° λλ¬Έμ Oμλ₯Ό μ¬μ©ν©λλ€.
μ΄κ²μ μλ κ²μ΄ μ μ€μν κΉμ? Big Oλ₯Ό μλ©΄ κ°λ°μκ° μκ³ λ¦¬μ¦μ ν¨μ¨μ±μ μΈμ§νκ³ μ±λ₯μ΄ μ’μ μ ν리μΌμ΄μ μ λ§λ€ μ μλλ‘ λμμ€λλ€.
μΌλ°μ μΌλ‘ μκ³ λ¦¬μ¦μ 첫 λ²μ§Έ λ²μ μ΄ κ°μ₯ ν¨μ¨μ μΈ μ루μ
μ΄ μλλΌ κ°μ₯ λΉ λ₯Έ μ½λν λ²μ μ΄λΌκ³ κ°μ ν μ μμ΅λλ€.
ν₯ν λ²μ μμλ λ ν¨μ¨μ μΈ μ루μ
μΌλ‘ κ΅μ²΄λ κ²μΌλ‘ κ°μ ν©λλ€. μ΄λ 민첩ν κ°λ°, νΉν ν
μ€νΈ κΈ°λ° κ°λ°μμ λ§€μ° μΌλ°μ μΈ λ°©μμ
λλ€.
λλ‘λ λ μ μ μκ°(λ¬Έμ)μ μ¬μ©νλ λμ (λλ λ μ μ λ©λͺ¨λ¦¬μ) λ μ μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ λ° μ΄μ μ λ§μΆκΈ°λ₯Ό μνκΈ°λ ν©λλ€. μΌλ°μ μΌλ‘ μκ° μ μ½κ³Ό κ³΅κ° μ μ½ μ¬μ΄μ μ μΆ©μ΄ μ΄λ£¨μ΄μ§λλ€. μ½κΈ° μκ° μ μ½κ³Ό λμ€ν¬ κ³΅κ° μ μ½ κ°μ λλ κ΄κ³ν(μ κ·νλ) λ°μ΄ν°λ² μ΄μ€μ λΉκ΄κ³ν(λΉμ κ·νλ) λ°μ΄ν°λ² μ΄μ€λ₯Ό λΉκ΅ν λλ μ΄λ¬ν κ· νμ νμΈν μ μμ΅λλ€.
μ΄μ κ°μ₯ μΌλ°μ μΈ μ νμ Big O Notationsμ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€. JavaScript(ECMA6)λ₯Ό μ°Έμ‘° μΈμ΄λ‘ μ¬μ©νμ§λ§ λ€λ₯Έ μΈμ΄μλ λμΌν μλ¦¬κ° μ μ©λ©λλ€.
λ³ν¨μλ μκ°μ λν μκ³ λ¦¬μ¦
O(1) β βOrder 1β
νμ§λ§ μμ§ μ΄ μμμμλ 볡μ‘μ±(νλͺ© μ)μ κ΄κ³μμ΄ μκ°(λ¬Έμ)μ΄ μΌμ ν©λλ€.
μ ν λλ κΈΈμ΄μ κ΄κ³μμ΄ μ΄λ―Έ μλ €μ§ λ°°μ΄ μμΉμ μλ μμλ₯Ό λ°ννλ μκ³ λ¦¬μ¦μμ μ΄ μ 보λ₯Ό λ³Ό μ μμ΅λλ€.
μμ μ½λ:
const getLast = items =>
items[items.length-1];
μμ μΌμ΄μ€:
getLast(['a', 'b', 'c', 'd']); // d (1 iteration)
getLast(['a', 'b', 'c', 'd', 'e', 'f', 'g']);// g(1 iteration)
μ ν μκ° μκ³ λ¦¬μ¦
O(N) β βOrder Nβ
μ΄ μμμμ μ΅μ μ κ²½μ° μκ°(λ¬Έμ)μ νλͺ© μμ ν¨κ» μ¦κ°ν©λλ€. μ¦, N μμμ κ²½μ° N λ°λ³΅μ΄ νμν©λλ€.
μμ μ½λ:
const findIndex = (items, match) => {
for (let i = 0, total = items.length; i < total; i++)
if (items[i] == match)
return i;
return -1;
};
μμμΌμ΄μ€:
const array= ['a', 'b', 'c', 'd'];
findIndex(array, 'a'); // 0 (1 iteration - best case)
findIndex(array, 'd'); // 3 (4 iterations - worst case)
findIndex(array, 'e'); // -1 (4 iterations - worst case)
Quadratic - time μκ³ λ¦¬μ¦
O(N 2 ) β βOrder N squaredβ
μ΄λ¬ν μ’ λ₯μ μμμ κ²½μ° μ΅μ μ κ²½μ° μκ°(λ¬Έμ)μ μ λ ₯ μμ μ κ³±μ λλ€. μκ°μ μ λ ₯ μμ κ΄λ ¨νμ¬ κΈ°νκΈμλ‘ μ¦κ°ν©λλ€.
μμ μ½λ:
const buildSquareMatrix = items => {
let matrix = [];
for (let i = 0, total = items.length; i < total; i++){
matrix[i] = [];
for (let j = 0, total = items.length; j < total; j++)
matrix[i].push(items[j]);
}
return matrix;
};
μμ μΌμ΄μ€:
buildSquareMatrix(['a', 'b', 'c']);
/* 9 iterations for 3 elements, returns:
[
['a', 'b', 'c'],
['a', 'b', 'c'],
['a', 'b', 'c']
]
/*
λ‘κ·Έ μκ° μκ³ λ¦¬μ¦
O(log n) β βOrder log Nβ
search/sort μκ³ λ¦¬μ¦μ κΈ°λ³Έμ΄λ©°, λκ·λͺ¨ μμ§μ μ²λ¦¬ν λ κ°μ₯ ν¨μ¨μ μΈ μ κ·Όλ°©μμ
λλ€.
κ΅¬μ± μμλ₯Ό νλμ© μ΄ν΄λ³΄λ λμ λ°μ΄ν°λ₯Ό λ©μ΄λ¦¬λ‘ λΆν νκ³ λ§€ λ°λ³΅, λ³΄ν΅ μ λ° λλ λ‘κ·Έ λ² μ΄μ€ 2μ λ§μ μμ λλΉν©λλ€.
λ‘κ·Έ λ² μ΄μ€ 2λ₯Ό μ¬μ©νλ€κ³ κ°μ ν κ²½μ°, 20κ° λ―Έλ§μ λ°λ³΅μ μ¬μ©νλ 100λ§ κ°μ μμ μ§ν©μμ νΉμ μμλ₯Ό μ°Ύμ μ μμ΅λλ€. μμ§ ν¬κΈ°λ₯Ό 10μ΅ κ°λ‘ νμ₯νλ©΄ 30κ° λ―Έλ§μ λ°λ³΅λ§ νμν μ μμ΅λλ€.
λΉ λ°μ΄ν°λ λ§€μΌ λ ννκ² μ¬μ©λλ―λ‘ μμ§ κ·λͺ¨κ° ν΄μλ‘ μλμ μΌλ‘ ν¨μ¨μ±μ΄ λμμ§κΈ° λλ¬Έμ μ΄λ¬ν μκ³ λ¦¬μ¦μ μ΄μ μ μ½κ² νμΈν μ μμ΅λλ€.
μ΄ μκ³ λ¦¬μ¦ μ€ κ°μ₯ λ리 μ¬μ©λλ μκ³ λ¦¬μ¦μ νΉμ μμλ₯Ό μ°Ύκ±°λ λͺ©λ‘μ λ§€μ° ν¨μ¨μ μΌλ‘ μ λ ¬νλ λ° μ¬μ©ν μ μλ Quick sort μκ³ λ¦¬μ¦μ λλ€. μ΄ μμμ λ λ€λ₯Έ μΈκΈ° μλ μλ λ³ν© μ λ ¬ μκ³ λ¦¬μ¦μ λλ€. ν₯ν κΈ°μ¬μ λν μ΄λ¬ν μκ³ λ¦¬μ¦μ μ΄ν΄λ³΄κ² μ΅λλ€.
μμ μ½λ:
const quickSort = list => {
if (list.length < 2)
return list;
let pivot = list[0];
let left = [];
let right = [];
for (let i = 1, total = list.length; i < total; i++){
if (list[i] < pivot)
left.push(list[i]);
else
right.push(list[i]);
}
return [
...quickSort(left),
pivot,
...quickSort(right)
];
};
μμ μΌμ΄μ€:
quickSort( ['q','a','z','w','s','x','e','d','c','r']);
// ["a", "c", "d", "e", "q", "r", "s", "w", "x", "z"]
μ΄κ²μ΄ κ°μ₯ μΌλ°μ μΈ μ νμ μκ³ λ¦¬μ¦μ λ€λ£¨λ λ°©λ²μ λλ€. κ²μ λ° μ λ ¬ μκ³ λ¦¬μ¦μ λν΄ μμΈν μ½μ΄λ³΄μκΈ° λ°λλλ€.