최대 1 분 소요

피보나치 수열과 분할 정복의 주의점

분할 정복을 이용한 피보나치 수열

def fib(n) :
#    if n==3 : print("fib(3)")

    if n == 0 : return 0		# 정복: 0번째 달
    elif n == 1 : return 1	    # 정복: 1번째 달
    else : 
        return fib(n-1) + fib(n-2)		# 분할과 병합
  • 문제를 나눌때마다 해결해야 할 전체 부분 문제의 크기가 거의 두배로 늘어남
  • 알고리즘의 시간복잡도 $O(2^n)$으로 매우 비효율적

피보나치 수열의 다른 알고리즘들

def fib_mat(n) :
    if n == 0 : return 0        # 정복: 0번째 달
    elif n == 1 : return 1      # 정복: 1번째 달

    mat = [[1,1],[1,0]]         # 초기 피보나치 행렬
    result = powerMat(mat, n)   # 축소정복 방식
    return result[0][1]         # fib(n) 부분을 반환
  • 행렬 거듭제곱 전략을 이용하면 $O(log_{2}{n})$에 계산이 완료
  • 가장 빠른 피보나치 수열 알고리즘

댓글남기기