μκ° λ³΅μ‘λ(time complexity)λ?
μκ³ λ¦¬μ¦μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° κ±Έλ¦¬λ μκ°
μκ³ λ¦¬μ¦μ μ±λ₯μ λνλ΄λ μ§ν
μ½λ©ν μ€νΈ λ¬Έμ μμ νμ λ±μ₯νλ μκ³ λ¦¬μ¦μ΄ μ€νλλ μ ν μκ°κ³Ό κ΄λ ¨μ΄ μλ€.
μκ° λ³΅μ‘λ νν
μΌλ°μ μΌλ‘ μκ° λ³΅μ‘λλ μ κ·Ό νκΈ°λ²μ μ΄μ©νμ¬ λνλΈλ€.
- Big-Ω (λΉ μ€λ©κ°) νκΈ°λ² / Ω(N) : μ΅μ μ μν©μ κ°μ νλ νκΈ°λ²
- Big-O (λΉ μ€) νκΈ°λ² / O(N) : μ΅μ μ μν©μ κ°μ νλ νκΈ°λ²
- Big-θ (λΉ μΈν) νκΈ°λ² / θ(N) : νκ· μ μν©μ κ°μ νλ νκΈ°
κ°μ₯ λ§μ΄ μ°λ λ°©λ²μ Big-O νκΈ°λ²μ΄λ€. Big-O νκΈ°λ²μ μ΅μ μ κ²½μ° μ΄λμ λ μλκ° λμ¬ μ μλμ§ νλ¨νμ¬ λ‘μ§ μμ / μλ κ°μ μ μν νλμ¨μ΄ κ΅μ²΄ λ±μ λμμ μ€λ€. μΉκ΅¬μ μ½μμ λ¦μ κ²½μ°, "λ μ μΌ λ λ¦μΌλ©΄(?) 5λΆ λ¦μ΄!" λΌλκ°, "λ λ³΄ν΅ λ¦μΌλ©΄ 10λΆ μ λ λ κ±Έλ €"λΌκ³ λ§νμ§ μκ³ , "μ λ§ λ¦λλΌλ μ μ΄λ nnμκΉμ§λ λμ°©ν΄"λΌκ³ μλ €μ£Όλ κ²μ΄ μ’λ€λ κ²μ λ μ¬λ €νλ©΄ Big-Oκ° λ§μ΄ μ°μ΄λ μ΄μ λ₯Ό μ΄ν΄νκΈ° μ½λ€!
Big-O νκΈ°λ²
O(1) μμμκ°
μ λ ₯ λ°μ΄ν°μ ν¬κΈ°μ μκ΄μμ΄ μΌμ ν μκ°μ΄ κ±Έλ¦°λ€.
# λ¨μ μΆλ ₯λ¬Έ
def print_hello(n):
print("Hello World!")
# 1λΆν° nκΉμ§μ ν© κ΅¬νκΈ°
# nμΌλ‘ μ΄λ€ μ«μκ° λ€μ΄μλ, 100μ΅μ΄ λ€μ΄μλ λ¨ ν λ²μ μ°μ°
def sum_from_1_to_n(n):
return (n+(n+1))//2
# 리μ€νΈ κ° μ κ·Ό
li = [1, 2, 3, 4, 5]
def get_item_of_list(n):
return li[n]
O(n) μ ν μκ°
μ λ ₯ ν¬κΈ°(n)κ° μ¦κ°ν¨μ λ°λΌ μ€ν μκ°μ΄ κ°μ λΉμ¨λ‘ μ¦κ°νλ€.
# λ°λ³΅λ¬Έμ μ¬μ©ν 1λΆν° nκΉμ§μ ν©
def sum_from_1_to_n(n):
val = 0
for i in range(1, n+1):
val += i
return val
'''
2nκΉμ§μ ν©μ ꡬνλ€ νλλΌλ,
nμ΄ μ»€μ§μλ‘ κ³μμΈ 2κ° μ¬μ€μ ν° μν₯μ λΌμΉμ§ λͺ»νκΈ° λλ¬Έμ
O(2n)μ΄ μλ O(n)
'''
O(log n) λ‘κ·Έ μκ°
μ λ ₯ ν¬κΈ°(n)κ° λ λ°°λ‘ μ¦κ°νλλΌλ μ€ν μκ°μ΄ μμ μκ°λ§νΌλ§ μ¦κ°νλ€
ex) μ΄μ§ νμ μκ³ λ¦¬μ¦ : μνλ κ°μ νμν λ, λ§€ λ¨κ³λ§λ€ μ λ°μ λ°μ΄ν°λ§μ λ¨κΈ΄λ€.
def binary_search(n):
li = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
l, r = 0, 10
while l <= r:
m = (l+r)//2
if li[m] > n:
r = m - 1
elif li[m] < n:
l = m + 1
else:
return m
return -1
O(n log n) μ ν λ‘κ·Έ μκ°
μ λ ₯ ν¬κΈ°(n)μ΄ μ¦κ°ν¨μ λ°λΌ μ€ν μκ°μ΄ n log nλ§νΌ μ¦κ°νλ€.
ex) ν΅ μ λ ¬, λ³ν© μ λ ¬, ν μ λ ¬
'''
<λ³ν© μ λ ¬>
1. λΆν (Divide): μ
λ ₯ λ°°μ΄μ λ κ°μ λμΌν ν¬κΈ°μ νμ λ°°μ΄λ‘ λΆν
λ§€ λ¨κ³λ§λ€ λ°μ΄ν°μ ν¬κΈ°κ° μ λ°μΌλ‘ μ€μ΄λ€κΈ° λλ¬Έμ λ‘κ·Έ μκ°μ λΉλ‘νμ¬ μ¦κ°
2. μ 볡(Conquer): νμ λ°°μ΄μ μ¬κ·μ μΌλ‘ μ λ ¬
κ° νμ λ°°μ΄μ λν΄ μ€νλλ―λ‘, μ 체μ μΌλ‘ μ
λ ₯ λ°°μ΄μ λͺ¨λ μμλ₯Ό ν λ²μ© μ²λ¦¬
μ¦, μ ν μκ°μ λΉλ‘νμ¬ μ¦κ°
3. κ²°ν©(Combine): μ λ ¬λ λ κ°μ νμ λ°°μ΄μ λ³ν©νμ¬ νλμ μ λ ¬λ λ°°μ΄μ λ§λ¦
μ
λ ₯ λ°°μ΄μ λͺ¨λ μμλ₯Ό ν λ²μ© μ²λ¦¬νλ―λ‘, μ ν μκ°μ λΉλ‘νμ¬ μ¦κ°
=> λ³ν© μ λ ¬μ μκ° λ³΅μ‘λ = λΆν λ¨κ³μ O(log n) * μ 볡 λ° κ²°ν© λ¨κ³μ O(n) = O(n log n)
'''
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
merged = []
left_index = 0
right_index = 0
while left_index < len(left) and right_index < len(right):
if left[left_index] < right[right_index]:
merged.append(left[left_index])
left_index += 1
else:
merged.append(right[right_index])
right_index += 1
while left_index < len(left):
merged.append(left[left_index])
left_index += 1
while right_index < len(right):
merged.append(right[right_index])
right_index += 1
return merged
O(n^2) 2μ°¨ μκ°
μ λ ₯ ν¬κΈ°(n)κ° μ¦κ°ν¨μ λ°λΌ μ€ν μκ°μ΄ μ κ³± λ°°λ‘ μ¦κ°νλ€.
# μΌλ°μ μΈ μ΄μ€ forλ¬Έ
def double_loop(n):
for i in range(n):
for j in range(n):
# do something
O(2^n) μ§μ μκ°
μ λ ₯ ν¬κΈ°(n)κ° μ¦κ°ν¨μ λ°λΌ μ€ν μκ°μ΄ λ λ°°μ© μ¦κ°νλ€.
ex) νΌλ³΄λμΉ μμ΄μ μ¬κ·μ μΌλ‘ κ³μ°νλ μκ³ λ¦¬μ¦ : κ° νΈμΆμμ λ κ°μ μλ‘μ΄ μ¬κ· νΈμΆμ μμ±νλ―λ‘, νΈμΆ νΈλ¦¬λ 2^nκ°μ λ Έλλ₯Ό κ°μ§κ² λ¨. (λμ νλ‘κ·Έλλ°μ ν΅ν΄ O(n)μ μκ° λ³΅μ‘λλ‘ κ³μ° κ°λ₯)
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
Big-O νκΈ°λ²μ μν μκ°
μ½λ© ν μ€νΈμ μκ° λ³΅μ‘λ μ μ©νκΈ°
μ½λ© ν μ€νΈ λ¬Έμ λ₯Ό λΆμ ν, μ¬μ©ν μκ³ λ¦¬μ¦μ μ μ©νμ λ λΉ μ€ νκΈ°λ²μ νμ©νμ¬ μ ν μκ° λ΄μ κ²°κ³Όκ° λμ¬ μ μλμ§ νμΈν μ μλ€. "μ»΄ν¨ν°κ° μ΄λΉ μ°μ°ν μ μλ μ΅λ νμλ 1μ΅ λ²μ΄λ€."λ₯Ό μ μ λ‘ νλ€.
μ°Έκ³
https://jettstream.tistory.com/304
https://velog.io/@ka0ka0ka/μκ³ λ¦¬μ¦μκ°-볡μ‘λλ
https://velog.io/@wlwl99/μκ°λ³΅μ‘λ-Time-Complexity
https://blog.bitsrc.io/binary-search-in-typescript-e999dd3fca5e
https://swdevnotes.com/swift/2021/fibonacci-sequence-recursion/