-> 블로그 이전

[Algorithm Week_4] Recursion Tree 예제

2022. 3. 25. 16:59Major`/알고리즘

1) Max

max(A[0, 1, 2, ....., n-1])
    // "Base Case"
    if n = 1 return A[0]
    
    // 1. Divide
    mid <- n/2
    
    // 2. Delegate (Conquer)
    m1 <- max2(A[0, 1, 2, ...., mid])
    m2 <- max2(A[mid + 1, mid + 2, ..... n-1])
    
    // 3. Combine (Merge)
    if m1 > m2
        return m1
    else
        return m2

T(n) = 2 X T(n/2) + O(1)

>> T(n) = 2 X T(n/2) + c

 

▶ Recursion Tree

결국 "value of node"는 해당 node에서 재귀호출을 제외한 비재귀호출의 연산 수행 횟수이고, C번 호출하기 때문에 모든 노드의 value는 C가 된다

 

이러면 결국 max알고리즘의 수행 시간은 모든 노드의 value의 합으로 볼수있다

 

leaf노드를 보게되면 n/2k로 나와있고 이 값은 leaf노드이므로 1이 되어야 한다

리프노드의 개수는 2k이고, 리프노드의 개수는 leaf 노드의 비용이라고 판단할 수 있다

>> 따라서 max-알고리즘의 시간복잡도는 O(n)이라고 할 수 있다

 

▶ Master Theorem

T(n) = 2 X T(n/2) + O(1)

→ r = 2

→ c = 2

→ logcr = 1

이제 f(n)과 nlogcr의 증가속도를 비교해주면 된다

>> 따라서 시간복잡도는 O(n)이라고 할 수 있다

 


2) Merge Sort

// MergeSort - Pseudo Code
MergeSort(A[1, 2, ..., n]):
    if n > 1
        // 1. Divide
        m <- [n/2]
        
        // 2. Delegate (Conquer)
        MergeSort(A[1, 2, ..., m])
        MergeSort(A[m+1, m+2, ..., n])
        
        // 3. Combine (Merge)
        Merge(A[1, 2, ..., n], m])

// Merge - Pseudo Code
Merge(A[1, 2, 3, ..., n], m):
    i <- 1; j <- m + 1
    
    for k <- 1 to n
        if j > n
        	B[k] <- A[i]; i <- i + 1
        else if i > m
            B[k] <- A[j]; j <- j + 1
        else if A[i] < A[j]
            B[k] <- A[i]; i <- i + 1
        else
            B[j] <- A[j]; j <- j + 1
    
    for k <- 1 to n
        A[k] <- B[k]

T(n) = 2 X T(n/2) + O(n)

>> T(n) = 2 X T(n/2) + cn

 

▶ Recursion Tree

보게되면 모든 level에서의 cost가 n이다

따라서 mergesort의 수행시간은 n * (트리의 높이)라고 볼 수 있다

 

>> MergeSort - Time Complexity = O(n log n)

 

▶ Master Theorem

T(n) = 2 X T(n/2) + O(n)

→ r = 2

→ c = 2

→ logcr = 1

이제 f(n)과 nlogcr의 증가속도를 비교해주면 된다

>> 둘의 증가속도가 비슷하기 때문에 시간복잡도는 O(f(n) X log n) = O(n log n)이라고 볼 수 있다

 


3) T(n) = 3 X T(n/2) + 4n

▶ Recursion Tree

모든 cost를 더해주면 된다

 

▶ Master Theorem

T(n) = 3 X T(n/2) + 4n

→ r = 3

→ c = 2

→ logcr = log23

이제 f(n)과 nlogcr의 증가속도를 비교해주면 된다

>> 따라서 시간복잡도는 O(nlog23)이라고 할 수 있다


 

4) T(n) = 4 X T(n/4) + 8

▶ Recursion Tree

모든 cost를 더해주면 된다

 

▶ Master Theorem

T(n) = 4 X T(n/4) + 8

→ r = 4

→ c = 4

→ logcr = 1

이제 f(n)과 nlogcr의 증가속도를 비교해주면 된다

>> 따라서 시간복잡도는 O(n)이라고 할 수 있다

 


5) T(n) = T(n/2) + O(1)

▶ Recursion Tree

각 level별로 1개씩 있으므로 결국 수행 시간은 트리의 높이에 비례한다

>> O(log n)

 

▶ Master Theorem

T(n) = T(n/2) + O(1)

→ r = 1

→ c = 2

→ logcr = 0

이제 f(n)과 nlogcr의 증가속도를 비교해주면 된다

>> 둘의 증가속도가 비슷하기 때문에 시간복잡도는 O(f(n) X log n) = O(log n)이라고 볼 수 있다

 


6) T(n) = 2 X T(n/2) + O(n2)

▶ Recursion Tree

모든 cost를 더해주면 된다

 

▶ Master Theorem

T(n) = 2 X T(n/2) + O(n2)

→ r = 2

→ c = 2

→ logcr = 1

이제 f(n)과 nlogcr의 증가속도를 비교해주면 된다

>> 따라서 시간복잡도는 O(n2)이라고 할 수 있다

 


7) T(n) = 9 X T(n/2) + O(n3)

▶ Recursion Tree

모든 cost를 더해주면 된다

 

▶ Master Theorem

T(n) = 9 X T(n/2) + O(n3)

→ r = 9

→ c = 2

→ logcr = log29

이제 f(n)과 nlogcr의 증가속도를 비교해주면 된다

>> 따라서 시간복잡도는 O(n log29)이라고 할 수 있다