Algorithms and Big O Notation
What are algorithms and why should you learn them?
1. What algorithms are better? π©β
μ½λλ₯Ό μμ±νκ³ , μκ³ λ¦¬μ¦μ ꡬνν λ μ€μνκ² μκ°ν΄μΌ νλ κ²μ λ€μκ³Ό κ°λ€.
- μΌλ§λ λΉ λ₯Έκ°?
- μΌλ§μ μ μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλκ°?
- μΌλ§λ μ½κΈ° μ¬μ΄κ°?
2. How faster? π©β
μκ³ λ¦¬μ¦μ ꡬννλ©° μΌλ§λ λΉ λ₯Έκ°λ₯Ό μΈ‘μ νλ €λ©΄ λ¬Έμκ° μ΄λ¦° μκ°μΌλ‘λΆν° κ°λλλ νμ΄λ¨Έ ν¨μλ₯Ό μ¬μ©ν μ μλ€.
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
let t1 = performance.now();
addUpTo(1000000000);
let t2 = performance.now();
console.log(`Time Elapsed: ${(t2 - t1) / 1000} seconds.`)
μΈ‘μ νκ³ μ νλ μ½λμ μ νμ performance.now()
ν¨μλ‘ μκ°μ μΈ‘μ ν΄ λ μκ°μ°¨λ₯Ό ꡬν¨μΌλ‘μ¨ μ€ν μκ°μ ꡬν μ μλ€. νμ§λ§
μ΄λ°μμΌλ‘ μ½λμ μ€ν μκ°μ μΈ‘μ νλ κ²μ΄ νμ μ’μ λ°©λ²μ μλλ€. μ¬λ¬ κ°μ λ§€μ° λΉ λ₯Έ μκ³ λ¦¬μ¦ μ€μμλ κ°μ₯ λΉ λ₯Έ μκ³ λ¦¬μ¦μ΄
μ‘΄μ¬ν ν
λ° λ무 λΉ λ₯΄κ² μ€νλλ κ²½μ° νΈμ°¨λ‘ μΈν΄ μ νν κ²°κ³Όλ₯Ό μ»κΈ° νλ€λ€. λλ‘λ λ무 μ€λ 걸리λ μκ³ λ¦¬μ¦μ΄μ΄μ μ€μ κ²°κ³Όλ₯Ό νμΈνλ
λ° λ무 λ§μ μκ°μ΄ μλͺ¨λ μ μλ€. λν μ΄ λ°©λ²μ μ»΄ν¨ν°μ μ±λ₯μ μν₯μ λ°λλ€.
μ§μ μκ°μ μΈ‘μ νλ κ² λ³΄λ€ μ’μ λ°©λ²μ μ»΄ν¨ν°κ° μ²λ¦¬ν΄μΌνλ μ°μ° κ°μλ₯Ό μΈλ κ²μ΄λ€.
n μ΄ μΌλ§λ ν° μμ΄λ μκ΄ μμ΄ 3 λ²μ μ°μ°
μ΄ λ°μνλ€.
5n + 2 λ²μ μ°μ°
μ΄ λ°μνλ―λ‘ n μ΄ ν΄μλ‘ μ°μ° νμ λν λμ΄λλ€.
μ΄λ¬ν νν λ°©μμ Big O
λΌ νλ€.
3. Big O Definition π©β
1. Time Complexity
μκ³ λ¦¬μ¦μ΄ O(f(n))
μ΄λΌλ κ²μ μ°μ°ν΄μΌ ν n
μ΄ μ¦κ°ν¨μ λ°λΌ μ΅λ μ°μ° νμ
f(n)
μ΄ μΌλ§λ νμνμ§λ₯Ό λνλΈλ€.
f(n) = n
: linearf(n) = nΒ²
: quadraticf(n) = 1
: constant
function addUpTo(n) {
return n * (n + 1) / 2;
}
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
μ ν¨μλ νμ 3λ²μ μ°μ°μ νκ³ , μλ ν¨μλ 5n + 2 λ²μ μ°μ°μ νλ€. νμ§λ§ λ΄λΆμ μΌλ‘ n λ²μ΄λ , 5n λ²μ΄λ n μ΄ μ»€μ§λ©΄
κ·Έλνλ₯Ό νννλ λ° μμ΄ μ΄κ²μ ν¬κ² μ€μνμ§ μλ€. μ€μν κ²μ μ§μμ΄λ€. λ°λΌμ μ ν¨μλ O(1)
μΌλ‘ ννλ μ μκ³ ,
μλ ν¨μλ O(n)
μΌλ‘ ννλ μ μλ€.
μ ν¨μμ κ²½μ°, O(n)
λ²μ μ°μ°μ΄ 2λ² μμΌλ―λ‘ Big O κ° O(2n)
μ΄λΌ μκ°ν μ μμΌλ, λ΄λΆ μ°μ°μ΄ n λ²μ΄λ , 5n λ²μ΄λ μ¬μν
κ²μ 무μν μ± κ·Έλνμ ν° κ·Έλ¦Όλ§ λ³΄κΈ°λ‘ νλ€. κ·Έλ¬λ―λ‘ μ΄κ²μ μ¬μ ν O(n)
μ΄λ€.
μ 무μν κΉ? 1μ°¨ λ°©μ μμ΄
f(n) = n
μ΄λ ,f(n) = 2n
μ΄λ ,f(n) = 100n
μ΄λ 2μ°¨λ°©μ μκ³Ό λΉκ΅νλ©΄ κ²°κ΅ κΈ°μΈκΈ°λ ν¬κ² μ€μνμ§ μκΈ° λλ¬Έμ΄λ€. 1μ°¨ λ°©μ μf(n) = 10000n
μ΄ λμ΄λ΄€μ 2μ°¨ λ°©μ μf(n) = nΒ²
μ λΉνλ©΄ μ§μ μμ²΄κ° λ¬λΌμ§κΈ° λλ¬Έμ΄λ€. λ°λΌμ μ΄ κ²½μ°, μμ μ΄λ€ κΈ°μΈκΈ° μμκ°μ΄ λΆμλμ§λ μ ν μ€μνμ§ μλ€.
μ ν¨μμ κ²½μ°λ λ΄λΆ μ°μ° νμλ₯Ό 무μνμ§ μλλ€. O(n)
μ μ°μ° μμ O(n)
μ μ°μ°μ΄ μ€μ²©λμ΄ μκΈ° λλ¬Έμ΄λ€. μμμ μ΄μΌκΈ° νλ―μ΄
1μ°¨ λ°©μ μμμ 2μ°¨ λ°©μ μμΌλ‘ λμ΄κ°λ κ²μ΄λ€. μ΄κ²μ O(n * n)
μ΄ λμ΄ O(nΒ²)
μ΄ λλ€.
μ½κ² λ§ν΄, μμλ 무μν μ± νννλ€κ³ μκ°νλ©΄ λλ€.
O(232n + 10)
μ μμκ°μ 무μν μ±O(n)
μΌλ‘ νκΈ°νλ€.O(500000000)
μ μμκ°μ 무μν μ±O(1)
μΌλ‘ νκΈ°νλ€.O(13nΒ² + 13)
μ μμκ°μ 무μν μ±O(nΒ²)
μΌλ‘ νκΈ°νλ€.O(nΒ² + 500n)
μ μμκ°μ 무μν μ±O(nΒ²)
μΌλ‘ νκΈ°νλ€.μ¬μν μ°μ°μ 무μνλ μ΄μ λ μ»΄ν¨ν°κ°
2 + 2
λ₯Ό μ²λ¦¬νλ μκ°κ³Ό100λ§ + 2
λ₯Ό μ²λ¦¬νλ μκ°μ λΉμ·νκΈ° λλ¬Έμ΄λ€.
JavaScript μμ Time Complexity λ₯Ό μ΄μΌκΈ° ν λ κ·μΉμ΄ μλ€.
- μ°μ μ°μ°μ
constant
λ€. - λ³μ ν λΉμ
constant
λ€. - array μ index λ‘ μ κ·Όνκ±°λ object μ key λ‘ μ κ·Όνλ κ²μ
constant
λ€. - loop μμ μ΄λ€ μ°μ°μ΄ μ‘΄μ¬νλ , loop μ κΈΈμ΄λ§νΌ μ°μ°νλ€(μ€μ²© loop λ₯Ό μ΄μΌκΈ° νλ κ²μ΄ μλλ€).
loop μ μ€μ²©μ΄ 2νμΈ κ²λ§ ν΄λ μμ²λ μ°μ°μ μννκΈ° λλ¬Έμ loop μ€μ²©μ 3νμ© νλ μ½λλ μμ±νμ§ μκΈ° λλ¬Έμ λλΆλΆμ μΆμΈλ λ€μκ³Ό κ°μ΄ ννλλ€.
Examples
function logAtLeast5(n) {
for (var i = 1; i <= Math.max(5, n); i++) {
console.log(i);
}
}
μ½κ² μμν μ μλ―μ΄ O(n)
μ΄λ€.
function logAtMost5(n) {
for (var i = 1; i <= Math.min(5, n); i++) {
console.log(i);
}
}
μ΄ κ²½μ°λ O(n)
μ΄λΌ μκ°ν μ μμΌλ, μ΄ ν¨μλ n μ΄ μ»€μ Έλ μλ¬΄λ° μν₯μ λ―ΈμΉμ§ λͺ»νλ€. n μ΄ μ무리 μ»€μ Έλ μ΅λ
5λ²μ΄λ€. λ°λΌμ O(1)
μ΄λ€.
2. Space Complexity
Time Complexity κ° μκ³ λ¦¬μ¦μ μμ μκ°μ λ€λ£¨μλ€λ©΄, Space Complexity, κ³΅κ° λ³΅μ‘λλ μκ³ λ¦¬μ¦μ λ©λͺ¨λ¦¬ μ¬μ©λμ λ€λ£¬λ€.
κΈ°λ³Έμ μΌλ‘, μ
λ ₯κ° n μ΄ μ»€μ§μλ‘, νμλ‘ νλ 곡κ°μ΄ 무νλλ‘ λμ΄λλ€. νμ§λ§ μ¬κΈ°μ μ΄μΌκΈ°νλ λ©λͺ¨λ¦¬ μ¬μ©λμ
μ
λ ₯λλ κ²μ μ μΈνκ³ μκ³ λ¦¬μ¦ μμ²΄κ° νμλ‘ νλ 곡κ°(λ©λͺ¨λ¦¬ μ¬μ©λ)
μ μλ―Ένλ€.
JavaScript μμ Space Complexity λ₯Ό μ΄μΌκΈ° ν λ κ·μΉμ΄ μλ€.
- λλΆλΆμ boolean, number, undefined, null μ
constant space
λ€. - String μ λ¬Έμμ΄μ κΈΈμ΄λ§νΌ
O(n)
μ 곡κ°μ μ°¨μ§νλ€. - Reference Types(array, object)λ λ°°μ΄μ κΈΈμ΄, key μ κ°μλ§νΌ
O(n)
μ 곡κ°μ μ°¨μ§νλ€.
number 2κ°μ΄λ―λ‘ 1 + 1
μ΄λ€. λλ€ constant μ΄λ―λ‘ O(1)
μ΄ λλ€.
array κ° κΈΈμ΄λ§νΌ λμ΄λλ―λ‘, O(n)
μ΄ λλ€.
3. log complexity
f(n) = nΒ² + 8n + 24
λ nΒ² + 8n + 24 = 0
μ΄ λλ μ΄μ°¨ λ°©μ μμ ν΄λ₯Ό ꡬνλ κ²μΌλ‘, μ΄ μΌμ΄μ€μ complexity λ
f(n) = nΒ²
μλ€.
μ°λ¦¬λ μ΄λ€ κ°μ λ²μκ° λ§€μ° ν¬κ±°λ linear νμ§ μκ³ λ°°μλ‘μ¨ μ¦κ°νκ±°λ κ°μνλ κ²½μ°(i.e. μ§λ, μνμ λΆν¨ μ§μ, μνμ 볡리) λ‘κ·Έλ₯Ό μ·¨ν΄ λ¨μν μν¨λ€. μ»΄ν¨ν°μμ μ΄κ²μ΄ μ€μν μ΄μ λ μ΄λ€ νμ μκ³ λ¦¬μ¦λ€ μμ νμ ν΄μΌ ν λμμ λ²μκ° λ§€μ° μ»€ log λ₯Ό μ¬μ©ν μμμΌλ‘ 볡μ‘λκ° ννλλ κ²½μ°κ° μ‘΄μ¬νκΈ° λλ¬Έμ΄λ€.
λΉμ°ν μ§μν¨μμ λ§μ°¬κ°μ§λ‘ λ‘κ·Έν¨μλ κ·Έλν μΆμΈμ ν° μν₯μ λ―ΈμΉμ§ μλ μ¬μν κ²λ€μ 무μνκ³ ννμ νλ€. μλ₯Ό λ€μ΄
log(nΒ² + 500n + 2000)
μ΄λΌ νλλΌλ κ·Έλν μΆμΈμ μν₯μ λ―ΈμΉλ log(nΒ²)
λ§ λ³΄κΈ°λ‘ νλ κ²μ΄λ€.
4κ°μ λ‘κ·Έ λ°©μ μ
log2n
, log3n
,
log2n10
, log2n100
μ μλ‘ λ€μ΄λ³΄μ.
κΈ°μΈκΈ°λ₯Ό λΉκ΅ν΄λ³΄λ©΄ log3n
< log2n
< 10log2n
< 100log2n
κ° λλ€.
μ¬κΈ°μ ν΅μ¬μ 0 < log3n < n
λΌλ κ²μ΄λ€. λ§μ°¬κ°μ§λ‘ 0 < log2n < n
,
n < 10log2n < nΒ²
, n < 100log2n < nΒ²
κ΄κ³κ° μ±λ¦½λλ€.
μ¦, λ°μ΄ μΌλ§μΈμ§, μμ κ³±ν΄μ§λ μκ° μΌλ§μΈμ§λ ν¬κ² μ€μνμ§ μλ€. μμ΄ μλ μλκ° μ€μν
κ²
μ΄λ€. λ°λΌμ, log n
λλ nlog n
λ μΌμ΄μ€λ‘ ννν μ μλ€.
μ΄λ€μ κΈ°μΈκΈ°μ λ°λ₯Έ κ·Έλν μΆμΈ κ΄κ³λ₯Ό νννλ©΄, O(log n)
μ O(1)
κ³Ό O(n)
μ¬μ΄μ μμΉνκ³ , O(nlog n)
μ O(n)
κ³Ό
O(nΒ²)
μ¬μ΄μ μμΉνκ² λλ€.
κ·Έλμ μμ κ°μ κ·Έλνκ° λμ€κ² λλ κ²μ΄λ€.
4. Object and Array π©β
1. Object
μΌλ°μ μΌλ‘ νλ‘κ·Έλλ° μΈμ΄μμ Key-Value
Types μ νΉμ§μ Hash Tables λ₯Ό κΈ°λ°μΌλ‘
νκΈ° λλ¬Έμ κΈ°λ³Έμ μΌλ‘ Unordered Collection
μ΄λ©°, λΉ λ₯Έ μλμ access, insertion, removal μ μ ν©ν λ°μ΄ν° νμ
μ΄λ€.
λ°λΌμ μΌλ°μ μΌλ‘ λ€μκ³Ό κ°μ νΉμ±μ κ°λλ€.
- Access:
O(1)
- Insertion:
O(1)
- Removal:
O(1)
- Searching:
O(N)
λ°λΌμ μ£Όμ λ©μλμ Time Complexity λ λ€μκ³Ό κ°λ€.
- Object.keys:
O(N)
- Object.values:
O(N)
- Object.entries:
O(N)
- hasOwnProperty:
O(1)
Object.keys(instructor) // O(N)
instructor.hasOwnProperty('firstName') // O(1)
λ¬Όλ‘ , μΈμ΄λ§λ€
LinkedHashMap
κ³Ό κ°μOrdered Collection
μ ꡬνμ΄ λμ΄μκ±°λ ꡬνμ ν΄ μ¬μ©ν μλ μλ€.
2. Arrays
μΌλ°μ μΌλ‘ νλ‘κ·Έλλ° μΈμ΄μμ Array
Types μ νΉμ§μ Index λ₯Ό κΈ°λ°μΌλ‘ νκΈ° λλ¬Έμ
κΈ°λ³Έμ μΌλ‘ Ordered Collection
μ΄λ©°, μ λ ¬λ λ°μ΄ν°μ μ ν©ν λ°μ΄ν° νμ
μΌλ‘ λΉ λ₯Έ access μλλ₯Ό κ°λλ€. νμ§λ§ μ λ ¬λμ΄μΌ νκΈ°
λλ¬Έμ insertion, removal μ μΌμ΄μ€μ λ°λΌ λ¬λΌμ§λ€.
- Access:
O(1)
- Insertion: It dependsβ¦
- Removal: It dependsβ¦
- Searching:
O(N)
λ°λΌμ μ£Όμ λ©μλμ Time Complexity λ λ€μκ³Ό κ°λ€.
- push:
O(1)
- pop:
O(1)
- unshift:
O(N)
- shift:
O(N)
- splice:
O(N)
- concat:
O(N)
- slice:
O(N)
- reverse:
O(N)
- forEach/map/filter/reduce/etc.:
O(N)
- sort:
O(NlogN)
λ¬Όλ‘ , μΈμ΄λ§λ€
Set
κ³Ό κ°μUnordered Collection
μ ꡬνμ΄ λμ΄μκ±°λ ꡬνμ ν΄ μ¬μ©ν μλ μκ³ , λ°°μ΄λ³΄λ€Single Linked List
λDouble Linked List
μ κ°μ λ°μ΄ν° νμ μ΄ λ λΉ λ₯Ό μλ μλ€.
Reference
- Colt Steele, βJavaScript μκ³ λ¦¬μ¦ & μλ£κ΅¬μ‘° λ§μ€ν°ν΄λμ€β Udemy.com. last modified Aug. 2023, https://www.udemy.com/course/best-javascript-data-structures.