Big O (1) : O, O(n), O(n^2)

μ±„μ˜λ―ΌΒ·2024λ…„ 3μ›” 19일
0
post-custom-banner

πŸ“š Big O

πŸ’‘ Big OλŠ” 컴퓨터 μ•Œκ³ λ¦¬μ¦˜μ—μ„œ 맀우 μ€‘μš”ν•œ κ°œλ…μœΌλ‘œ, 두 개의 μ½”λ“œλ₯Ό λΉ„κ΅ν•˜λŠ” 방법둠이닀.

  • 예λ₯Ό λ“€μ–΄, 같은 역할을 μˆ˜ν–‰ν•˜λŠ” 더 읽기 μ‰¬μš΄ μ½”λ“œ1 κ³Ό 더 κ°„κ²°ν•˜κ³  μ½”λ“œ μˆ˜κ°€μ μ€ μ½”λ“œ2κ°€ μžˆλŠ”λ°, Big OλŠ” μ΄λŸ¬ν•œ μ½”λ“œλ“€μ„ μˆ˜ν•™μ μœΌλ‘œ μ–Όλ§ˆλ‚˜ 효율적으둜 μ‹€ν–‰λ˜λŠ”μ§€λ₯Ό λΉ„κ΅ν•˜λŠ” 방법이닀.

πŸ’‘ μ‹œκ°„λ³΅μž‘λ„ : μΈ‘μ •κ°€λŠ₯ν•œ 정도

  • μ΄λ•Œ μ‹œκ°„ λ³΅μž‘λ„λŠ” μ‹œκ°„μœΌλ‘œ μΈ‘μ •λ˜μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  무언가λ₯Ό μ™„λ£Œν•˜λŠ” 데 ν•„μš”ν•œ μž‘μ—… 횟수둜 μΈ‘μ •λœλ‹€.

πŸ’‘ κ³΅κ°„λ³΅μž‘λ„

  • ν•΄λ‹Ή μ½”λ“œλ“€μ— μ†Œμš”μ‹œκ°„ 보단, ν•΄λ‹Ή μ½”λ“œλ“€μ΄ μž‘λ™ν•˜λ©΄μ„œ μ°¨μ§€ν•˜λŠ” λ©”λͺ¨λ¦¬μƒμ— 곡간에 λŒ€ν•΄ 더 높은 μš°μ„ μˆœμœ„λ₯Ό λ‘λŠ” 것.

πŸ“š Big O - Worst Case

  • πŸ’‘ μ‹œκ°„λ³΅μž‘λ„μ™€ κ³΅κ°„λ³΅μž‘λ„λ₯Ό λ‹€λ£° λ•Œ, 주둜 λ§Œλ‚˜κ²Œ λ˜λŠ” 그리슀 λ¬Έμžκ°€ μžˆλ‹€.
  • Big OλŠ” ν”„λ‘œκ·Έλž˜λ°μ˜ μžˆμ–΄ μ΅œμ•…μ˜ 경우λ₯Ό λ‹€λ£¨λŠ” ν‘œκΈ°λ²•μ΄λ‹€.
    • 즉 Big O μ—λŠ” μ΅œμ•…μ˜ 경우만 있고, μ΅œμ„ μ˜ κ²½μš°λ‚˜ λ³΄ν†΅μ˜ κ²½μš°λŠ” κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€.

ex) λ§Œμ•½, 1-7 둜 된 λ°°μ—΄μ—μ„œ 숫자λ₯Ό 찾을 경우...
졜고의 κ²½μš°λŠ” 0번 인덱슀λ₯Ό μ°ΎλŠ” 경우이고, μ΅œμ•…μ˜ κ²½μš°λŠ” 6번 μΈλ±μŠ€μ΄λ‹€.
그리고 평균적인 κ²½μš°λŠ” 3번 인덱슀λ₯Ό μ°ΎλŠ” κ²½μš°μ΄λ‹€.

  • Ξ©(μ˜€λ©”κ°€) : 졜고의 경우
  • ΞΈ(세타) : 평균적인 경우
  • Ο(였미크둠 - oλ‘œλ„ 더 잘 μ•Œλ €μ Έ 있음) : μ΅œμ•…μ˜ 경우

πŸ“š Big O(n)

πŸ’‘ O(n)은?

  • O(n)은 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ΄ μž…λ ₯ 크기(n)에 직접 λΉ„λ‘€ν•  λ•Œ μ‚¬μš©λ˜λŠ” ν‘œν˜„
  • '직접 λΉ„λ‘€(proportional)'λž€, μž…λ ₯ 크기가 2배둜 μ¦κ°€ν•˜λ©΄ μ‹€ν–‰ μ‹œκ°„λ„ λŒ€λž΅ 2배둜 μ¦κ°€ν•œλ‹€λŠ” 뜻
  • O(n)은 μ„ ν˜• μ‹œκ°„ λ³΅μž‘λ„(linear time complexity)λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

πŸ’‘ μ€‘μš”ν•œ 점,

  • O(n)이 μ„ ν˜•μ μΈ 관계λ₯Ό λ‚˜νƒ€λ‚Έλ‹€λŠ” 것이지, μ‹€ν–‰ μ‹œκ°„μ΄ 항상 nκ³Ό μ •ν™•νžˆ λ™μΌν•˜λ‹€λŠ” 것을 μ˜λ―Έν•˜μ§€λŠ” μ•ŠλŠ”λ‹€λŠ” 점이닀.
  • 예λ₯Ό λ“€μ–΄, μ•Œκ³ λ¦¬μ¦˜μ΄ n개의 μž…λ ₯에 λŒ€ν•΄ 2n번의 연산을 μˆ˜ν–‰ν•œλ‹€κ³  해도, μ΄λŠ” μ—¬μ „νžˆ O(n)으둜 λΆ„λ₯˜λœλ‹€.
  • μ™œλƒν•˜λ©΄, 큰 κ΄€μ μ—μ„œ 보면 μ‹€ν–‰ μ‹œκ°„μ΄ μž…λ ₯ 크기에 λΉ„λ‘€ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • ex) O(n) μ½”λ“œ μ˜ˆμ‹œ + κ·Έλž˜ν”„
def print_items(n) :
	for i in range(n) :
    	print(i)

  • πŸ’‘ κ·Έλž˜ν”„μ—μ„œ λ³΄μ΄λŠ” 바와 같이, O(n)의 κ·Έλž˜ν”„λŠ” 직선을 κ·Έλ¦°λ‹€.
    • 이 μ§μ„ μ˜ κΈ°μšΈκΈ°λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μž…λ ₯에 λŒ€ν•΄ μˆ˜ν–‰ν•˜λŠ” μ—°μ‚°μ˜ 'λΉ„μœ¨'을 λ‚˜νƒ€λ‚Έλ‹€.
    • ν•˜μ§€λ§Œ λͺ¨λ“  O(n) μ•Œκ³ λ¦¬μ¦˜μ΄ λ™μΌν•œ 기울기λ₯Ό κ°€μ§€λŠ” 것은 μ•„λ‹ˆλ©°, κΈ°μšΈκΈ°λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ νŠΉμ • κ΅¬ν˜„μ— 따라 λ‹¬λΌμ§ˆ 수 μžˆλ‹€.
    • μ€‘μš”ν•œ 것은, n이 컀짐에 따라 μ‹€ν–‰ μ‹œκ°„μ΄ μ„ ν˜•μ μœΌλ‘œ μ¦κ°€ν•œλ‹€λŠ” 점이닀.

πŸ“š Drop Constants

πŸ’‘ Drop Constants은 Big O ν‘œκΈ°λ²•μ„ λ‹¨μˆœν™”ν•  수 μžˆλŠ” 방법 쀑 ν•˜λ‚˜.

def print_items(n) :
	for i in range(n) :
    	print(i)
       
	for j in range(n) :
    	print(j)    
  • μœ„ μ½”λ“œλŠ” λ˜‘κ°™μ€ μž‘μ—…μ„ 두 번 λ°˜λ³΅ν•œλ‹€. 즉 n + n = 2n번 λ°˜λ³΅λ˜λŠ” μ½”λ“œμ§€λ§Œ ν‘œκΈ°ν•  λ•ŒλŠ” O(2n)이 μ•„λ‹ˆλΌ O(n)으둜 μž‘μ„±ν•œλ‹€. 이λ₯Ό Drop Constants 라고 ν•œλ‹€.

πŸ“š Big O(n^2)

def print_items(n) :
	for i in range(n) :
    	for j in range(n) :
            print(i, j)    
  • ν•΄λ‹Ή μ½”λ“œλ₯Ό 좜λ ₯해보면, 총 100번 즉 n * n 번 좜λ ₯λœλ‹€. μ΄λŠ” O(n^2) 이닀.

πŸ“š Drop Non-Dominants

πŸ’‘ Drop Non-DominantsλŠ” Big O ν‘œκΈ°λ²•μ„ λ‹¨μˆœν™”ν•  수 μžˆλŠ” 방법 쀑 ν•˜λ‚˜.

def print_items(n):
	for i in range(n) :
    	for i in range(n) :
        	print(i, j)
           
	for k in range(n) :
    	print(k)
  • 이 μ½”λ“œλŠ” O(n^2), O(n)에 ν”„λ‘œκ·Έλž˜λ°μ΄ μ€‘μ²©λ˜μ—ˆλ‹€. 즉 좜λ ₯된 ν•­λͺ©μ˜ 총합은 O(n^2 + n) 이닀.

  • O(n^2 + n) 같은 경우, n 이 μœ μ˜λ―Έν•˜κ²Œ 컀질 경우 n은 λ¬΄μ‹œν•΄λ„ 쒋은 정도이기에, O(n^2 + n)은 O(n^2) 으둜 ν‘œμ‹œν•œλ‹€.

πŸ—£οΈ (n^2) : dominant term, n : undominant term

profile
μ‹œκ°μ μΈ 코딩을 μ¦κΈ°λŠ” 개발자 지망생 μ±„μ˜λ―Ό μž…λ‹ˆλ‹€;
post-custom-banner

0개의 λŒ“κΈ€