๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/Algorithms & Data Structure

[Algorithms] ์‹œ๊ฐ„๋ณต์žก๋„ (Big-O Notation) ๋ž€?

by vodkassi 2021. 7. 8.
728x90

โœจ ์‹œ๊ฐ„๋ณต์žก๋„

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋กœ์ง์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ, ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ์ถœ๋ ฅ๊ฐ’์„ ๋‚ด๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ๋น„์œจ์„ ์˜๋ฏธํ•œ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๋ณดํ†ต Big-O Notation (Big-O ํ‘œ๊ธฐ๋ฒ•) ์„ ํ™œ์šฉํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

Big-O Notation ์ด์™ธ์—๋„ Big-Omega(big-Ω),Big-Theta(big-Θ) Notation ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.

Big-Omega๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจ์„ ํ•˜ํ•œ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ณ , Big-Theta๋Š” ์ƒํ•œ์„ ๊ณผ ํ•˜ํ•œ์„ ์˜ ์‚ฌ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

 

์ด์— ๋น„ํ•ด Big-O ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจ์„ ์ƒํ•œ์„  ๊ธฐ์ค€์œผ๋กœ ํ‘œ๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

์ฆ‰, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ์ตœ๋Œ€๊ฐ’์„ ํ‘œ๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ ์ ๊ฒ€์— ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

 

์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ์•„์šธ๋Ÿฌ ๊ณต๊ฐ„ ๋ณต์žก๋„ (Space Complexity) ๊ฐ€ ์ž์ฃผ ๋…ผ์˜๋˜๊ณค ํ•˜๋Š”๋ฐ,

์ด๋Š” ๊ธฐ์–ต ์˜์—ญ๊ณผ ํŒŒ์ผ ๊ณต๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ•œ๊ฐ€๋ฅผ ํ‰๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.

 

โœจ  Big-O Notation

๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•˜๋Š” ๋น„์œจ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. (์ด๋Ÿฌํ•œ ํŠน์ง•์„ ์ ๊ทผ์  ๋ถ„์„์ด๋ผ ํ•œ๋‹ค.)

์‹คํ–‰ ์‹œ๊ฐ„์„ ์ง์ ‘ ์ธก์ •ํ•˜์—ฌ ํ‘œ๊ธฐํ•œ๋‹ค๊ธฐ๋ณด๋‹ค, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅธ ์—ฐ์‚ฐ์˜ ์‹คํ–‰ ํšŸ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

โœจ  Big-O Notation์˜ ํŠน์ง•

 

1. ์ƒ์ˆ˜ํ•ญ์€ ๋ฌด์‹œํ•œ๋‹ค. 

 

์ƒ์ˆ˜๋ž€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ผ์ •ํ•œ ๊ฐ’์„ ๊ฐ–๋Š” ์ˆซ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๊ฐ€๋ น, 2N ์—์„œ 2๋Š” ๊ณ ์ •๋œ ๊ฐ’์ด๋ฏ€๋กœ ์ƒ์ˆ˜์ด๋ฉฐ N์€ ๋ณ€ํ•˜๋Š” ๊ฐ’์ด๋ฏ€๋กœ ๋ณ€์ˆ˜์ด๋‹ค.

Big-O ๋ฅผ ์—„๋ฐ€ํžˆ ๋”ฐ์ง€๋ฉด ์ƒ์ˆ˜๊ฐ€ ๋ถ™๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‚˜, ์‹œ๊ฐ„๋ณต์žก๋„ ์ž์ฒด๋Š” ์ž…๋ ฅ๊ฐ’์ธ N์— ๋”ฐ๋ผ ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žตํ•œ๋‹ค.

 

Ex: O(2N) -> N

 

 

2. ์˜ํ–ฅ๋ น์ด ์—†๋Š” ํ•ญ์€ ๋ฌด์‹œํ•œ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ ๊ฐ€์žฅ ์˜ํ–ฅ๋ ฅ์ด ํฐ ํ•ญ ์ด์™ธ์˜ ๋ถ€์ˆ˜์ ์ธ ํ•ญ๋“ค์€ ์ƒ๋žตํ•œ๋‹ค.

 

Ex: O(N^2 + N + 1) -> O(N^2)

 

โœจ ์ฃผ์š” ์„ฑ๋Šฅ

 

  • ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์†๋„๋ฅผ ํ•œ ๋ฒˆ์— ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  • O(1) < O(log N) < O(N) < (O N log N) < O(N^2) < O(2^N)
  • ์†๋„๊ฐ€ ๋น ๋ฅผ์ˆ˜๋ก ํšจ์œจ์„ฑ์ด ๋†’์•„์ง€๋ฉฐ, ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์„ฑ๋Šฅ ๋น„๊ต์—์„œ O(1) ์ด ๊ฐ€์žฅ ํšจ์œจ์„ฑ์ด ๋†’์œผ๋ฉฐ, O(2^N) ์ด ๊ฐ€์žฅ ๋‚ฎ๋‹ค.

 

 

1. O(1) Constant

 

  • Case: ์Šคํƒ์˜ Push, pop ๋ฉ”์„œ๋“œ
  • ์ž…๋ ฅ๊ฐ’ (N) ์ด ์ฆ๊ฐ€ํ•ด๋„ ์‹คํ–‰์‹œ๊ฐ„์€ ์–ธ์ œ๋‚˜ ๋™์ผํ•˜๋‹ค. ์ฆ‰, N์— ๊ด€๊ณ„์—†์ด ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

 

Constant(num) { 
	return num/2; 
}

 

 

2. O(log N) logarithmic

 

  • Case: ์ด์ง„ํŠธ๋ฆฌ
  • ์—ฐ์‚ฐ์ด ํ•œ ๋ฒˆ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ ˆ๋ฐ˜ ๊ฐ์†Œํ•œ๋‹ค. (์ด ๋•Œ log ์˜ ์ง€์ˆ˜๋Š” 2 ์ด๋‹ค.)

 

logarithmic(arr, target) { 
  let left = 0; 
  let right = arr.length-1; 
  while(left <= right){ 
    let middle = (left+right)/2; 
    if(arr[middle] === target) return true; 
    else if(arr[middle] > target) left = middle+1; 
    else right = middle-1; 
  } 
  return false; 
}

 

 

3. O(N) linear

 

  • Case: For ๋ฐ˜๋ณต๋ฌธ
  • ์ž…๋ ฅ๊ฐ’ (N) ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์‹คํ–‰์‹œ๊ฐ„ ์—ญ์‹œ ์„ ํ˜•์ ์œผ๋กœ(linearly) ์ฆ๊ฐ€ํ•œ๋‹ค.

 

Linear(arr, target) { 
  for (let i=0; i<arr.length; i++){ 
  	if(arr[i] === target) return true; 
  } 
}

 

  • ์œ„์˜ ๊ฒฝ์šฐ, target ์ด ๋ฐ˜๋ณต๋ฌธ ์ดˆ๋ฐ˜์— ๋ฐœ๊ฒฌ๋œ๋‹ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ผ์ฐ ์ข…๋ฃŒ๋˜์–ด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N) ์— ๋ชป ๋ฏธ์น˜๊ฒ ์ง€๋งŒ, ์ตœ์•…์˜ ๊ฒฝ์šฐ target ์ด arr ์˜ ๋์— ์œ„์น˜ํ•˜์—ฌ ๊ฒฐ๊ตญ ์ž…๋ ฅ ๊ฐ’๋งŒํผ ์—ฐ์‚ฐ์ด ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

4. O(N log N) linearithmic

 

 

Merge Sort in JavaScript. Time Complexity O(nlogn)

Merge Sort is the most popular and efficient algorithm after quick sort that uses divide and conquer algorithm.

medium.com

 

 

5. O(N^2) Quadratic

 

  • Case: ์ด์ค‘ For ๋ฐ˜๋ณต๋ฌธ, ์‚ฝ์ž…/๊ฑฐํ’ˆ/์„ ํƒ ์ •๋ ฌ

 

Quadratic(num){ 
  for(let i=1; i<num; i++){ 
    for(let j=1; j<num; j++){ 
    	console.log(i*j) 
    } 
  } 
}

 

  • ์œ„์˜ ๊ฒฝ์šฐ, N์ด ์ž…๋ ฅ๋  ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ for ๋ฌธ (N) * ๋‘ ๋ฒˆ์งธ for ๋ฌธ (N) ๋งŒํผ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

 

6. O(2^N) Exponential

 

  • Case: Fibonacci ์ˆ˜์—ด

 

Exponential(num) { 
  if (num <= 1) return 1; 
  return fibonacci(num - 1) + fibonacci(num - 2); 
}

 

 

โœจ ๋งˆ๋ฌด๋ฆฌ

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ๋Š˜ ๊ณ ๋ คํ•˜๋ฉฐ ์„ค๊ณ„ํ•˜๋ฉด ์ข‹๋‹ค.

 

   1. ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋ฌด์—‡์ธ๊ฐ€?

   2. ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋Ÿฐํƒ€์ž„(์‹คํ–‰ ์‹œ๊ฐ„)์€ ์–ด๋–ป๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š”๊ฐ€?

 

์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ž…๋ ฅ๊ฐ’์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉด ํ•จ์ˆ˜ ์ž‘๋™์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ, "์ตœ์•…์˜ ๊ฒฝ์šฐ" ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์‰ฝ๋‹ค.

 

โœจ์ฐธ๊ณ ์ž๋ฃŒ

๋Œ“๊ธ€