time complexity big o notation - Lee-hyuna/33-js-concepts-kr GitHub Wiki
μκ° λ³΅μ‘λμ λΉ μ€ νκΈ°λ²
μλ¬Έ: Time Complexity/Big O Notation
λͺ¨λ κ°λ°μλ€μ νλ² μ―€ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λμ λν μ§λ¬Έμ λ°μ λκ° μλ€. μ λλ‘νμ§ λ§μμΌ ν νμ΄νΈ 보λ μΈν°λ·° μ€μ΄κ±°λ νΉμ μμ λ°©μμ λν΄ λ€λ₯Έ κ°λ°μμ λννλ λμμΌ μλ μλ€. λΉ μ€ νκΈ°λ²μ μκ³ μ΄ν΄νλ©΄ κ°λ°μλ‘μ¨ μ ν리μΌμ΄μ μ μκ°νκ³ νμ±νλλ° λμμ μ€λ€.
λ΄κ° λ§νκ³ μ νλ λ°λ₯Ό μ΄ν΄νλ €λ©΄ λ¨Όμ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ₯Ό κ³μ°νλ λ°©λ²μ λν κ·μΉμ μ νκ³ μκ³ λ¦¬μ¦μ μ μν΄μΌνλ€.
μ°λ¦¬κ° 'μκ³ λ¦¬μ¦'μ΄λΌκ³ λ§ν λ μλ―Ένλ κ²μ κ²°κ³Όλ₯Ό μ°μΆνκΈ° μν΄ μμ μκ° λ°λΌμΌ ν μ μ λ λ¨κ³μ μ§ν©μ΄λ€. μλ₯Ό λ€μ΄, λ©ν μ μ§μμ 컀νΌλ₯Ό λ§λλ μκ³ λ¦¬μ¦μ λ€μκ³Ό κ°λ€.
- μ°¬μ₯μμ μ»΅μ κ°μ Έμ€κΈ°
- λ΄κ° μνλ 컀νΌκ°λ£¨λ₯Ό κ°μ Έμ€κΈ°
- 컀νΌλ©μ΄μ»€μ λ¬Όμ΄ μ΅μ μμ€ μ΄μμΈμ§ νμΈ
- μ»΅μ 컀νΌκ° λ΄λ €μ¬ κ³³μ λκΈ°
- 컀νΌκ°λ£¨λ₯Ό 컀νΌλ©μ΄μ»€ μμ λ£κΈ°
- 'μμ' λ²νΌ λλ₯΄κΈ°
- μ»΅μ΄ κ°λ μ°° λκΉμ§ κΈ°λ€λ¦¬κΈ°
- λ§μκΈ°
μ°¬μ₯μμ μ»΅μ κ°μ Έμ€λ λ°©λ²μ΄λ, κΈ°κ³ λ΄λΆμ 컀νΌκ°λ£¨λ₯Ό λ£λ λ°©λ²κ³Ό κ°μ μ¬λ¬ λ¨κ³κ° μμ§λ§, μμ μ»€νΌ ν μμ λ§λλ μκ³ λ¦¬μ¦μ κ³Όμ μ κ° λ¨κ³λ₯Ό κ°λ΅νκ² μ€λͺ νλ©°, μ΄λ¬ν λ¨κ³λ₯Ό λ°λ₯΄λ μ¬λμ μ»€νΌ ν μμ λ§λ€ μ μλ€.
μ»€νΌ μ¬λ¬μμ λ§λ€κ³ μΆμ μ¬λλ€μ λͺ©λ‘μ΄ μλ€λ©΄ μ΄λ¨κΉ? μ΄κ²μ΄ λ°λ‘ μκ° λ³΅μ‘λλ₯Ό λνλΈλ€.
μ»€νΌ ν μμ μνλ μ¬λ μ΄ n λͺ μ΄λΌκ³ κ°μ ν΄ λ³΄μ. μ»€νΌ ν μμ λ§λλ λ° κ±Έλ¦¬λ λ¨κ³μ μκ°μ λ§€λ² λμΌνκΈ° λλ¬Έμ n μμ μ»€νΌ λ₯Ό λ§λλ λ° n μκ° λ¨μκ° κ±Έλ¦½λλ€. λ°λΌμ 5 μ»΅μ 컀νΌλ 5 λ¨μμ μκ°μ΄ 걸리거λ Big O νκΈ°λ²μμλ O (5) κ° κ±Έλ¦°λ€. μ°λ¦¬κ° 100 μ»΅μ 컀νΌλ₯Ό λ§λ€κ³ μΆλ€λ©΄ O (100) μ΄ κ±Έλ¦΄ κ² μ΄λ€. κ·Έλ¬λ Big O νκΈ°λ²μ μ κ·Όμ νκΈ°λ² λλ 'μ λ ₯μ΄ λ¬΄νλλ‘ μ¦κ°ν¨μ λ°λΌ' νκΈ°νλ κ²μ΄ μΌλ°μ μ΄λ€. μ΄λ° μμΌλ‘, μ»€νΌ λ©μ΄νΉ μκ³ λ¦¬μ¦μ O(n) μ΄λ€.
μκ° λ³΅μ‘λ μΈ‘λ©΄μμ μκ³ λ¦¬μ¦μ νκ°νλ λ λ€λ₯Έ κ·μΉμ μ΅μ μ κ²½μ°λ₯Ό μ¬μ©νλ€λ κ²μ΄λ€. μ¦, 무μΈκ° O (n) λΌκ³ λ§ν λ μ΄ μκ³ λ¦¬μ¦μ 걸리λ μκ°μn κ°μ μμ μ λν΄ μμ μ μννλ λ° κ±Έλ¦¬λ μκ°κ³Ό κ°λ€ .
μ΄μ κ·μΉκ³Ό μ΄νλ₯Ό μ μ νμΌλ―λ‘ μ½λμμ μ΄ λͺ¨λ κ²μ΄ μ΄λ»κ² 보μ΄λμ§ μ΄ν΄λ³΄μ.
λ¨Όμ *O (1)*μ μ΄ν΄λ³΄μ. μ λ ₯ μμ΄λ ν¬κΈ°μ κ΄κ³μμ΄ μκ³ λ¦¬μ¦μ μννλ λ° νμ 1 λ¨μ μκ°μ΄ μμλ©λλ€. O (1) μΈ μκ³ λ¦¬μ¦μ μμ λ λ°°μ΄ λλ ν΄μ/κ°μ²΄μμ κ° νλͺ©μ μ κ·Όνλ κ²μ΄λ€.
// nκ°μ ν¬κΈ° 리μ€νΈ/κ°μ²΄κ° μμ κ²½μ°, ν΄λΉ μΈλ±μ€μμ κ°μ λ°ννλ λ° 1 λ¨μκ° μμλ¨
const valueAt = (key, obj) => obj[key];
λ°°μ΄μ μΈλ±μ€ κ°μ²΄ μΌ λΏμ΄λ―λ‘ μ΄ μκ³ λ¦¬μ¦μ ν΅ν΄ κ°μ²΄μ λ°°μ΄μ λͺ¨λ μ‘μΈμ€ ν μ μμΌλ©° λ λ€ λ©λͺ¨λ¦¬μ νΉμ μμΉμμ κ°μ κ²μνκ³ μμμ 보μ¬μ€λ€.
κ·Έλ λ€λ©΄, νμν νλͺ©μ μ°Ύμ λκΉμ§ μ 체 λͺ©λ‘μ κ²ν ν νμκ° μλ€κ³ κ°μ ν΄λ³΄μ. λ€μ λ§νλ©΄ μ°λ¦¬κ° νμν νλͺ©μ΄ λͺ©λ‘ 맨 λμ μκ±°λ μμ λͺ©λ‘μ μλ κ²μΌλ‘ νλ κ²μ΄λ€. μ¦, μ΅μ μ κ²½μ°λ₯Ό μ΄ν΄λ³΄λ κ²μ΄λ€. κ·Έλ λ€λ©΄ κ·Έ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ μΌλ§μΌκΉ?
// n ν¬κΈ°μ μ λ ¬λμ§ μμ λͺ©λ‘μ μ¬μ©ν κ²½μ° κ°μ μ°Ύλ λ° n λ¨μκ° μμλ¨
const indexOf = (val, list) => {
for (let i = 0; i < list.length; i++) {
if (list[i] === val) {
return i;
}
}
}
λ¨μΌ μ°μ°μ μννλ κ²μ΄ μλ 무μΈκ°λ₯Ό λ°λ³΅νκΈ° λλ¬Έμ μ΄ μκ³ λ¦¬μ¦μ λ μ€λ 걸릴 κ²μ΄λ€. κ°μ₯ μ’μ κ²½μ°λ κ°μ΄ 0
λ²μ§Έμ μμ΄μ μΌμ° λ°ν νλ κ²μ΄λ€. λ°λλ‘ μ΅μ
μ κ²½μ°λ νλͺ©μ΄ λ°°μ΄μ μκ±°λ λ°°μ΄μ 맨 λ§μ§λ§μ μλ κ²½μ°μ΄λ€. μ΅μ
μ κ²½μ° κ²°κ³Όλ₯Ό μ»λ λ° n μκ° μ΄ κ±Έλ¦°λ€ . μ΄ λλ¬Έμ μμ μκ³ λ¦¬μ¦μ O (n) λλ μ ν μκ³ λ¦¬μ¦μ΄λΌκ³ νλ€. 걸리λ μκ°μ λͺ©λ‘μμλ μμμ μμ λΉλ‘νμ¬ μ¦κ°νλ€.
λ€μμΌλ‘, O (nΒ²) μΈ μ ν μ λ ¬ μκ³ λ¦¬μ¦μ μλ₯Ό μ΄ν΄ 보μ . μ΄κ²μ μ΅μμ κ²½μ°μλ μκ° λ³΅μ‘μ± μΈ‘λ©΄ μμ μ΅μ μ λ°©λ² μ€ νλμ΄λ€. μ΄μ λ₯Ό μμ보μ.
const selectionSort = (list) => {
for (let i = 0; i < list.length; i += 1) {
let minJ = i;
for (let j = i + 1; j < list.length; j += 1) {
if (list[j] < list[minJ]) {
minJ = j;
}
}
const oldVal = list[i];
const newVal = list[minJ];
if (oldVal !== newVal) {
list[i] = newVal;
list[minJ] = oldVal;
}
}
return list;
};
μ μ리μμ κ° λ³κ²½νκΈ° μ΄ μΈμλ ,μ΄ μκ³ λ¦¬μ¦μ λμκ² λ§λλ κ²μ λͺ©λ‘μ λͺ¨λ λ°λ³΅μμ κ·Έ μμ λΆν° λλ¨Έμ§ λͺ©λ‘μ λ°λ³΅ν΄μΌνλ€λ κ²μ΄λ€. λͺ©λ‘μ΄ λμ΄λ¨μ λ°λΌ λ°λ³΅ νμλ κΈ°ν κΈμμ μΌλ‘ μ¦κ°νλ€.
μ΄ μ’κ²λ JavaScriptλ μκ° λ³΅μ‘μ±μ λν΄ λ무 κ±±μ ν νμμμ΄ λͺ©λ‘μ μ λ ¬νλ λ° μ¬μ©ν μμλ λ°°μ΄μ μ체 κ³ μ λ©μλμΈ sort
λ₯Ό ꡬννλ€. νμ§λ§ μ΄λ»κ² μ λ ¬ν κΉ? μ λ ¬ λ λͺ©λ‘μ νλͺ©μ μ΄λ»κ² μΆκ°ν κΉ?
μ°λ¦¬λ newList = [...list,1].sort()
λΌλ ν΄κ²°μ±
μ μ°Ύμ μ μμμ§λ§ λͺ¨λ μ½μ
μ λν΄ μ 체 λ°°μ΄μ λ°λ³΅ν΄μΌνλ€λ κ²μ μλ―Ένλ€. μ°λ¦¬λ μΌλ¨ μμ΄ν
μ΄ κ°λ κ³³μ μ°ΎμΌλ©΄ λλ¨Έμ§ λ°°μ΄λ μ ννλ€λ κ²μ μ μ μλ€.
μ½μ ν λλ§λ€ λ°λ³΅νλ κ²μ΄ μ΅μ μ κ²½μ°μΈ O(n)μ΄μ§λ§ μ΅μ μ κ²½μ° O(n)μ μΌμΉνμ§λ§ λ λμ κ²½μ°μΈ μκ³ λ¦¬μ¦μ λ§λ€ μ μλμ§ κΆκΈνλ€.
const insert = (compare = (a, b) => a < b, item, list) => {
let result = [];
let inserted = false;
for (let i = 0; i < list.length; i += 1) {
const val = list[i];
if (compare(val, item)) {
result.push(val);
} else {
result = result.concat(item, list.slice(i));
inserted = true;
break;
}
}
return inserted ? result : result.concat(item);
};
μμ μμ λ κ° νλͺ©μ λ°λ³΅νκ³ μ£Όμ΄μ§ νλͺ©λ³΄λ€ μμ μ§ νμΈνλ€. λ§μ½ κ·Έλ λ€λ©΄, μ°λ¦¬λ κ·Έ κ°μ μλ‘μ΄ λ°°μ΄μ μΆκ°νκ³ λ€μ 루νλ‘ κ³μ μ§ννλ€. κ·Έλ μ§ μμ κ²½μ°, μ£Όμ΄μ§ νλͺ©μ΄ λ€μμ μνλ€λ κ²μ μκ³ μμΌλ―λ‘ κ²°κ³Όλ₯Ό μ΄μ κ²°κ³ΌμΈ, λλ¨Έμ§ λͺ©λ‘μΌλ‘ μ€μ νλ€. κ·Έλ¬λ λλ‘λ μ λ¬ λ νλͺ©μ΄ λͺ©λ‘μ λμΌλ‘ ν΄μΌνλ€. μ΄λ₯Ό μκΈ° μν΄ μ°λ¦¬λ ν΄μμ μ·¨νκΈ° μ μ κΉλ°μ μ€μ νκ³ λμμ¬ λ νμΈνλ€.
μμ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ μ΅μ μ κ²½μ° *O (n)*μ΄λ€. νλͺ©μ΄ λͺ©λ‘μ λ€λ₯Έ νλͺ©λ³΄λ€ ν¬λ©΄ λͺ¨λ νλͺ©μ λ°λ³΅νμ¬ κ³μ°ν΄μΌνκΈ° λλ¬Έμ΄λ€. κ·Έλ¬λ κ°μ₯ μ’μ κ²½μ°λ κΈ°λ³Έμ μΌλ‘ *O (1)*μ΄λ€. μ λ¬ λ νλͺ©μ΄ λͺ©λ‘μ 맨 μμ μμ΄μΌνλ―λ‘ μ²« λ²μ§Έ λ°λ³΅μμ 루νμμ λ²μ΄λ μ μκΈ° λλ¬Έμ΄λ€.
λ λΉ λ₯Έ λ°©λ²μ μμκΉ?
λͺ¨λ λͺ©λ‘ νλͺ©μ κ²μνμ§ μκ³ λ°λ³΅ ν λλ§λ€ λ€μμ μ°ΎμμΌ ν μμΉμ λν μ 보λ₯Ό μ»μ μ μλ€λ©΄ μ΄λ»κ² λ κΉ? λ°°μ΄ μ 체λ₯Ό μ λ ¬νλ λμ μ λ ¬λκΈ° λλ¬Έμ μμ μμκ² λ€μκ³Ό κ°μ΄ λ§ν μ μλ€. "μ΄λ² λ°λ³΅μ λν κ²°κ³Όλ₯Ό λ°νμΌλ‘ λ€μμ μ΄ν΄λ³Ό νμ λͺ©λ‘μ΄ μλ€."
μ°λ¦¬κ° μ€λͺ νλ κ²μ μ΄μ§ κ²μμ΄λ©° μκ° λ³΅μ‘λλ₯Ό ν¬κ² μ€μΈλ€. κΈ°λ³Έμ μΌλ‘ μμ μμκ² λͺ©λ‘ μ€κ°μ μ΄ν΄λ³΄κ³ μ λ¬ν νλͺ©κ³Ό μ€κ° μμΈμ νλͺ©μ λΉκ΅νλλ‘ μ§μν©λλ€. κ·Έλ° λ€μ κ·Έ κ²°κ³Όμ λ°λΌ 루νμ λ€μ λ°λ³΅ μ€μ λͺ©λ‘μ μλ°λΆ λλ νλ°λΆλ₯Ό κ²μνλ€. μ°λ¦¬λ κ° λ¨κ³λ₯Ό μννμ¬ μ΅λ μΈλ±μ€μ μ΅μ μΈλ±μ€ μ νκΉμ§ λͺ©λ‘μ λ°μΌλ‘ μλ₯΄κ³ μ€κ°μ νλͺ©κ³Ό λΉκ΅νλ€. μΌλ¨ κ·Έλ κ²νλ©΄ μ°λ¦¬λ μ£Όμ΄μ§ νλͺ©μ΄ μ΅μ μΈλ±μ€ λ°λ‘ λ€μμ κ°μΌνλ€λ κ²μ μλ€.
const insert = (fn = (a, b) => a < b, item, list = []) => {
if (!list.length) {
return [item];
}
if (list.length === 1) {
return fn(item, list[0]) ? [item, list[0]] : [list[0], item];
}
let min = 0;
let max = list.length - 1;
while (true) {
if (max < min) {
return list.slice(0, min).concat([item], list.slice(min));
}
const currIndex = Math.floor((min + max) / 2);
const currItem = list[currIndex];
const sort = fn(item, currItem);
if (sort) {
max = currIndex - 1;
}
if (!sort) {
min = currIndex + 1;
}
}
};
μΈμμ μλ₯Ό νμ₯νκ³ λ λ§μ λ‘μ§λ€μ μΆκ°ν΄μΌνμ§λ§ μκ³ λ¦¬μ¦μ κ²μ λΆλΆμ O (n)(μ ν) μμ O (log n)(λ‘κ·Έ)λ‘ λ³κ²½νλ€. μ λ ₯μΌλ‘ μ 곡λλ μ λ ¬ λ λͺ©λ‘μ΄λ―λ‘ κ²μ μ€μ μμ μκ° μνν΄μΌνλ λ°λ³΅ νμλ₯Ό μ€μ¬ μκ° λ³΅μ‘μ±μ μ€μΈλ€.
μλμμ λ€μν μ νμ μκ° λ³΅μ‘λμ n μ΄ μ»€μ§ λ μλ‘ λΉκ΅νλ λ°©λ²μ λ³Ό μ μλ€.
μ ν μκ° λ³΅μ‘λ, μ¦ *O(n)*κ° μ²μμλ λ‘κ·Έ μκ° λ³΅μ‘λ(O(log n)), λ³΄λ€ λ μ±λ₯μ΄ λ°μ΄λμ§λ§, μ λ ₯μ ν¬κΈ°κ° 컀μ§λ©΄ *O(log n)*κ° μ€μ λ‘ μ’λ€λ κ²μ μ μ μλ€.
μ΄κ²λ€μ κ³Όμ° μ€μν κΉ?
μκ° λ³΅μ‘λμ λν λ¬Έμ λ λ€μκ³Ό κ°μ΅λλ€. λ―ΈμΈ μ΅μ νκ° μ½κ³ DOMμΌλ‘ μμ
ν λμ κ²½νμΌλ‘λ ν΄κ²°ν λ¬Έμ κ° κ±°μ μμ κ²μ΄λ€. ramda λλ lodashμ κ°μ λΌμ΄λΈλ¬λ¦¬ ν¨ν€μ§κ°μλ κ²½μ° ν΄λΉ insert
/ sorts
/ etc
λ₯Ό μ¬μ©ν΄λΌ. [...list,item].sort()
λ₯Ό 100 λ² μ λ λ°λ³΅ν΄λ λ¬Έμ κ° λμ§ μμ κ²μ΄λ€.
κ·Έλ λ€λ©΄ μ μμμΌ ν κΉ? μ½λ μ±λ₯μ λ¬Έμ κ°λμ§ μλλ€λ©΄ μ΄ μ΄μν μνμ μ΄ν΄νλ λ° μ΄λ €μμ κ²ͺλ μ΄μ λ 무μμκΉ?
μ΄λ¬ν ν₯λ―Έλ‘μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄ μκ° λ³΅μ‘λκ° μ μΌν μΆλ°μ μ΄λ€.