Loading [MathJax]/jax/output/HTML-CSS/jax.js

들어가기에 앞서서 stack의 time complexity를 분석해 봅시다. 3가지 operation이 있고 각각의 시간 복잡도는 다음과 같이 소요됩니다.

Push Pop Multipop(k)
O(1) O(1) O(min(k,s)) = O(n) worst case

 

Worst-case analysis

n×O(n)=O(n2)

 

Probabilistic analysis

각각의 operation이 차지하는 비율이 n3이라고 생각해 볼 수 있습니다. 따라서 시간 복잡도는 다음과 같습니다.

 

T(A)=n3O(1)+n3O(1)+n3O(n)=O(n2)

 

Amortized Analysis

기존처럼 하나의 operation이 아니라 sequence of operations을 보고 알고리즘의 복잡도를 분석하는 방법입니다. 각 operation은 average cost를 가지며, 알고리즘의 성능은 worst case에 보장됩니다. 가능한 모든 Input에 대해 분석을 실행했던 Probabilistic analysis와 다른 분석 방법입니다.

 

Aggregate analysis

Average cost를 totalcostofnoperationsn으로 구하는 방법입니다.

 

Stack에서 Push와 Pop(+Multipop(k))의 관계에 대해서 생각해 봅시다. Pop의 경우, Push가 이루어진 횟수 내에 바운드되는 것을 알 수 있습니다. K push가 이루어져야 K만큼의 pop을 실행할 수 있기 때문입니다.

 

따라서 Push의 average cost를 구해보면, O(n)n이기 때문에, O(1)의 cost가 드는 것을 알 수 있습니다.

 

  •  Push O(1)
  •  Pop O(1)
  •  Multipop O(1)

 

따라서 알고리즘의 시간 복잡도는 O(1)×n=O(n)임을 알 수 있습니다.

 

Accounting Method

실제 비용 대신에 amortized cost로 계산하는 방법입니다. Amortized cost는 실제 cost에 upper bound이기 때문에 사용가능한 방법입니다. 표를 그려보면 이해가 쉽습니다.

  Actual cost Amortized cost
Push 1 2
Pop 1 0 (already paid by Push)
Multipop(k) min(k,s) 0 (already paid by Push)

 

Push에 대한 cost만 생각하여 시간 복잡도를 구해보면, O(1)×n=O(n)임을 알 수 있습니다.

 

Potential Method

Operation을 고려하기보다는 전체 데이터 구조의 potential energy를 고려합니다. Potential energy는 우리가 operation을 수행하는 경우에만 변한다는 것이 핵심입니다.

 

Amortized cost = ci+Φ(Di)Φ(Di1)

 

Stack에 대해 사용해봅시다. Stack의 potential energy는 스택에 있는 object의 수와 같습니다. 따라서 Φ(D0)=0이고 Φ(Di)0임을 알 수 있습니다. Operation에 따른 amortized cost, Φ(D)를 구해봅시다.

 

  • Push
    ci=1+Φ(Di)Φ(Di1)=2
  • Pop
    ci=1+Φ(Di)Φ(Di1)=0
  • Multipop
    ci=min(k,s)+Φ(Di)Φ(Di1)=0

 

따라서 Push에 대한 cost만 생각하여 시간 복잡도를 구해보면, O(1)×n=O(n)임을 알 수 있습니다. Total amortized cost가 total actual cost의 upper bound이기 때문에, worst case에 대한 비용도 O(n)임을 알 수 있습니다. 

 

Adversary argument

증명 방법중 하나입니다. 강력한 공격자는 알고리즘의 worst case 시나리오를 야기하는 Input을 결정하려고 하며, 알고리즘의 response가 일정한 값을 줄 때까지 input을 생성해 냅니다.  

'Study > Algorithm' 카테고리의 다른 글

7. Dynamic Programming  (0) 2023.06.08
6. Greedy Algorithm and Divide-and-Conquer  (0) 2023.06.08
4. Probabilistic Analysis and Randomized Algorithm  (0) 2023.06.08
3. Recursion  (0) 2023.06.08
2. Complexity Analysis  (0) 2023.06.07