4. λΉ μ€ (BIG O) μκ°
Objectives
- Big O νκΈ°λ²μ νμμ±
- Big O κ° λ¬΄μμΈμ§
- Big O κ°λ¨νκ² νννλ λ²
- μκ° λ³΅μ‘μ±κ³Ό κ³΅κ° λ³΅μ‘μ± μ μ
- Big O νκΈ°λ²μ μ¬μ©νμ¬ μ¬λ¬ μκ³ λ¦¬μ¦ νκ°νκΈ°
- λ‘κ·Έ (logarithm)μ΄ λ¬΄μμΈμ§
What's the idea here?
"Write a function that accepts a string input and returns a reversed copy"
μ λλ‘ μλνκΈ°λ§ νλ€λ©΄ κ·Έκ² λ§μΌλ‘λ μΆ©λΆνμ§ μμκ°?
Who Cares?
- μ½λμ μ±λ₯μ μκΈ°ν λ μ νν μ λ¬Έ μ©μ΄λ₯Ό μ¬μ©νλ κ²μ΄ μ€μν©λλ€.
- μ¬λ¬ μ κ·Όλ²μ μ₯λ¨μ μ μκΈ°ν λλ μ μ©ν©λλ€. κ°μ₯ μ’μ ν΄κ²°μ± μ μ°Ύλ κ²μ΄ κ·Έλ κ² λ»νμ§λ μμ΅λλ€. ν ν΄κ²°μ± μ μ λ§ μ’κ³ λ νλλ μλ§μΈ κ²½μ°κ° λ§μ§λ μμ΅λλ€.
- μ½λλ₯Ό λλ²κ·Έν λ μ½λλ₯Ό λλ¦¬κ² λ§λλ κ²μ μ΄ν΄ νλ κ²μ΄ μ€μν©λλ€. μλ¬λ§μ μ°Ύλ κ²μ΄ μλλΌ, μ½λκ° μλμ νμ§λ§ μκ°λ³΄λ€ λ μ€λ μκ°μ΄ 걸리거λ, λΈλΌμ°μ μμ νμ μ μ€ννμλ μ»΄ν¨ν°κ° λκ±Έλ¦°λ€κ³ μκ°ν΄ 보μΈμ. μ΄ μΉμ μμ μΈκΈ ν κ²λ€μ λν΄μ μ΄ν΄νλ κ²μ΄ λμμ΄ λ©λλ€. λΉ μ€λ₯Ό μ΄ν΄νλ©΄ μ΄λμ λ¬Έμ κ° λνλλμ§ μ°ΎκΈ° μ¬μΈ μ μμ΅λλ€.
- λ©΄μ μμ μμ£Ό λμ€λ λ΄μ©μ΄κΈ° λλ¬Έμ μλ κ²μ΄ μ€μν©λλ€.
5. μ½λ μκ° μ¬κΈ°
function addUpTo(n) {
let total = 0;
for (let i = 1; i<= n; i++) {
total += i
}
return total
}
//console.log(addUpTo(6))
var t1 = performance.now()
addUpTo(100000000)
var t2 = performance.now()
console.log(`Time Elapsed: ${(t2 - t1) / 1000} seconds`) // Time Elapsed: 0.15639999997615814 seconds
function addUpTo(n) {
return n * (n + 1) / 2
}
//console.log(addUpTo(6))
var t1 = performance.now()
addUpTo(100000000)
var t2 = performance.now()
console.log(`Time Elapsed: ${(t2 - t1) / 1000} seconds`) // Time Elapsed: 0.00009999996423721313 seconds
What does better mean?
Faster? Less memory-intensive? More readable?
μ°μ κΈ°κΈ°λ§λ€ λ€λ₯Έ λ°©μμΌλ‘ μκ°μ κΈ°λ‘ν©λλ€. κΈ°κΈ° μ¬μμ λ°λΌ λ€λ₯Ό μλ μκ³ κ·Έ κΈ°κ³ λ¬΄μμ΄ μ€ν λκ³ μλμ§ μ λ°λΌμ λ€λ₯Ό μλ μμ΅λλ€. λ¬Όλ‘ κ·Έλ λ€κ³ ν΄μ κ°μκΈ° κ±°κΎΈλ‘ μ²« λ²μ§Έ ν΄κ²° λ²μ΄ λ λ²μ§Έ κ° κ² λ³΄λ€ λ λΉ λ₯΄κ² λμ¬ μλ μλ€λ κ²μ μλλλ€. νμ§λ§ μ°¨μ΄κ° λ¬λΌμ§ μ μκ³ μ± μ λ μκ°λ€μ΄ λ¬λΌμ§ μ μμ΅λλ€. μΈμ λ λ€λ₯Έ μκ°μ΄ κΈ°λ‘ λ κ²μ λλ€. λκ°μ κΈ°κ³κ° λ€λ₯Έ μκ°μ κΈ°λ‘ ν μλ μμ΅λλ€. λΈλΌμ°μ μμ λκ°μ μ½λ, 첫 λ²μ§Έ μ½λμμ μ‘°κΈμ© λ€λ₯Έ μκ°μ΄ κΈ°λ‘ λμμ΅λλ€. ν° λ¬Έμ λ μλμ§λ§ μ ννμ§ μλ€λ κ²μ λ³΄μ¬ μ£Όκ³ μμ΅λλ€. κ·Έλ κ² λλ¬Έμ μμ ν λ―Ώμ μκ° μλ€λ κ²μ΄μ£ .
μΈλ²μ§Έλ λΉ λ₯Έ μκ³ λ¦¬μ¦μμλ μ λ§ μ§§μ μκ° μμ λͺ¨λ κ²μ΄ μ²λ¦¬ λλ€λ κ²μ λλ€. μ΄λ° κ²½μ°μλ μλ μΈ‘μ μ νλκ° μΆ©λΆνμ§ μμ μ μμ΅λλ€. μ λ§ λΉ λ₯Έ μκ³ λ¦¬μ¦μ΄ μΈλ€κ° μμ μ μμ΅λλ€. νμ§λ§ κ·Έμ€μμ κ°μ₯ λΉ λ₯΄κ³ κ°μ₯ ν¨μ¨μ μΈ μ½λκ° μμ κ²μ λλ€. νμ§λ§ μ ν¬μ νμ΄λ° functionμ΄ κ·Έλ° μμ μ°¨μ΄λ₯Ό μΈ‘μ νκΈ° νλ€λ€λ©΄ μλ¬΄λ° λμμ΄ λμ§ μμ΅λλ€.
μ½λλ₯Ό μ΄ν΄ 보면μ μκ°μ μΈ‘μ νμ§ μκ³ μ΄λ μ½λκ° λ μ’μμ§ μ΄λ»κ² νκ°ν μ μμκΉμ? μ νν λ§μλ리면 μ½λκ° μ€ν λλ μκ°μ μΈ‘μ νλ κ²μ΄ λμλ€λ κ²μ μλμ§λ§, μ΄λ° μμΌλ‘ μ½λλ₯Ό νμΌ μμ λ§λ€κ³ μκ°μ μΈ‘μ νλ λ°©λ² μΈμ λ μ’μ λ°©λ²μ΄ μμΌλ©΄ λ μ’μ κ²μ΄λΌλ κ²λλ€. μ ν¬ μ½λκ° ν μκ°μ΄ κ±Έλ¦¬κ³ λ€λ₯Έ λ²μ μ΄ λ€ μκ°μ΄ κ±Έλ¦°λ€κ³ μκ°ν΄ 보μΈμ. μ΄λ€ κ² λ λΉ λ₯Έμ§ μκΈ° μν΄μ ν μ€νΈλ₯Ό μ€ν νκΈ°λ μ«κ±°λ μ. μ΄λ κ² νμ§ μμλ μ½λλ₯Ό λΉκ΅ νλ νΉμ ν κ°μ΄ μμμΌλ©΄ μ’κ² λ€λ κ²μ λλ€. μ΄λ΄λ λΉ μ€ νκΈ°λ²μ΄ μ μ©ν κ²μ λλ€.
6. μ°μ° κ°―μ μΈκΈ°
Counting Operations
function addUpTo(n) {
return n * (n + 1) / 2
}
1 mutiplication, 1 addition, 1 ivision / 3 simple operations, regardless of the size of n / Nμ΄ ν¬λ μλ , Nμ κ°κ³Όλ μκ΄μμ΄ μ°μ°μ΄ 3λ² μ΄λ£¨μ΄μ§κ³ μμ΅λλ€.
function addUpTo(n) {
let total = 0; (1 assignment)
for (let i = 1 (1 assignment) ; i <= (n comparisons) n; i++ (n additions and n assignments))) {
total += i; (n additions, n assignments)
}
return total;
}
λ€μμ νμμΌλ‘ λͺ¨λ μ°μ°μ μΈλ κ²μ μ½μ§ μμ΅λλ€. 5N + 2 / Nμ΄ 10κ°λΌλ©΄, μ°μ° 50κ°μ 루ν λ°μ μλ 2κ°λ₯Ό λνλ―λ‘ 52κ°κ° λ©λλ€. 5n + 2μ΄λ μ§, 3n λ μ§ 50n μ΄λ μ§ μκ΄ μμ΅λλ€. μ€μν κ²μ μ 체μ μΈ μΆμΈλ₯Ό 보λ κ²μ λλ€.
7. μκ° λ³΅μ‘λ μκ°ννκΈ°
Nμ΄ μ»€μ§μλ‘ κ±Έλ¦¬λ μκ°μ΄ λΉλ‘νκ² λμ΄λκ³ μμ΅λλ€. (5N + 2)
https://rithmschool.github.io/function-timer-demo/
8. λΉ μ€μ λν 곡μ μκ°
Big O Notation is a way to formalize fuzzy(νλ¦°, λλ΅μ ) counting. It allows us to talk formally about how the runtime of an algorithm grows as the inputs grow
Example
function countUpAndDown(n) {
console.log("Going up!");
for (var i = 0; i < n; i++) {
console.log(i);
}
console.log("At the top!\nGoing down...");
for (var j = n - 1; j >= 0; j--) {
console.log(j);
}
console.log("Back down. Bye!");
}
→ O(n)
function printAllPairs(n) {
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
console.log(i, j);
}
}
}
→ O(n * n), nμ΄ μ»€μ§μλ‘ μ€ν μκ°μ΄ nμ κ³±μ κ°μΌλ‘ λμ΄λλ€λ λ»μ λλ€.
9. λΉ μ€ ννμμ λ¨μννκΈ° (Simplifying Big O Expressions)
μμλ μ€μνμ§ μμ΅λλ€. Constants Don't Matter
- O(2n) → O(n)
- O(500) → O(1)
- O(13n^2) → O(n^2)
Smaller Terms Don't Matter
- O(n + 10) → O(n)
- O(1000n + 50) → O(n)
- O(n^2 + 5n + 8) → O(n^2)
Big O SHORTHANDS
1. Arithmetic operations are constant μ°μλ μμμ λλ€. (λ§μ , λΊμ , κ³±μ , λλμ μ ν¬ν¨ν©λλ€)
2. Variable assignment is constant. (x = 1000μ μ²λ¦¬νλ κ²κ³Ό x = 20000μ νλ 100λ§μ μ²λ¦¬νλ κ²μ λΉμ·ν μκ°μ΄ 걸립λλ€)
3. Accessing elements in an array (by index) or object (by key) is constant. (μΈλ±μ€λ₯Ό μ¬μ©ν΄μ λ°°μ΄ μ리먼νΈλ₯Ό μ κ·Όνλ κ², λ°°μ΄μμ 첫λ²μ§Έ μμ΄ν μ μ°Ύλμ§, 10λ²μ§Έ μμ΄ν μ μ°Ύλμ§ μΈλ±μ€λ₯Ό μ¬μ©νλ©΄ λκ°μ μκ°μ΄ 걸립λλ€.)
4. In a loop, the complexity is the length of the loop times the complexity of whatever happens inside of the loop
A Couple More 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(1), 5λ₯Ό λμ§ μμ κ²μ΄λ―λ‘ nμ΄ μ»€μ§μλ‘ λΉ μ€λ μμλΌκ³ λ¨μνν μ μμ΅λλ€. <O(5)λμ O(1)> 5λ³΄λ€ ν¬λ©΄ 무쑰건 MIN λ μμ 5λ₯Ό μ νν κ²μ΄κΈ° λλ¬Έμ λλ€. nμ΄ 1000μ΄λλΌλ 루νκ° 5λ²λ§ λ°λ³΅λ©λλ€. nμ΄ 100λ§μ΄λλΌλ 루νκ° 5λ²λ§ λ°λ³΅λ©λλ€.
ν΄μ¦ 1: λΉ μ€ (BIG O) μκ° λ³΅μ‘λ ν΄μ¦
0(n + n + n + n) → 0(n)
ν΄μ¦ 2: λΉ μ€ (BIG O) μκ° λ³΅μ‘λ ν΄μ¦
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;
}
→ 0(n) / for loop μ¬μ...
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;
}
→ 0(n^2)
10. κ³΅κ° λ³΅μ‘λ (Space Complexity)
auxiliary space complexity : μ λ ₯λλ κ²μ μ μΈνκ³ μκ³ λ¦¬μ¦ μμ²΄κ° νμλ‘ νλ 곡κ°μ μλ―Έν©λλ€. μ€μν κ²μ μκ³ λ¦¬μ¦ μ체μ λλ€. μ λ ₯보λ€λ μκ³ λ¦¬μ¦ μμ²΄κ° μ΄λ€ μν₯μ μ£Όλμ§ μμΈν λ΄μΌ ν©λλ€. κ³΅κ° λ³΅μ‘λλΌκ³ λ§νλ κ²μ μ¬μ€μ 보쑰 κ³΅κ° λ³΅μ‘λλ₯Ό λ§νλ€κ³ 보면 λ©λλ€.
Rules Of Thumb
- booleans, numbers, undefined, null) : λΆλ³ 곡κ°, μ«μκ° 1μ΄λ 1000μ΄λ μκ΄μμ
- Strings : O(n) λ¬Έμ κΈΈμ΄κ° 50μ΄λΌλ©΄ κΈΈμ΄κ° 1μΈ λ¬Έμμ΄λ³΄λ€ 50λ°° λ λ§μ 곡κ°μ μ°¨μ§ν¨
- Reference types (arrays, objects) : O(n), λ°°μ΄μ κΈΈμ΄ 4, 2λ₯Ό λΉκ΅ν λ κΈ΄ λ°°μ΄μ 2μΈ λ°°μ΄λ³΄λ€ 2λ°° λ λ§μ κ³΅κ° μ°¨μ§ν¨.
function sum(arr) {
let total = 0; // one number
for (let i = 0; i < arr.length; i++) { // another number
total += arr[i];
}
return total;
}
// O(1) space!
function double(arr) {
let newArr = []
for (let i = 0; i < arr.length; i++) {
newArr.push(2 * arr[i])
}
return newArr // n numbers
}
// μλ‘μ΄ λ°°μ΄μ λ§λ¦. λ°°μ΄μ ν¬κΈ°κ° λμ΄λμ 무νλμ κ°κΉμμ§μλ‘ κ³΅κ° λ³΅μ‘λκ° μ΄λ»κ² λλμ?
// μ
λ ₯λ λ°°μ΄μ κΈΈμ΄κ° 50μ΄λ©΄ κ·Έλ§νΌ, 100μ΄λ©΄ κ·Έλ§νΌ 리ν΄νκ² λλ€. μ°¨μ§ νλ 곡κ°μ μ
λ ₯ λ λ°°μ΄μ ν¬κΈ°μ λΉλ‘ν΄μ 컀μ§κ² λ©λλ€.
ν΄μ¦ 3: λΉ μ€ (BIG O) μκ° λ³΅μ‘λ ν΄μ¦
function logUpTo(n) {
for (var i = 1; i <= n; i++) {
console.log(i);
}
}
→ 0(1)
function logAtMost10(n) {
for (var i = 1; i <= Math.min(n, 10); i++) {
console.log(i);
}
}
→ 0(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;
}
→ 0(n)
11. λ‘κ·Έμ μΉμ μμ½
λΉ μ€ νκΈ°λ€ μ€μμ λ μ΄λ ΅κ±°λ ννμ§ μμ μν κ°λ λ€μ΄ ν¬ν¨λμ΄ μμ μ μμ΅λλ€. (νν νκΈ°λ² : O(1), O(n), O(n^2)) κ·Έ μ€ μμ£Ό λμ€λ κ°λ μ΄ λ‘κ·Έμ λλ€.
Wait, what's a log agin?
λ‘κ·Έν¨μλ μ§μν¨μμ μνμ λλ€. λλμ κ³Ό κ³±μ μ΄ μ§μΈ κ²μ²λΌ λ‘κ·Έν¨μμ μ§μν¨μλ μ§μ΄λ€.
log2(8) = 3 <-> 2^3 - 8
2μ λͺμΉμ κ°μ΄ 88μ΄ λλμ?
https://www.udemy.com/course/best-javascript-data-structures/
'Computer Science > Data Structure' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Data structures] section1: μκ° (0) | 2023.01.09 |
---|