읽기 전

  • 해당 게시물은 작성자가 학습한 내용을 정리 및 요약 목적으로 작성되었으므로 오역 및 오개념이 있을 수 있습니다. 바로잡기 위한 의견을 제시해주시면 매우 감사하겠습니다.

모든 계산 문제는 컴퓨터로 해결가능한가?

컴퓨터의 등장으로 매우 빠른 연산력을 앞세워 다양한 문제들을 해결할 수 있었다. 그와 함께 모든 계산적 문제들은 컴퓨터로 해결가능한가에 대한 의문점이 제기되었다. 컴퓨터로 해결할 수 없는 대표적 문제를 예로 들자면 정지 문제(Halitng Problem)가 있다.

튜링 정지 문제(Turing Halting Problem)

정지 문제를 요약하면 주어진 프로그램이 해결하고자 하는 문제가 해결되었는지 미리 정답을 말해줄 수 있는 알고리즘이 존재하는가에 대한 문제이다.

증명

정지 문제에 대한 엄밀한 증명은 다루지 않고 대략적인 증명법만을 다루려고 한다. 간단한 증명은 귀류법으로 증명가능한데, 해결할 수 있다는 가정에서 출발하여 가정에 모순이 발생할 수밖에 없음을 보임으로써 증명해야 한다.

임의의 알고리즘 a와 input i를 인자로 받는 함수 halt(a, i)가 존재한다고 하자. 그리고 halt(a, i)는 알고리즘 a에 input i를 입력했을 경우 해결이 된다면 참, 그렇지 않고 반환되지 않는다면 거짓을 출력한다. 이제 이 halt 함수에 대해 존재가능성을 증명하기 위해 halt 함수가 하는 작업을 모순되게 하는 프로그램을 하나 작성한다.

func problem(p){ #인자로 루틴 p를 받으면 복사하여 halt 함수에 입력한다
    if halt(p,p)==false: #만약 p를 입력받은 p가 무한루프에 빠지면
        return true #루한루프에 빠지지 않는다고 출력
    else: #만약 p가 무한루프에 빠지지 않는다면
        loop infinite #무한루프에 빠짐
}

이제 위 문제에 대해 halt(p,p)는 어떤 값을 갖는지 확인하자.

  • 만약 halt(p,p)가 참이라면 problem(p)는 정상적으로 종료되어야 한다. 하지만 내부 로직에 따라 halt(p,p)가 참일 경우 무한루프에 빠진다고 정의하였으므로 전제에 모순된다.
  • 만약 halt(p,p)가 거짓이라면 problem(p)는 무한루프에 빠져야 한다. 그러나 로직에 따라 halt(p,p)가 거짓이라면 problem(p)는 무한루프에 빠지지 않으므로 전제에 모순된다.

따라서, halt(p,p)가 참이든 거짓이든 모순을 가지므로 halt함수는 존재할 수가 없다는 결론을 도출할 수 있다. 그러므로 halt함수에 대한 정의인 정지 문제를 해결할 알고리즘이 존재한다는 전제가 거짓이므로 정지 문제를 해결할 알고리즘은 존재하지 않는다는 결론을 얻을 수 있다. 정지 문제는 유한 번의 연산으로 판정이 불가능한 문제이므로 NP에 속하지 않는다.

위 문제를 통해 계산적 문제라도 컴퓨터로 해결할 수 없는 경우가 존재한다는 점을 확인할 수 있다.

P-NP 문제

이전 포스팅까지 다양한 시간복잡도와 관련된 개념을 돌아보면서 알고리즘의 해결시간이 다항시간으로 정의되는 경우를 다뤘다. 크게 계산적 문제들에 대한 난이도를 말할 때 P-NP에 대한 개념을 사용한다. 우리가 봤던 문제들을 흔히 P 문제(Polynomial problem)이라 하고 이제 다른 유형인 NP 문제(Non-deterministic Polynomial Problem)가 있다. 각 유형에 대해 도식화를 한다면 아래 그림과 같이 표현할 수 있다.

Analysis_of_Algoritms_09-01

  • P 문제 (Polynomial Problem) : 결정론적 튜링기계로 다항시간 내에 해결할 수 있는 문제
  • NP 문제 (Non-deterministic Polynomial Problem) : 비 결정론적 튜링기계로 다항시간 내에 해결할 수 있는 문제

결정론적-비결정론적 튜링 기계

튜링 기계(Turing machine)란 간단하게 정해진 명령에 따라 원하는 작업을 수행하는 가상의 기계를 의미한다.

결정론적 튜링 기계는 위의 정의에 따라 정해진 명령표대로 정확하게 원하는 작업을 수행하는 튜링 기계이다. 그리고 해당 기계에 대한 정의와 함께 P 문제는 이 튜링 머신이 다항 시간 내에 해결할 수 있는 문제를 말한다.

비결정론적 튜링 기계는 튜링 기계가 작동할 때 결정론적 튜링 기계와는 달리 특정 상태에서 움직일 수 있는 상태가 정해져 있지 않은 튜링 기계이다. 단적으로 새로 정의하자면 특정 입력 값이 주어진 문제에 대해 정답 여부를 판별하는 기계로 이해할 수 있다.

요약하자면 결정론적 튜링 기계로 다항 시간 내에 해결할 수 있는 문제를 P문제라 부른다. 결결정론적 튜링 기계로 다항 시간 내에 해결할 수 없는 문제, 비결정론 튜링 기계로 다항시간 내에 주어진 특정 입력 값이 정답인지 아닌지 판별하는 데 다항시간이 걸리는 문제를 NP문제라고 한다.

두 문제의 유형에 대해 완전히 나뉜 개념으로 오해할 수 있는데 비결정론적 튜링기계로 P 문제 또한 다항기간 내에 해결할 수 있으므로 P 문제는 NP 문제의 부분집합이다. 추가로 설명하자면 결정론적 튜링 기계도 비결정론적 튜링 기계이 개념에 대입하면 비결정의 정도가 1이기 때문이다.

NP-hard(NP-난해) 문제

NP-hard 문제는 NP 집합에 속한 모든 문제를 다항 시간 내에 환원시킬 수 있는 문제이다. 그러므로 NP-hard 문제는 적어도 모든 NP 문제만큼은 어려운 문제들의 집합이다.

환원(reduction)

환원(reduction)은 알고리즘에서 문제의 난이도를 다룰 때 사용되는 개념이다. 간단하게 곱셈에 대한 문제와 덧셈에 대한 문제가 있을 때, 곱셉은 곱하는 수만큼 덧셈을 반복하는 과정일 뿐이므로 덧셈을 할 수 있다면 곱셉 문제를 해결할 수 있다. 이 경우 덧셈 문제를 곱셈 문제보다 어렵다고 정의한다. 따라서, 정의에 따라 NP-hard 문제는 모든 NP문제보다 난이도가 어렵다고 말할 수 있다.

위 과정을 도식화 하면 아래 그림과 같다. 두 결정 문제 $L_1,\ L_2$가 존재하고 각 문제에 대한 정답을 도출하는 알고리즘을 $A_1,\ A_2$ 하자. $L_1$의 input 값인 x를 $A_1$에 넣었을 때 일정 환원과정을 거쳐 $L_2$의 input 값인 y로 변환된다면, 해당 값을 $A_2$에 입력하여 결과를 얻을 수 있고 결국 x에 대한 $L_1$의 답이 된다. 그러므로, $A_2$또한 $L_1$을 해결하기 위한 $A_1$의 일부가 됨을 확인함으로써 $L_1$이 $L_2$로 환원가능하다는 결론을 내릴 수 있다.

Analysis_of_Algoritms_09-02

환원 과정을 찾는다는 것은 중요한 의미를 갖는다. 어떠한 복잡한 문제가 주어졌을 때 이미 알고있는 문제의 반복 과정으로 해결할 수 있다는 점을 알 수 있다면 완전히 새로운 코드를 작성하는 것보다 응용된 코드를 작성하는 것이 시간 절약에서 유리하기 때문이다.

NP-complete(NP-완전) 문제

NP 집합에 속하는 결정 문제 중 가장 어려운 문제들에 대한 부분집합으로 모든 NP문제는 다항 시간 내에 NP-complete 문제로 환원할 수 있다. 만약 해당 부분집합의 문제 중 단 한개라도 P 집합에 속함을 증명한다면 P=NP를 증명하는 것이 되지만 단 하나라도 속하지 않음이 증명되면 P=NP에 대한 반례이므로 여전히 P!=NP이게 된다.

참고사항 : co-NP 문제

NP 문제의 coplement(보완)를 co-NP문제라고 한다. 예를 들어 소수 판정 문제의 경우 주어진 input이 소수인가에 대해 소수가 아니라고 판정하는 문제가 NP라면 주어진 값이 소수가 맞다고 판정하는 문제가 co-NP가 되는 것이다. 어떤 명제의 역이 서로 동치가 아닐 수도 있듯이 NP 문제와 co-NP 문제는 서로 동일한 집합이 아니다.

NP와 co-NP가 동일 집합이 아닌 이유

co-NP 집합에 속하는 NP-complete 문제가 있을 때, 모든 NP문제는 NP-complete로 환원 가능하므로 모든 NP 문제의 co-NP 문제를 다항 시간에 해법을 도출할 수 있는 비결정론적 튜링 기계를 만들 수 있다. 따라서, NP가 co-NP의 부분집합이 되고 NP 문제의 보완 문제(co-NP)에 대한 집합이 co-NP 문제의 보완 문제(NP)의 부분집합이 되어 NP=co-NP가 된다. 그런데 co-NP는 NP와 보완 관계이므로 같을 수가 없어 모순이다.

참고자료

  1. NP-Completeness | Set 1 (Introduction)
  2. Proof That Computers Can't Do Everything (The Halting Problem)
  3. wikipedia_co-NP
  4. P, NP문제와 co-NP, NP-난해(NP-Hard), NP-완전(NP-complete) 개념 정리

읽기 전

  • 해당 게시물은 작성자가 학습한 내용을 정리 및 요약 목적으로 작성되었으므로 오역 및 오개념이 있을 수 있습니다. 바로잡기 위한 의견을 제시해주시면 매우 감사하겠습니다.

Pseudo-polynomial이란?

알고리즘의 복잡도를 산정할 시 최악의 경우에 대한 시간 복잡도가 input의 크기(size of bit)가 아닌 input의 값(size of value)으로 결정되는 알고리즘을 Pseudo-polynomial algorithm(의사-다항식 알고리즘) 이라 부른다.

예를 들어 임의로 정의한 자연수로 이루어진 배열 내에 존재하는 모든 값에 대한 빈도를 알고싶다고 하자. pseudo-polynomial 시간이 걸리는 해결방법은 최대값을 찾고 1부터 최대값까지 모든 경우의 수를 1개씩 찾는 것이다. 이 방법은 배열 내에 존재하는 최대값의 크기(size of value)가 얼마인지에 따라 해결시간이 결정되기 때문에 pseudo-polynomial의 성격을 갖는다. 그렇다면 반대로 시간복잡도의 크기가 input의 크기에만 의존하는 경우는 Polynomial algorithm이라고 부른다.

Pseudo-polynomial 과 NP-Completeness

뒤에서 다룰 NP관련 문제 중 NP-Complete(NP-완전) 문제 중엔 Pseudo Polynomial 시간을 요구하는 알고리즘을 해법으로 갖는다. 예를 들자면 Dynamic Programming으로 해결되는 0-1 Knapsack, Subset-Sum 문제를 들 수 있다. NP-Complete 문제 중 pseudo-polynomial 시간을 갖는 알고리즘으로 해결할 수 있는 문제를 weakly NP-Complete 문제라고 부른다.

참고자료

  1. Pseudo-polynomial Algorithms

읽기 전

  • 해당 게시물은 작성자가 학습한 내용을 정리 및 요약 목적으로 작성되었으므로 오역 및 오개념이 있을 수 있습니다. 바로잡기 위한 의견을 제시해주시면 매우 감사하겠습니다.

보통 알고리즘 문제를 해결할 때 시간복잡도는 항상 고려하지만 공간복잡도는 미처 생각하지 못하는 경우가 발생한다. 그러나 몇몇 알고리즘 문제를 해결할 땐 문제를 해결하기 위해 끌어다 사용하는 공간자원에 대한 제한사항을 명시하는 경우도 있기 때문에 어느 정도는 염두에 둘 필요가 있다.

하지만 이번에 정리하고자 하는 게시글에서는 이 용어가 자주 오용된다는 사실을 언급한다. 엄밀하게 따지면 우리가 흔히 '공간복잡도(Space complexity)'는 좀 더 포괄적인 개념이고 문제 해결을 위해 잠시 끌어다 쓰는 공간은 '보조 공간(Auxiliary Space)'이 맞는 표현이라는 것이다.

보조 공간(Auxiliary Space)

보조 공간(Auxiliary Space)는 input size를 고려하여 알고리즘이 문제를 해결하기 위해 임시로 사용하는 공간을 의미한다. 즉, 임시로 사용하는 공간이기 때문에 input의 size를 포함하지 않고 문제 해결을 위해 중간에 사용하는 버퍼 공간을 말한다.

공간 복잡도(Space Complexity)

그렇다면 공간 복잡도(Space Complexity)는 무엇인가. 엄밀한 정의는 input size를 고려하여 알고리즘이 문제를 해결하기 위해 사용하는 모든 공간을 의미한다. 즉, 공간 복잡도(Space Complexity)는 보조 공간(Auxiliary Space)와는 다르게 'input size'를 포함한다. 그럼로 좀 더 포괄적인 개념이다.

사용할 용어 채택 시 문제점?

문제 해결을 위해 제한된 공간만 사용할 것을 요구받았다고 생각해보자. 예를 들어 크기가 n인 배열의 곱연산이라 하자. 그리고 크기가 N인 공간 내에서 해결할 것을 요구받았다. 한발짝 물러서서 보면 문제 해결을 위해 input size보다 작은 공간을 사용하라고 요구할 리는 없기 때문에 당연히 포괄적으로 공간복잡도의 개념을 사용해도 무방하기는 하다. 단순히 문제를 해결하기 위해 크기가 N인 배열끼리의 곱연산을 한꺼번에 메모리에 올려 진행하려 하면 제한에 걸리므로 불가능하기 때문이다. 그러므로 제약사항에 걸리지 않게끔 분할하여 연산하는 코드를 작성해야 한다.

굳이 두 개념을 나눠서 정리한 이유는 용어의 정의를 정확하게 파악하고 포괄적으로 사용하는 것과 오류가 크게 발생하지 않기 때문에 적당히 사용하는 것과는 차이가 있기 때문이다. 앞으로 용어를 사용함에 있어 문제가 있진 않겠지만 가볍게 짚고 넘어가도 좋다고 생각한다.

참고자료

  1. What does ‘Space Complexity’ mean?

읽기 전

  • 해당 게시물은 작성자가 학습한 내용을 정리 및 요약 목적으로 작성되었으므로 오역 및 오개념이 있을 수 있습니다. 바로잡기 위한 의견을 제시해주시면 매우 감사하겠습니다.

분할상환 분석(Amortized Analysis)

점근적 분석(Asympotic Analysis) 방법에서는 알고리즘의 수행시간의 범위를 포함할 수 있는 합수로 표현하기 때문에 대부분 $O(1)$이고 간혹 $O(n)$이라도 $O(n)$으로 취급하기에 비효율적인 경우가 발생한다. 이 문제를 해결하기 위해 간혹 발생하는 최악의 경우를 구분해서 고려하는 분할상환 분석(Amortized Analysis)를 사용한다.

예를 들어 어떤 해시 테이블이 존재하고 차례로 item을 넣는다고 하자. 테이블의 상태가 full이 될 때마다 해당 테이블을 복사하고 길이가 2배인 새로운 테이블에 넣고서 원래의 테이블은 비운다. 그 과정을 그림으로 표현하면 아래와 같다.

Analysis_of_Algoritms_06-01

그림에 따르면 테이블이 full 상태가 아닐 경우 단순히 item 1개만 입력하는 과정을 수행하므로 수행시간은 1이다. 그러나 full 상태라면 전체 테이블을 복사한 후 새로운 item 1개를 입력하므로 수행시간은 $2^{log_{2}(n-1)}+1$이 된다.

시간복잡도 T(n) 계산

총계 모델(Aggregate Model)

크기가 n인 해당 테이블을 채우는 작업을 수행하는 중 최악의 케이스는 테이블이 full 상태가 되어 모든 item을 복사하는 단계이고 해당 단계의 시간복잡도는 O(n)이 된다. 그러므로 n번 삽입하는 수행과정 중 최악의 비용을 고려하면 $n\cdot O(n)$으로 전체 시간복잡도는 $O(n^2)$이 된다. 이는 우리가 흔히 말하는 점근적 분석에 따라 도출된 상계에 대한 해답이다. 그러나 n번의 입력과정 전반을 고려하여 엄밀하게 따져보면 모든 입력 과정이 $O(n)$만큼 소요되지 않는다. 그렇기 때문에 점근적 분석방법으로 도출된 상계는 그렇게 타이트하진 않다.

각 단계별 테이블 크기와 비용을 나열하면 아래 표와 같다.

Analysis_of_Algoritms_06-02

그러므로 단계별로 분할하여 수행시간을 고려하면 $Amortized\ Cost= \cfrac{(1+2+3+1+\cdots)}{n}$이 된다. 문제에서 제시된 과정을 표현하면 단순 입력과정은 n회 발생하고 테이블을 복사하는 과정은 $[log_{2}(n-1)]+1$ 단계마다 발생함을 확인할 수 있다. 수행시간을 단순 입력과정과 테이블을 복사하는 과정으로 구분하면 $\cfrac{1+1+\cdots+1}{n}+\cfrac{1+2+4+\cdots+2^{|log_{2}(n-1)|+1}}{n}$이 된다. 공차가 1보다 큰 등비급수의 합인 $a_1+\cdots+a_{n-1}$은 $a_n$보다 작기 때문에 이 식은 $\cfrac{[n+2n]}{n}\le3$이 성립하며 결국 $O(1)$이 됨을 확인할 수 있다.

회계 모델(Accounting Model)

이 방법에 따르면 item을 입력하는 과정 대부분 테이블의 크기가 일정하지만 간혹 full 상태가 발생함에 따라 item을 새로운 테이블에 옮기는 비용을 산출하여 그 비용(Accounting cost)을 모든 단계에 배분한다. 이렇게 함으로써 간혹 발생하는 불균형을 모든 단계로 분산하여 평준화하는 것이다. 즉, Amortized Cost = Actual cost + Accounting cost이다. 테이블이 full 상태일 때, 크기가 Doubling 된 테이블로 item을 옮기는 비용을 Transferring 비용이라고 하자. item 한 개를 새로운 테이블로 옮길 때 t만큼의 시간이 소요된다고 하면 n개의 원소를 새로운 테이블로 옮기는 시간은 tn이지만 이 값은 현재 n개의 원소를 새로운 테이블로 옮기는 비용이다. 그러므로 이전까지 테이블의 크기가 Doubled된 경우들을 산출해보면 $\cfrac{tn}{2}+\cfrac{tn}{2^2}+\cdots+\cfrac{tn}{2^{[log_{2}(n-1)]+1}}\le tn$이 된다. 그러므로 모든 단계에 걸쳐 full 상태가 됨에 따라 발생하는 Transferring 비용은 항상 $2tn$보다 작다. 즉, 모든 단계에 배분해야 하는 Accounting cost는 $\cfrac{2tn}{n}=2t$이다.

  1. 테이블이 full 상태가 아닐 때

    원래 item의 입력시간 1과 Accounting cost를 더하여 Amortized cost는 Actual cost(1)+Accounting cost(2t) = 1+tn이다.

  2. 테이블이 full 상태가 되었을 때

    원래 item의 입력시간 1과 Transferring cost를 더하여 Actual cost는 1+tn이 되고 Accounting cost는 기존의 2t와 이전까지 full 상태가 발생했을 때를 대비하여 다른 단계에서 더했던 2t들을 다시 감산하여 2t-tn이 된다. 즉, Amortized cost는 Actual cost(1+tn)+Accounting cost(2t-tn)이 되어 1+2t가 된다.

따라서, 간혹 발생하는 비용을 평준화한 결과 항상 1+2t의 비용이 발생하므로 $O(1+2t)=O(1)$이 된다.

참고자료

  1. Analysis of Algorithm | Set 5 (Amortized Analysis Introduction)

읽기 전

  • 해당 게시물은 작성자가 학습한 내용을 정리 및 요약 목적으로 작성되었으므로 오역 및 오개념이 있을 수 있습니다. 바로잡기 위한 의견을 제시해주시면 매우 감사하겠습니다.

알고리즘 문제를 해결함에 있어 반복문은 매우 중요한 역할을 한다. 그러나 2번까지는 nest된 형태로 동일 기능을 수행하도록 코드를 작성할 순 있겠지만, 그 이상이 되면 재귀함수를 호출하는 것이 도움이 될 것이다.

물론 필자도 처음 프로그래밍을 공부할 때 재귀함수를 사용할 시에는 스택과 메모리 측면에서 위험할 수 있다는 조언을 들었지만 그 위험을 막기 위해 정확하게 input을 정하고 값의 변화를 구체적으로 파악하여 종료시점을 오류가 발생하지 않도록 정할 수 있도록 연습해야 할 것이다. 그 조언을 듣고 재귀함수 공포증이 생겨 문제를 풀 때 엄청난 곤혹을 치르고 있다,

이번 게시글에서는 재귀를 해결하는 데 주로 소개되는 3가지 방법을 다루고자 한다.

치환법(Substitution Method)

해답에 대해 가정을 두고 수학적으로 그 가정이 성립하는지 판별하는 방법이다. 어떤 문제를 해결하는 데 걸리는 시간이 $T(n)=2T(\cfrac{n}{2})+n$라고 하자.($T(n)$=사이즈가 n인 문제를 해결하는 데 걸리는 시간) 1번 연산에 n시간이 소요되고 매개번수가 2씩 나뉘므로 $log_{2}n$회 수행하여 총 시간은 $nlog_{2}n$이 되어 시간복잡도는 $O(nlog\ n)$이라 생각할 수 있다. 그렇다면 $T(n)\le cnlog\ n$이 성립하면 가정도 성립한다 볼 수 있다.

$T(n)=2T(\cfrac{n}{2})+n \le 2\cdot\cfrac{cn}{2}log(\cfrac{n}{2})+n$

$=cnlog\ n - cnlog\ 2+n$

$=cnlog\ n -n(clog\ 2-1)$

즉 n이 클 수록 $T(n)$은 점근적으로 $cnlog\ n$에 접근함을 확인할 수 있다.

재귀 트리 방법(Recurrence Tree Method)

트리의 각 레벨 당 어느 정도의 시간이 소요되었는지 계산하여 재귀 트리의 모든 레벨에 대해 소요된 시간을 더하는 방법이다. 어떤 문제를 해결하는 재귀함수의 소요시간을 $T(n)=T(\cfrac{n}{4})+T(\cfrac{n}{2})+cn^2$이라 하자. 이 함수의 관계를 트리 형태로 표현하면 다음과 같다.

Analysis_of_Algoritms_05-01

이후 자식 노드에 대해서도 풀어서 표현하면 다음과 같다.

Analysis_of_Algoritms_05-02

이런 식으로 계속 트리가 뻗어나가게 되며, 각 트리 레벨 당 발생된 노드들의 합을 구하면 $cn^2(1+\cfrac{5}{16}+\cfrac{25}{256}+\cdots)$가 됨을 확인할 수 있다. 즉, $cn^2$에 대해 정리하면 초항이 1이고 공차가 $\cfrac{5}{16}$인 등비수열이다. 등비수열의 합공식을 사용하여 계산하면 $\cfrac{16}{11}cn^2$이 되고 결국 함수의 시간복잡도는 $O(n^2)$임을 알 수 있다.

마스터 방법(Master Method)

알고리즘의 수행시간을 점근적으로 계산하여 간단하게 구하는 방식이라고 소개되어 있다. 다만, 수행시간의 형태가 $T(n)=aT(\cfrac{n}{b})+f(n)$, $(a\ge1, b>1)$의 형태를 띠거나 해당 식으로 변환이 가능하고 재귀부가 아닌 $f(n)$이 다항식 형태이거나 복잡도를 명확하게 표현할 수 있는 경우에만 적용 가능하다. 모든 경우에 사용할 수 있는 방법은 아니다. 좀 더 사용범위를 확대한 Advanced master method가 있다고는 하는데 추후에 기회가 되면 다루겠다.

문제에서 제시된 재귀함수는 아래와 같이 트리구조를 가지고 전개된다.

Analysis_of_Algoritms_05-03

이 방법은 3가지 기준을 가지고 시간복잡도를 계산한다. 왜 다음과 같이 되는지 정리된 글이 없어 최대한 필자가 이해한 대로 작성하였다.

  1. 만약 $f(n)=\Theta(n^c)$일 때, $c<log_{b}a$이면 $T(n)=\Theta(n^{log_{b}a})$이다.

    전체 수행시간은 $n^c(1+\cfrac{a}{b^c}+\cfrac{a^2}{b^{2c}}+\cdots+\cfrac{a^{k-1}}{b^{(k-1)c}})$형태이다. 조건에 따라 공차인 $\cfrac{a}{b^c}$가 1보다 크므로 레벨이 높아질 수록 해당 레벨의 수행시간 노드를 합한 값이 커진다. 결국 수행시간을 모두 더한 값은 가장 아래 단계 레벨 노드의 수행시간의 합으로 수렴한다. 마지막 레벨의 노드 개수는 $a^{log_{b} n}=n^{log_{b} a}$이고 각 노드별 수행시간은 $T(1)$이다. 이 값은 $n^{log_{b}a}\cdot T(1)$으로 표현할 수 있으며 이에 따라 시간복잡도는 $\Theta(n^{log_{b}a})$가 된다.

  2. 만약 $f(n)=\Theta(n^c)$일 때, $c=log_{b}a$이면 $T(n)=\Theta(n^c log\ n)$이다.

    조건에 따라 공차는 1이 되어 각 레벨 노드 별 수행시간의 합은 $n^c$으로 일정하다. 마지막 레벨의 깊이는 $log_{a} n$이므로 전체 수행시간은 $n^c\cdot log_{b}n$이 된다. 즉, $n^clog\ n$의 범위로 종속할 수 있으므로 시간복잡도는 $\Theta(n^clog\ n)$이다.

  3. 만약 $f(n)=\Theta(n^c)$일 때, $c>log_{b} a$이면 $T(n)=\Theta(f(n))$이다.

    마지막 항이 0에 수렴한다 생각하여 등비급수의 합공식을 적용하면 $\cfrac{1}{1-r}n^c$, $(r=\cfrac{a}{b^c})$가 된다. 즉, $n^c$의 범위에 종속되므로 시간복잡도는 $\Theta(f(n))$이다.

마지막 마스터 방법은 왜 조건에 따라 저렇게 분기가 나뉘는 지 이해하는 데 시간이 좀 걸렸다. 다른 이들은 너무 당연하게 이해가 되나 보다....

참고자료

  1. Analysis of Algorithm | Set 4 (Solving Recurrences)

+ Recent posts