νΌλ³΄λμΉ νμ΄μ¬ 3κ°μ§ μκ³ λ¦¬μ¦
νΌλ³΄λμΉ μμ΄μ μλμ μμμ λ§μ‘±νλ μμ΄μ λλ€.
λ°λ‘ μ΄μ μ«μμ κ·Έ μ μ«μμ ν©μ μ°μν΄μ ꡬνλ μμ΄μ΄κ³ μλμ κ°μ΄ μ§νλ©λλ€.
μ΄λ² κΈμμλ μκ° λ³΅μ‘λμ λ°λ₯Έ νΌλ³΄λμΉ μμ΄μ ꡬνλ λνμ μΈ 3κ°μ§ μκ³ λ¦¬μ¦μ λν΄μ μμ보λλ‘ νκ² μ΅λλ€.
- μ¬κ·ν¨μ μ΄μ© - μκ°λ³΅μ‘λ O(n^2)
- λμ κ³νλ² μ΄μ© - μκ°λ³΅μ‘λ O(n)
- νλ ¬ λ©±λ² μ΄μ© - μκ°λ³΅μ‘λ O(log n)
μ¬κ·ν¨μ μ΄μ©
μ²«λ² μ§Έ λ°©λ²μ μ¬κ·ν¨μλ₯Ό μ΄μ©νλ λ°©λ²μ λλ€.
def fibo(n):
if n in (1,2):
return 1
return fibo(n-1) + fibo(n-2)
print(fibo(8))
κ°μ₯ κ°λ¨ν λ°©λ²μ΄μ§λ§... μ¬κ·λ‘ λκ°μ λΆκΈ°κ° κ³μν΄μ μκΈ°κΈ° λλ¬Έμ μκ°λ³΅μ‘λκ° O(n^2)λ‘ λ§€μ° λΉν¨μ¨μ μ΄λ€. νΌλ³΄λμΉ μμ΄μ ꡬνλ μκ³ λ¦¬μ¦ λ¬Έμ λ₯Ό ν λ... μ¬κ·ν¨μλ‘ νλ©΄ λλΆλΆ ν¨μ¨μ± ν μ€νΈλ ν΅κ³Όνμ§ λͺ»ν κ²μ΄λ€.
λμ κ³νλ² μ΄μ©
def fibo(n):
cache = [0, 1]
for i in range(2, n+1):
cache.append(cache[i-1] + cache[i-2])
return cache[n]
print(fibo(8))
λμ κ³νλ²μ μ¬μ©νλ©΄ μ¬κ·λ‘ νμ λ μ€λ³΅λλ κ³μ°κ³Όμ μ μ¬μ¬μ©ν μ μλ€. μ΄λ¬λ©΄ nκΉμ§ νλ²μ©λ§ κ³μ°ν΄μ£Όλ©΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΄ μκ° λ³΅μ‘λκ° O(n)μ΄ λλ€. λλΆλΆμ νΌλ³΄λμΉ μκ³ λ¦¬μ¦ λ¬Έμ λ€μ μ΄μ λ ν¨μ¨μ κ°κ³ ν΄κ²°ν μ μμ§λ§... λͺλͺ λ¬Έμ λ€μμλ λ ν° λ²μμ inputμ΄ μ£Όμ΄μ§κ³ λ λΉ λ₯Έ μκ³ λ¦¬μ¦μ μꡬνλ λ¬Έμ λ€μ΄ μμ΅λλ€. μ΄λ° λ¬Έμ λ νλ ¬ λ©±λ²μ ν΅ν΄ ν΄κ²°ν μ μλ€.
νλ ¬ λ©±λ² μ΄μ©
νλ ¬ λ©±λ²μ μ νμμ νλ ¬ν μμΌμ νΈλ λ°©λ² μ λλ€. νλ ¬ λ©±λ²μ μμΈν 보기 μ μ... νλ ¬μ μ΄μ©ν΄μ μκ° λ³΅μ‘λλ₯Ό O(log N)κΉμ§ μ€μΌ μ 컨μ μ μλμ κ°μ΅λλ€.
νλ ¬μ κ±°λμ κ³±μ μ΄μ©νλ©΄ μ°μ μκ° λ³΅μ‘λλ₯Ό O(log n)μΌλ‘ λ§μΆ μ μμ΅λλ€. μμ μμλ₯Ό λ΄€μ λ 8μ΄λ 11λ²μ§Έ νΌλ³΄λμΉ μμ΄μ μλ₯Ό ꡬνλ€κ³ νμ λ λμ κ³νλ²μ μ¬μ©νλ κ²μ²λΌ NκΉμ§ νλμ© λͺ¨λ κ³μ°ν΄λ³΄λκ² μλλΌ... μ λ°μ© μ€μ¬κ°λ©΄μ κ³μ°νκΈ° λλ¬Έμ μκ° λ³΅μ‘λλ₯Ό O(log n)μΌλ‘ λ§λ€ μ μμ΅λλ€.
μ νμ λ³ν
κ·Έλ λ€λ©΄ μ΄λ»κ²???... νλ ¬μ μ΄μ©ν΄μ μκ³ λ¦¬μ¦μ λ§λ€ μ μλ κ²μΌκΉμ? μ νμμ μ΄μ©ν΄μ μ μ°¨λ₯Ό 보μ¬λλ¦¬κ² μ΅λλ€.
λ¨Όμ νΌλ³΄λμΉμ μ νμμ νλ ¬μ κ³±μ μΌλ‘ μ¬μ©νκΈ° μν΄ λ³κ²½νλ©΄... κ·Έλ¦Ό 2μ κ°μ΄ λκ°μ§ μμ λ§λ€ μ μμ΅λλ€.
κ·Έλ¦Ό 2μμ λ³Έ λ μμ νλ ¬μ κ³±μ μΌλ‘ νννλ©΄ κ·Έλ¦Ό 3κ³Ό κ°μ΄ ν μ μμ΅λλ€. νλ ¬ ννλ‘ λΆλ¦¬νλ©΄ λ€μ ν¨μμ νλ ¬μ΄ λμ€λλ°... μ΄ ν¨μ νλ ¬λ μ°νμ ν¨μμ κ°μ ννμ λλ€. μΌλ¨ λ€μ λΆν΄λ₯Ό ν΄λ³΄λ©΄ μλμ κ°μ΅λλ€.
ν¨μ νλ ¬μ λ€μ λΆν΄νλ©΄ λκ°μ ν¨ν΄μΌλ‘ λΆλ¦¬κ° λλ©΄μ μ΅μ’ μ μΌλ‘ μ¬μ©ν μμ΄ λμ΅λλ€.
κ·Έλ¦Ό 3κ³Ό κ·Έλ¦Ό 4μ μμ μ 리ν΄λ³΄λ©΄ μμ μ΅μ’ μμΌλ‘ μ 리λ©λλ€. ν¨μκ° λ€μ΄ μλ νλ ¬μ μΈμκ° 1,0μ΄ λ λκΉμ§ μ«μ ννλ‘ λμ΄ μλ νλ ¬μ κ±°λμ κ³±μ nλ§νΌ μ§νν©λλ€.
νμ΄
μμ νμ΄ λ΄μ©μ μ 리ν΄λ³΄λ©΄ μ½λν μμΌμΌν λΆλΆμ μλμ κ°μ΅λλ€.
- νλ ¬μ κ±°λμ κ³±
- μ§μμ νμ μΌλ μ°¨μ΄κ° μλ€.
- νλ ¬μ λ©±λ²
- μ«μ ννμ νλ ¬μ κ±°λμ κ³±ν μ μλλ‘νλ€.
- f(1), f(0)κ°μ κ°κ° 1 κ³Ό 0μΌλ‘ κ°μ΄ μ ν΄μ Έ μμ΄ κ³±ν΄μ£Όλ μμ μ μλ΅νκ³ νλ ¬ A[0][0] μμΉμ κ°μ λ°ννλ€.
- νΌλ³΄λμΉ μμ΄μ 첫 λ²μ§Έ, λλ²μ§Έ μλ¦¬κ° 1λ‘ μμνμ¬ ν΄λΉ λ°©μμΌλ‘ ν λλ μ€μ λ‘ ν¨μμ λ£λ κ°μ -1ν΄μ λ£λλ€.
def matrix_mult(A, B):
temp = [[0] * 2 for _ in range(2)]
for i in range(2):
for j in range(2):
for k in range(2):
temp[i][j] += (A[i][k] * B[k][j])
return temp
def matrix_pow(n, M):
if n == 1:
return M
if n % 2 == 0:
temp = matrix_pow(n//2, M)
return matrix_mult(temp, temp)
else:
temp = matrix_pow(n-1, M)
return matrix_mult(temp, M)
A = [[1, 1], [1, 0]]
print(matrix_pow(8-1, A)[0][0])
νκ²°μ κ³±μ μμ μ ν μ μλ matrix_mult ν¨μμ Mμ nμ κ³±μ ꡬν μ μλ matrix_powν¨μλ₯Ό μ΄μ©ν΄μ νλ ¬μ μ΄μ©ν νΌλ³΄λμΉ μμ΄μ ꡬν μ μλ€. ν΄λΉ λ°©λ²μΌλ‘ νλ©΄ μκ° λ³΅μ‘λλ₯Ό O(log n)κΉμ§ μ€μΌ μ μμ΄ λ€λ£¨λ μ«μμ λ²μκ° μ»€μ§μλ‘ λ§€μ° ν° ν¨μ¨μ μ»μ μ μλ€.
λκΈ