[🍊START WITH UDEMY] JS μ•Œκ³ λ¦¬μ¦˜ & 자료ꡬ쑰 λ§ˆμŠ€ν„°ν΄λž˜μŠ€ λ½€κ°œκΈ° - BigO

Yeeun_AnΒ·2022λ…„ 4μ›” 28일
2

2022 START WITH UDEMY μ±Œλ¦°μ €λ‘œ μ„ λ°œμ΄ λΌμ„œ, 마침 κ³΅λΆ€ν•˜κ³  μ‹Άμ—ˆλ˜ JS μ•Œκ³ λ¦¬μ¦˜ 곡뢀λ₯Ό 지원 λ°›μ•„ ν•  수 있게 λ˜μ—ˆμ–΄μš”!

[κΈ€λ‘œλ²Œ Best] JavaScipt μ•Œκ³ λ¦¬μ¦˜ & 자료ꡬ쑰 λ§ˆμŠ€ν„°ν΄λž˜μŠ€ μˆ˜μ—…μ„ μˆ˜κ°•ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

JavaScipt μ•Œκ³ λ¦¬μ¦˜ & 자료ꡬ쑰 λ§ˆμŠ€ν„°ν΄λž˜μŠ€ μˆ˜μ—… λ°”λ‘œκ°€κΈ°

μœ λ°λ―Έμ—μ„œ 할인을 ν•˜κ³  μžˆμœΌλ‹ˆ μ°©ν•œ 가격에 λ“€μ–΄λ³΄μ‹œλŠ” 것도 μΆ”μ²œν•©λ‹ˆλ‹€.

μˆ˜μ—…μ€ μ˜μ–΄κΆŒ κ°•μ‚¬λ‹˜μ΄ μ§„ν–‰ν•˜μ‹œμ§€λ§Œ ν•œκΈ€ μžλ§‰μ΄ μ§€μ›λ˜κΈ° λ•Œλ¬Έμ— 큰 κ±±μ • 없이 잘 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

그럼, μ‹œμž‘ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ‹œκ°„ λ³΅μž‘λ„

[0] λ“€μ–΄κ°€κΈ° 전에, μ™œ λΉ…μ˜€ ν‘œκΈ°λ₯Ό λ°°μ›Œμ•Ό ν•˜λŠ”κ°€?

ν•˜λ‚˜μ˜ κ²°κ³Όλ₯Ό λ„μΆœν•˜κΈ° μœ„ν•΄μ„œ λ”± ν•˜λ‚˜μ˜ μ½”λ“œλ§Œ 정닡이 μžˆλŠ” 건 μ•„λ‹ˆλ‹€. 수 λ§Œκ°€μ§€μ˜ 방법이 μžˆμ„ 수 μžˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ–΄λ–€ 것이 더 효율적인 λ°©λ²•μΌκΉŒ?

μ—¬κΈ°μ„œ λΉ…μ˜€(Big O)κ°€ λ“±μž₯ν•œλ‹€.

λΉ…μ˜€λž€ μ—¬λŸ¬κ°€μ§€ μ½”λ“œλ₯Ό 일반적으둜 μ„œλ‘œ λΉ„κ΅ν•˜κ³  μ„±λŠ₯을 ν‰κ°€ν•˜λŠ” 방법이닀.

Big O

μ•Œκ³ λ¦¬μ¦˜ μ„±λŠ₯을 λΆ„μ„ν•˜κΈ° μœ„ν•΄μ„œ λΉ…μ˜€ ν‘œκΈ°λ₯Ό μ‚¬μš©ν•œλ‹€. λΉ…μ˜€λ₯Ό ν†΅ν•΄μ„œ μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€. λΉ…μ˜€λ‘œ μΈ‘μ •λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„κ³Ό 곡간 λ³΅μž‘λ„λŠ” ν•˜λ“œμ›¨μ–΄μ˜ 영ν–₯을 받지 μ•Šκ³  μ˜€λ‘œμ§€ μ•Œκ³ λ¦¬μ¦˜ μž‘λ™μ— κ΄€ν•˜μ—¬λ§Œ μΈ‘μ •ν•œλ‹€.

[1] μ½”λ“œ μ‹œκ°„ 재기 : performance.now()

performance.now() λŠ” λΈŒλΌμš°μ €κ°€ λ¬Έμ„œλ₯Ό λ§Œλ“œλŠ” μ‹œκ°„, 창이 μ—΄λ¦° μ‹œκ°„μ„ μ•Œλ €μ€€λ‹€.

function ν•¨μˆ˜{
//ν•¨μˆ˜λ‚΄μš©
}

const beforeFunc = performance.now();
ν•¨μˆ˜();
const afterFunc = performance.now();
console.log(`μ‹œκ°„κ²½κ³Ό : ${(afterFunc - beforeFunc) / 1000} seconds.`)

1000λΆ„μ˜ 1초 λ‹¨μœ„λ‘œ λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— 1000으둜 λ‚˜λˆ μ£Όμ–΄μ•Ό ν•œλ‹€.

β†’ ν•¨μˆ˜ μ‹€ν–‰ν•˜λŠ” 데 λ“œλŠ” μ‹œκ°„μ΄ μΌμ •ν•˜κ²Œ 좜λ ₯λ˜μ§„ μ•ŠλŠ”λ‹€. 기기에 따라, λ™μ‹œμ— μ‹€ν–‰ν•˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨ 등에 따라 ν•¨μˆ˜κ°€ λ™μž‘ν•˜λŠ” μ‹œκ°„μ€ 달라진닀.

πŸ‹ μ½”λ“œ μž‘λ™ μ‹œκ°„μ„ 좜λ ₯ν•˜μ—¬ λΉ„κ΅ν•˜λŠ” 것 보닀, λΉ…μ˜€ ν‘œκΈ°λ²•μ„ μ΄μš©ν•˜μ—¬ λΉ„κ΅ν•˜λ©΄ 훨씬 κ°„λ‹¨ν•˜κ³  κ°„νŽΈνžˆ ν•  수 μžˆλ‹€.

[2]λΉ…μ˜€ ν‘œκΈ° 곡식 μ†Œκ°œ

1. O(n) : n이 증가할 수둝 μ»€μ§€λŠ” μ—°μ‚° 횟수

 for (let i = 0; i < n; i++) {
    console.log(i);
  }
//O(n)

n이 컀질수둝 루프 μ•ˆμ˜ 연산을 μ‹€ν–‰ν•˜λŠ” νšŸμˆ˜κ°€ λŠ˜μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— O(n)이닀. 즉 n만큼의 연산이 μΌμ–΄λ‚˜κΈ° λ•Œλ¬Έμ— O(n)이라고 ν•  수 μžˆλ‹€.

  for (let j = n - 1; j >= 0; j--) {
    console.log(j);
//O(n)

μœ„μ˜ μ½”λ“œ λ˜ν•œ n만큼의 연산이 μΌμ–΄λ‚˜λŠ” 것이기 λ•Œλ¬Έμ— O(n)이닀.

function count(n) {
  console.log("μ˜¬λΌκ°„λ‹€");
  for (let i = 0; i < n; i++) {
    console.log(i);
  }
  console.log("λ‚΄λ €κ°„λ‹€");
  for (let j = n - 1; j >= n; j--) {
    console.log(j);
  }
}
//O(2n) = O(n)

λ”°λΌμ„œ μœ„μ˜ μ½”λ“œλŠ” O(n)κ³Ό O(n)의 쑰합이닀.
μ•„! κ·Έλ ‡λ‹€λ©΄ O(2n)μ΄κ² κ΅¬λ‚˜! 라고 생각할 μˆ˜λ„ μžˆμ§€λ§Œ ν‹€λ Έλ‹€.

λΉ…μ˜€ ν‘œκΈ°μ—μ„œλŠ” μƒμˆ˜λŠ” λ¬΄μ‹œν•˜κΈ° λ•Œλ¬Έμ— 2n은 n으둜 κ°„μ£Όν•œλ‹€. λ”°λΌμ„œ O(n)이 4개 μžˆλ“  5개 μžˆλ“  O(n)이 λœλ‹€.

2. O(n^2)

function print(n){
	for(const i = 0; i < n; i++){
		for(const j = 0; j < n; j++){
				console.log(i,j);
			}
	}
}

이번 μ½”λ“œλŠ” μœ„μ™€ λ‹€λ₯΄κ²Œ 쀑첩이 λ˜μ–΄μžˆλ‹€.
즉, nλ²ˆμ”© μ‹€ν–‰ν•˜λŠ” μ½”λ“œμ•ˆμ— 또 nλ²ˆμ”© μ‹€ν–‰ν•˜λŠ” μ½”λ“œκ°€ μžˆλ‹€λŠ” 것이닀. μ΄λ ‡κ²Œ O(n) μ—°μ‚° μ•ˆμ— O(n)연산이 μ€‘μ²©λ˜μ–΄ 있으면 O(n^2) n의 제곱이 λœλ‹€.

n이 컀질수둝 μ‹€ν–‰ μ‹œκ°„μ΄ n 제곱 κ°’μœΌλ‘œ λŠ˜μ–΄λ‚œλ‹€.

[3]λΉ…μ˜€ ν‘œν˜„μ‹ λ‹¨μˆœν™” ν•˜κΈ°

1. μƒμˆ˜ν•­ λ¬΄μ‹œ

μƒμˆ˜λŠ” λ¬΄μ‹œν•˜μ—¬ μ΅œλŒ€ν•œ λ‹¨μˆœν•˜κ²Œ ν‘œν˜„ν•œλ‹€.

O(100) => O(1)
O(2n) => O(n)
O(10n^2) => O(n^2)

2. μ΅œκ³ μ°¨ν•­λ§Œ ν‘œμ‹œ

μ΅œκ³ μ°¨ν•­λ§Œ 남긴닀.

O(5n + 10) => O(n)
O(n^2 + 2n + 5) => O(n^2)

μ˜ˆμ‹œλ₯Ό 보자 : O(n)κ³Ό O(1)의 차이

  1. O(n)

    function up(n){
    	for (const i = 1; i <= Math.max(3, n); i++){
    		console.log(i)
    	}
    }
    // O(n)

Math.max()

Math.max(μž…λ ₯κ°’1, μž…λ ₯κ°’2 .... ) μž…λ ₯ 받은 κ°’λ“€ μ€‘μ—μ„œ κ°€μž₯ 큰 수λ₯Ό λ°˜ν™˜ν•œλ‹€.

μœ„μ˜ μ½”λ“œμ—μ„œ n이 1000만이 λ“€μ–΄κ°„λ‹€λ©΄ λ£¨ν”„λŠ” 100만번 싀행될 것이닀. 즉, n이 컀질수둝 ν•¨μˆ˜ μ‹€ν–‰ μˆ«μžλ„ μ¦κ°€ν•œλ‹€λŠ” 것..!

λ”°λΌμ„œ ν•¨μˆ˜ μ‹€ν–‰ 즉, μ—°μ‚°μ˜ κ°œμˆ˜κ°€ n의 영ν–₯을 λ°›κΈ° λ•Œλ¬Έμ— O(n)라고 ν•  수 μžˆλ‹€.

  1. O(1)

    function up(n){
    	for (const i = 1; i <= Math.min(3, n); i++){
    		console.log(i)
    	}
    }
    // O(1)

    Math.min(μž…λ ₯κ°’1, μž…λ ₯κ°’2 ... ) 은 μž…λ ₯ 받은 κ°’λ“€ μ€‘μ—μ„œ κ°€μž₯ μž‘μ€ 숫자λ₯Ό λ°˜ν™˜ν•œλ‹€.

    μœ„μ˜ μ½”λ“œμ—μ„œ Math.min(3, n) 은 3κ³Ό n쀑 μž‘μ€ 수λ₯Ό λ°˜ν™˜ν•˜λŠ” μ½”λ“œμ΄λ‹€. n이 100만번이 λ˜λ“ , κ·Έ 이상이 λ˜λ“ , 3보닀 컀지면 3번만 싀행될 것이닀. 즉, n의 μ¦κ°€λŠ” ν•¨μˆ˜ 싀행에 아무 영ν–₯도 주지 μ•Šκ²Œ λœλ‹€.

    μœ„μ˜ μ½”λ“œμ—μ„œ 루프 νšŸμˆ˜μ— 영ν–₯을 μ£ΌλŠ” 것은 3 즉, μƒμˆ˜κ°€ λœλ‹€.

μ§€κΈˆ κΉŒμ§€ μž…λ ₯이 컀질 수둝 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ νšŸμˆ˜κ°€ μ–Όλ§ŒνΌ λŠ˜μ–΄λ‚˜λŠ”μ§€ 속도가 μ–΄λ–»κ²Œ λ°”λ€ŒλŠ” 지 (time complexity) μ‹œκ°„ λ³΅μž‘λ„μ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜λ‹€. μ΄μ œλŠ” 곡간 λ³΅μž‘λ„ (Space complexity)에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

곡간 λ³΅μž‘λ„ Space complexity

μž…λ ₯이 컀질수둝 μ•Œκ³ λ¦¬μ¦˜μ΄ μ–Όλ§ˆλ‚˜ λ§Žμ€ 곡간을 μ°¨μ§€ν•˜λŠ” 지에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

λ¬Όλ‘  μž…λ ₯값이 컀지면 λ‹Ήμ—°νžˆ λ³΅μž‘λ„λ„ μ¦κ°€ν•˜κ² μ§€λ§Œ μ—¬κΈ°μ„œλŠ” μž…λ ₯ 값은 λ¬΄μ‹œν•˜κ³  μ•Œκ³ λ¦¬μ¦˜ μžμ²΄κ°€ μ–΄λ–€ 영ν–₯을 μ£ΌλŠ” 지에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ… ν•˜κ² λ‹€.

1) μ›μ‹œνƒ€μž…( booleans, numbers, undefined, null)은 JSμ—μ„œ λͺ¨λ‘ κ³ μ • 곡간 O(1)이닀.

Most primitives( booleans, numbers, undefined, null) are constant space
-udemy[κΈ€λ‘œλ²Œbest] JS μ•Œκ³ λ¦¬μ¦˜& 자료ꡬ쑰 λ§ˆμŠ€ν„°ν¬λž˜μŠ€

πŸ‹μ—¬κΈ°μ„œ 잠깐! constant spaceκ°€ λ¬΄μ—‡μΌκΉŒ?

κ³ μ • 곡간(constant space)μ΄λž€ μž…λ ₯ κ°’, μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰κ³ΌλŠ” κ΄€λ ¨ 없이 μ‚¬μš©λ˜λŠ” 곡간이닀. λ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” λ“±μ˜ 곡간이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

booleans, numbers, undefined, null은 μƒμˆ˜ κ³΅κ°„μœΌλ‘œ μ·¨κΈ‰λœλ‹€λŠ” 것이닀.
λ”°λΌμ„œ μž…λ ₯의 ν¬κΈ°μ™€λŠ” 상관 없이 μž…λ ₯값이 1이든 100이든 고정적인 곡간을 κ°–λŠ”λ‹€.

κ³ μ • 곡간은 c(μƒμˆ˜)라고 ν•  수 있으며 O(1)이닀.

2. λ¬Έμžμ—΄μ€ O(n)곡간을 κ°–λŠ”λ‹€.

μ‰½κ²Œ μƒκ°ν•˜λ©΄, 50μžκ°€ 100μžλ³΄λ‹€λŠ” 곡간을 덜 차지할 것이닀.
즉, μž…λ ₯ 값에 λ”°λΌμ„œ 곡간을 μ°¨μ§€ν•˜λŠ” 정도가 λ³€ν•˜κΈ° λ•Œλ¬Έμ— O(n)인 것이닀.

3. referenceνƒ€μž… (객체, λ°°μ—΄ λ“±)은 λŒ€λΆ€λΆ„ O(n)이닀.

μ—¬κΈ°μ„œ n은 λ°°μ—΄μ˜ 길이 ν˜Ήμ€ 객체의 ν‚€ 개수일 수 μžˆλ‹€.
길이가 10인 배열보닀 100인 배열이 더 λ§Žμ€ 곡간을 μ°¨μ§€ν•˜κΈ° λ•Œλ¬Έμ— λ°°μ—΄μ˜ 길이인 n이 컀질수둝 μ°¨μ§€ν•˜λŠ” 곡간도 컀진닀.

μ˜ˆμ‹œλ₯Ό 보자

function add(arr){
	const newArr = [];
	for( let i =p; i < arr.length; i++){
		newArr.push(i + arr[i]);
	}
	return newArr;
}
//O(n) space

const newArr = []; 은 μ•Œκ³ λ¦¬μ¦˜μ˜ νšŸμˆ˜μ™€ 관계없이 λ³€μˆ˜ μ„ μ–ΈμœΌλ‘œ ν• λ‹Ήλ˜λŠ” 뢀뢄이닀. μ΄λŠ” c 즉 O(1)의 곡간 λ³΅μž‘λ„λ₯Ό 가진닀고 ν•  수 μžˆλ‹€.

newArr은 μœ„μ˜ κ³ μ • 곡간과 λ‹€λ₯΄λ‹€.
arr 값이 컀질수둝 pushλ˜λŠ” μ›μ†Œμ˜ 양이 λ§Žμ•„μ§„λ‹€. λ”°λΌμ„œ newArrκ°€ μ°¨μ§€ν•˜λŠ” 곡간은 arr에 λΉ„λ‘€ν•˜κ²Œ 컀지기 λ•Œλ¬Έμ— O(n) 곡간을 μ°¨μ§€ν•œλ‹€.

μœ„μ˜ μ½”λ“œμ˜ 곡간 λ³΅μž‘λ„λŠ” O(n) + c μ΄μ§€λ§Œ μ΅œκ³ μ°¨ν•­λ§Œ 남기기 λ•Œλ¬Έμ— O(n)으둜 λ‹¨μˆœν™” ν•  수 μžˆλ‹€.

ν€΄μ¦ˆ νƒ€μž„

μ•„λž˜ ν•¨μˆ˜μ— λŒ€ν•œ 곡간 λ³΅μž‘λ„λ₯Ό κ΅¬ν•˜μ„Έμš”.

function logUpTo(n) {
    for (var i = 1; i <= n; i++) {
        console.log(i);
    }
}

μ •λ‹΅ : O(1)
μ•„λž˜ ν•¨μˆ˜μ— λŒ€ν•œ 곡간 λ³΅μž‘λ„λ₯Ό κ΅¬ν•˜μ„Έμš”.

function logAtMost10(n) {
    for (var i = 1; i <= Math.min(n, 10); i++) {
        console.log(i);
    }
}

μ •λ‹΅ : O(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;
}

μ •λ‹΅ : O(n) arrayκ°€μ»€μ§ˆμˆ˜λ‘ newArrayκ°€ μ°¨μ§€ν•˜λŠ” 곡간도 컀진닀.
μ•„λž˜ ν•¨μˆ˜μ— λŒ€ν•œ 곡간 λ³΅μž‘λ„λ₯Ό κ΅¬ν•˜μ„Έμš”.

function subtotals(array) {
    var subtotalArray = Array(array.length);
    for (var i = 0; i < array.length; i++) {
        var subtotal = 0; // O(1)
        for (var j = 0; j <= i; j++) {
            subtotal += array[j]; //O(1) subtotal 값이 λ³€ν•  뿐 ν• λ‹Ήν•˜λŠ” 곡간 μžμ²΄κ°€ 컀지진 μ•ŠκΈ° λ•Œλ¬Έ
        }
        subtotalArray[i] = subtotal; //O(n)
    }
    return subtotalArray;
}

μ •λ‹΅ : O(n) 

λ‘œκ·Έμ™€ μ„Ήμ…˜ μš”μ•½

이진 λ‘œκ·ΈλŠ” 1이 되기 μ „κΉŒμ§€ 숫자λ₯Ό 2둜 λ‚˜λˆŒ 수 μžˆλŠ” 횟수λ₯Ό μ˜λ―Έν•œλ‹€.

총 3번 λ‚˜λˆŒ 수 μžˆλ‹€. λ”°λΌμ„œ log(8) = 3 이닀.

κ·Έλž˜μ„œ 둜그 κ°œλ…μ€ μ–Έμ œ λ‚˜μ˜€λ‚˜?

  1. 탐색 μ•Œκ³ λ¦¬μ¦˜
  2. μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜
  3. μž¬κ·€ ν•¨μˆ˜

μœ„μ˜ μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄μ„œλŠ” μ•žμœΌλ‘œ μ°¨μ°¨ λ°°μ›Œλ³΄λ„λ‘ ν•˜μž.

좜처: https://www.bigocheatsheet.com/

profile
λ’Ήκ΅΄ λ’Ήκ΅΄ κ°œλ°œμΌμ§€

0개의 λŒ“κΈ€