Algorithms in plain English: time complexity and Big O notation - Lee-hyuna/33-js-concepts-kr GitHub Wiki
๋ฒ์ญ : https://www.freecodecamp.org/news/time-is-complex-but-priceless-f0abd015063c/
๋ชจ๋ ํ๋ฅญํ ๊ฐ๋ฐ์๋ ์๊ฐ์ ์ค์์ ํฉ๋๋ค. ๊ทธ๋ค์ ์ฌ์ฉ์์๊ฒ ๋ ๋ง์ ๊ฒ์ ์ ๊ณตํ๊ธฐ๋ฅผ ์ํ๋ฏ๋ก ์ฌ์ฉ์์ ์ฆ๊ฑฐ์์ ๊ดํด์ ๋ฌด์์ด๋ ํ ์ ์์ต๋๋ค. ์๊ฐ ๋ณต์ก์ฑ์ ์ต์ํํ์ฌ ์ด๋ฅผ ์ํํฉ๋๋ค.
๋น์ ์ด ์๊ฐ๋ณต์ก๋๋ฅผ ์ดํดํ๊ธฐ ์ ์ ์ด๋์ ๋๊ฒ ์ ์ฉ์ด ๋๋์ง ์ดํดํด์ผ ํ๋ค. : ์๊ณ ๋ฆฌ์ฆ ๋์์ธ ์์ ์ ์ฉ์ด ๋๋ค.
๊ทธ๋์ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฌด์์ด๋ ๊ฐ๋จํ๊ฒ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฐจ๋ฅผ ํฌํจํ๊ณ ์๋ ๋จ๊ณ์ด๋ค. ์ด๊ฒ์ ํ ๋ชฉํ๋ฅผ ๋ฌ์ฑ ๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ด๊ธฐ ์ํ ๋จ๊ณ ์ ๋๋ค. ๋ค์ ํ ๋จธ๋์ ์ผ์์ ๋ง๋๋ ๋ ์ํผ๋ฅผ ์ดํด ๋ด ์๋ค. ์ ๊น, ์ฌ๊ธฐ์ ๋ช๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋์๋์ง ํ์ธํด ๋ณด์.
function BakeCake(flavor, icing){
"
1. Heat Oven to 350 F
2. Mix flour, baking powder, salt
3. Beat butter and sugar until fluffy
4. Add eggs.
5. Mix in flour, baking powder, salt
6. Add milk and " + flavor + "
7. Mix further
8. Put in pan
9. Bake for 30 minutes
10." + if(icing === true) return 'add icing' + "
10. Stuff your face
"
}
BakeCake('vanilla', true) => deliciousness
์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ฅผ ์ํํ๊ธฐ์ ์ ์ฉํฉ๋๋ค. ์๋ํ๋ฉด ์๊ณ ๋ฆฌ์ฆ๋ค์ ๋ชจ๋ ๋ชจ์๊ณผ ํฌ๊ธฐ๋ฅผ ๋ํ๋ผ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ด๋ฅผ ์กฐ๊ฐ๋ผ์ ์๋ ๋ฐฉ๋ฒ์ด 100๊ฐ์ง๊ฐ ์๋ค๊ณ ํ์๋, ๋น์ ์ ๋ค๋ฅธ ์ฌ๋ฌ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ์์ ํ๊ฐ์ง๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์ต๋๋ค. ๋ช๋ช ํด๊ฒฐ์ฑ ๋ค์ ํจ์จ์ ์ด๊ณ ์๊ฐ์ด ๋ ๋ค๋ฉด์ ๋ค๋ฅธ๊ฒ๋ณด๋ค ๋ ์ ์ ๊ณต๊ฐ์ ์๊ตฌํฉ๋๋ค.
๊ทธ๋์ ์ฃผ๋ ์ง๋ฌธ์ ์ด๋ป๊ฒ ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐ์ฑ ์ด ๊ฐ์ฅ ํจ์จ์ ์ธ์ง ๋ถ์์ ํ๋๊ฐ์ ๋ํ ๊ฒ์ด๋ค.
์ํ์ด ํด๊ฒฐํด์ค๊ฒ์ด๋ค! ํ๋ก๊ทธ๋๋ฐ์ ์๊ฐ ๋ณต์ก๋ ๋ถ์์ ์ฃผ์ด์ง ์ ๋ ฅ ์ (n)๋ฅผ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ์ด ์์ ์ ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ถ์ํ๋ ๋งค์ฐ ๋จ์ํ ๋ ์ํ์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ๋๊ฒ Big-O ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด์ ์ ์ํ๋ค.
Big-O ํ๊ธฐ๋ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด ๋จ๊ณ๋ฅผ ๋์์ฉ์ด๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ ํ์ ๋ฌธ์ ์ ์ ์ฒด ๋ณต์ก์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์น์ง ์๋ ํ์ ์์ ๋ฐ ๊ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
์ํ์๋ค์ ์๋ง๋ ๋ด "์ ๋ฐ์ ์ธ ์ํฅ" ๊ฐ์ ์ ๋ํด ์ฝ๊ฐ์ ๋น๋์ ํ ๊ฒ์ด์ง๋ง ๊ฐ๋ฐ์๊ฐ ์๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ผ์ ๋จ์ํํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
Regular Big-O
2 O(1) --> It's just a constant number
2n + 10 O(n) --> n has the largest effect
5n^2 O(n^2) --> n^2 has the largest effect
๊ฐ๋จํ ๋งํด์,์ด ๋ชจ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ํํ์ด ๋ฐํ ํ ๊ฐ์น์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น ์์๋ ํํ์ ์์๋ง์ ๋ด ๋๋ค. (์์๊ฐ ํด์๋ก n์ด ์์ ์ง์ง๋ง, ์ง๊ธ์ ๊ฑฑ์ ํ์ง ์์๋๋ฉ๋๋ค.)
๋ค์์ ๊ฐ๋จํ ์ ์๋ก ์ธํ ์ผ๋ฐ์ ์ธ ์๊ฐ ๋ณต์ก๋์ ๋๋ค. ๋ณด๋ค ์์ธํ ์ ์๋ Wikipedia๋ฅผ ํ์ธํ์ญ์์ค.
- O (1) โ ์์ ์๊ฐ : ํฌ๊ธฐ n์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ์๊ณ ๋ฆฌ์ฆ์ด ์์ ์ ์ํํ๋ ๋ฐ ๋จ ํ ๋จ๊ณ ๋ง ๊ฑธ๋ฆฝ๋๋ค.
- O (log n) โ ๋ก๊ทธ ์๊ฐ : ํฌ๊ธฐ n์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ์์ ์ ์ํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ๋จ๊ณ ์๊ฐ ๊ฐ ๋จ๊ณ๋ง๋ค ์ผ๋ถ ์์ธ์ผ๋ก ์ค์ด ๋ญ๋๋ค.
- O (n) โ ์ ํ ์๊ฐ : ํฌ๊ธฐ n์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ํ์ํ ๋จ๊ณ ์๋ ์ง์ ๊ด๋ จ๋ฉ๋๋ค (1-1).
- O (nยฒ) โ 2 ์ฐจ ์๊ฐ : ํฌ๊ธฐ n์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ์์ ์ ์ํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ๋จ๊ณ ์๋ n์ ์ ๊ณฑ์ ๋๋ค.
- O (C ^ n) โ ์ง์ ์๊ฐ : ํฌ๊ธฐ n์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ์์ ์ ์ํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ๋จ๊ณ์ ์๋ n์ ์ ๊ณฑ (์๋นํ ํฐ ์)์ ๋๋ค.
์ด ์ง์์ ๋ฐํ์ผ๋ก ์ด๋ฌํ ๊ฐ ๋ณต์ก์ฑ์ ์๋ฐ๋๋ ๋จ๊ณ ์๋ฅผ ํ์ธํ์ญ์์ค.
let n = 16;
O (1) = 1 step "(awesome!)"
O (log n) = 4 steps "(awesome!)" -- assumed base 2
O (n) = 16 steps "(pretty good!)"
O(n^2) = 256 steps "(uhh..we can work with this?)"
O(2^n) = 65,536 steps "(...)"
๋ณด์๋ค์ํผ ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก์ฑ์ ๋ฐ๋ผ ์ํฉ์ด ํจ์ฌ ๋ณต์กํด์ง๋๋ค. ์ด ์ข๊ฒ๋ ์ปดํจํฐ๋ ์ฌ์ ํ ๋งค์ฐ ํฐ ๋ณต์ก์ฑ์ ๋น๊ต์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ ํ ์์์๋งํผ ๊ฐ๋ ฅํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Big-O ํ๊ธฐ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๋ค์์ ์ด๋ฌํ ์ง์์ ์ผ์์์ ์ ํ๊ฑฐ๋ ์ง์ ์ฝ๋ฉ ํ ์์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋น ๋ฅด๊ณ ๊ฐ๋จํ ์์ ๋๋ค.
์๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
var friends = {
'Mark' : true,
'Amy' : true,
'Carl' : false,
'Ray' : true,
'Laura' : false,
}
var sortedAges = [22, 24, 27, 29, 31]
ํค (๊ฐ์ฒด) ๋๋ ์ธ๋ฑ์ค (๋ฐฐ์ด)๊ฐ ํญ์ ํ ๋จ๊ณ ์ฉ ๊ฑธ๋ฆฌ๋ฏ๋ก ์ผ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉด ๊ฐ์ ์ฐพ์ต๋๋ค.
//If I know the persons name, I only have to take one step to check:
function isFriend(name){ //similar to knowing the index in an Array
return friends[name];
};
isFriend('Mark') // returns True and only took one step
function add(num1,num2){ // I have two numbers, takes one step to return the value
return num1 + num2
}
๋ฐฐ์ด์ ์ด๋ ์ชฝ์์ ํญ๋ชฉ์ ์ฐพ์์ผํ๋์ง ์๋ฉด ๋๋จธ์ง ์ ๋ฐ์ ์๋ผ์ ์๊ฐ์ ์ ์ฝ ํ ์ ์์ต๋๋ค.
//You decrease the amount of work you have to do with each step
function thisOld(num, array){
var midPoint = Math.floor( array.length /2 );
if( array[midPoint] === num) return true;
if( array[midPoint] < num ) --> only look at second half of the array
if( array[midpoint] > num ) --> only look at first half of the array
//recursively repeat until you arrive at your solution
}
thisOld(29, sortedAges) // returns true
//Notes
//There are a bunch of other checks that should go into this example for it to be truly functional, but not necessary for this explanation.
//This solution works because our Array is sorted
//Recursive solutions are often logarithmic
//We'll get into recursion in another post!
์์ ์ ์ํํ๋ ค๋ฉด ๋ฐฐ์ด ๋๋ ๋ชฉ๋ก์ ๋ชจ๋ ํญ๋ชฉ์ ์ดํด ๋ด์ผํฉ๋๋ค. ๋จ์ผ for ๋ฃจํ๋ ๊ฑฐ์ ํญ์ ์ ํ ์๊ฐ์ ๋๋ค. ๋ํ indexOf์ ๊ฐ์ ๋ฐฐ์ด ๋ฉ์๋๋ ์ ํ ์๊ฐ์ ๋๋ค. ๋ฃจํ ๊ณผ์ ์์ ์ถ์ํ๋์์ต๋๋ค.
//The number of steps you take is directly correlated to the your input size
function addAges(array){
var sum = 0;
for (let i=0 ; i < array.length; i++){ //has to go through each value
sum += array[i]
}
return sum;
}
addAges(sortedAges) //133
์ค์ฒฉ ๋ for ๋ฃจํ๋ ๋ค๋ฅธ ์ ํ ์ฐ์ฐ (๋๋ n * n = nยฒ) ๋ด์์ ์ ํ ์ฐ์ฐ์ ์คํํ๊ธฐ ๋๋ฌธ์ 2 ์ฐจ ์๊ฐ์ ๋๋ค.
//The number of steps you take is your input size squared
function addedAges(array){
var addedAge = [];
for (let i=0 ; i < array.length; i++){ //has to go through each value
for(let j=i+1 ; j < array.length ; j++){ //and go through them again
addedAge.push(array[i] + array[j]);
}
}
return addedAge;
}
addedAges(sortedAges); //[ 46, 49, 51, 53, 51, 53, 55, 56, 58, 60 ]
//Notes
//Nested for loops. If one for loop is linear time (n)
//Then two nested for loops are (n * n) or (n^2) Quadratic!
์ง์ ์๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ ์ ๋๋ฅผ ๋ชจ๋ฅด๊ณ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ ๋๋ ์์ด์ ์๋ํด์ผํ๋ ์ํฉ์์ํ ๊ฒ์ ๋๋ค.
//The number of steps it takes to accomplish a task is a constant to the n power
//Thought example
//Trying to find every combination of letters for a password of length n
๋น ๋ฅด๊ฒ ์คํ๋์ด์ผํ๋ ์ฝ๋๋ฅผ ์์ฑํ ๋๋ง๋ค ์๊ฐ ๋ณต์ก๋ ๋ถ์์ ์ํํด์ผํฉ๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ๋ค์ํ ๊ฒฝ๋ก๊ฐ์๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋จผ์ ์๋ํ๋ ์๋ฃจ์ ์ ๋ง๋๋ ๊ฒ์ด ํ๋ช ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฅ๊ธฐ์ ์ผ๋ก๋ ๊ฐ๋ฅํ ํ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์คํ๋๋ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ๋์์ด๋๋๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ์ง๋ฌธ์ํฉ๋๋ค.
- ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋๊ฐ? ์ =>
- ์ด ์์ ์ ์๊ฐ์ ๊ฐ๋๊ฐ? ์ => 3๋ฒ์ผ๋ก, ์๋์ค => ๋์ค์ ๋ค์ ๋์์์ 6 ๋จ๊ณ๋ก ๊ฐ์ญ์์ค.
- ๋ชจ๋ ์ฃ์ง ์ผ์ด์ค์ ์ปค๋ฒํ์ต๋๊น? ์ =>
- ๋ด ๋ณต์ก์ฑ์ด ๊ฐ๋ฅํ ํ ๋ฎ์ต๋๊น? ์๋์ค => ์๋ก์ด ๋ฐฉ๋ฒ ๋๋ ์์ ์ผ๋ก ์ฌ ์์ฑํ์ญ์์ -> 1๋ฒ ๋จ๊ณ๋ก ๋ค์ ๊ฐ์ญ์์ค. , ์ => 5๋ฒ์ผ๋ก ๊ฐ์ญ์์ค.
- ์ฝ๋๊ฐ D.R.Y ํฉ๋๊น? ์ =>
- ๋ง์กฑํ๊ฐ! ์๋์ค => ๋ค์ D.R.Y๋ก ์ง๊ณ ๋์ ๋ง์กฑํด๋ผ.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ ๋๋ง๋ค ์๊ฐ ๋ณต์ก์ฑ์ ๋ถ์ํ์ญ์์ค. ๋ก๊ทธ ์คํ์์ ๋ ๋์ ๊ฐ๋ฐ์๊ฐ ๋ ๊ฒ์ ๋๋ค. ํ์๊ณผ ์ฌ์ฉ์๊ฐ ๋น์ ์ ์ข์ํ ๊ฒ์ ๋๋ค.
๋ค์ ๋งํ์ง๋ง ์๊ณ ๋ฆฌ์ฆ์ด๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ด๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง๋ฉดํ๊ฒ ๋ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ์๋ฐฑ ๊ฐ์ง์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์๋ ์์ง๋ง ์์ญ ๊ฐ์ง๊ฐ ๋ ๊ฒ์ ๋๋ค. ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ค๋ฅผ ์ ์์ง๋ง ์ฌ์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์งํฉ์ ์ฌ์ฉํ ์ง ๋๋ ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ํ ํ๋ก์ ํธ์ Angular, React ๋๋ Backbone์ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๋ฃจ์ ์ ๋ชจ๋ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
์ด๋ฅผ ๊ฐ์ํ ๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํโ์ฌ๋ฐ๋ฅธโ๋๋โ์ต์์โ๋ต๋ณ์ด ์๋ค๊ณ ๋งํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฃผ์ด์ง ๋ฌธ์ ์ ๋ํดโ๋ ๋์โ๋๋โ๋ ๋์โ๋ต๋ณ์ด ์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
์ด์ ์์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์ ๋ฐ์ด ๊ฒฝํ์ด์๋ ํ ํ๋ก์ ํธ์ React๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ผ๋ฏ๋ก ์์ํ๊ณ ์คํํ๋ ๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฝ๋๋ค.
๋ ๋์ ์๋ฃจ์ ์ ์ค๋ช ํ๋ ๋ฅ๋ ฅ์ ์ผ๋ฐ์ ์ผ๋ก ์๊ฐ ๋ณต์ก์ฑ ๋ถ์๊ณผ ์ ์ฌํฉ๋๋ค.
๊ฐ๋จํ ๋งํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ ํด๊ฒฐํ์ญ์์ค. Big-O๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ๋ฒ์ ํ์ ํ์ญ์์ค.
์ต์ข ์์ฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- O (1) โ ์์ ์๊ฐ : ์๊ณ ๋ฆฌ์ฆ์ด ์์ ์ ์ํํ๋ ๋ฐ ๋จ ํ ๋จ๊ณ ๋ง ๊ฑธ๋ฆฝ๋๋ค.
- O (log n) โ ๋ก๊ทธ ์๊ฐ : ์์ ์ ์ํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ๋จ๊ณ ์๋ ๊ฐ ๋จ๊ณ๋ง๋ค ์ผ๋ถ ์์ธ์ ์ํด ์ค์ด ๋ญ๋๋ค.
- O (n) โ ์ ํ ์๊ฐ : ํ์ํ ๋จ๊ณ ์๋ ์ง์ ๊ด๋ จ๋์ด ์์ต๋๋ค (1-1).
- O (nยฒ) โ 2 ์ฐจ ์๊ฐ : ์์ ์ ์ํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ๋จ๊ณ ์๋ n์ ์ ๊ณฑ์ ๋๋ค.
- O (C ^ n) โ ์ง์ : ์์ ์ ์ํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ๋จ๊ณ ์๋ n ์ ๊ณฑ (์์)์ ๋ํ ์์์ ๋๋ค.