최소 비용 신장 트리의 특징


  • 그래프의 모든 정점이 간선에 의해 하나로 연결되어 있다.
  • 그래프 내에서 사이클을 형성하지 않는다.

 

최소 비용 신장 트리의 구성에 사용되는 대표적인 알고리즘


  • 크루스칼(Kruskal) 알고리즘

가중치를 기준으로 간선을 정렬한 후에 MST가 될 때까지 간선을 하나씩 선택 또는 삭제해 나가는 방식

 

 

  • 프림(Prim) 알고리즘

하나의 정점을 시작으로 MST가 될 때까지 트리를 확장해 나가는 방식

 

크루스칼 알고리즘의 핵심


오름차순

  1. 가중치를 기준으로 간선을 오름차순 정렬
  2. 낮은 가중치의 간선부터 시작해서 하나씩 그래프에 추가
  3. 사이클을 형성하는 간선을 추가하지 않음
  4. 간선의 수가 정점의 수보다 하나 적을 때 MST가 완성

내림차순

  1. 가중치를 기준으로 간선을 내림차순으로 정렬
  2. 높은 가중치의 간선부터 시작해서 하나씩 그래프에서 제거
  3. 두 정점을 연결하는 다른 경로가 없을 경우 해당 간선은 제거하지 않음
  4. 간선의 수가 정점의 수보다 하나 적을 때 MST가 완성

크루스칼과 프림 알고리즘 특징


크루스칼 알고리즘의 특징

  • 변의 개수를 E, 꼭짓점의 개수를 V라고 하면 이 알고리즘은 $O(E\times logV)$의 시간 복잡도를 가진다.

 

프림 알고리즘의 특징

  • 변의 개수를 E, 꼭짓점의 개수를 V라고 하면 이 알고리즘은 이진 힙을 이용하여 자료를 처리하였을 때의 기준으로 $O(E\times logV)$의 시간 복잡도를 가진다.
  • 그래프가 충분히 빽빽한 경우 $E=\Omega(V\times logV)$에는 피보나치 힙을 이용하여 훨씬 빠르게 할 수 있다.
  • 이 방법은 복잡도가 $O(E + V\times logV)$까지 떨어진다.

 

Reference


[1] https://ko.wikipedia.org/wiki/크러스컬_알고리즘

[2] https://ko.wikipedia.org/wiki/프림_알고리즘

시간 복잡도

시간 복잡도란 알고리즘의 효율성을 판단하기 위한 지표로서, 알고리즘의 절대시간이 아닌,  알고리즘을 수행하는데 사용되는 연산들이 몇 번 이루어지는가에 대한 것을 수로 표기한 것이다. 연산에는 산술, 대입, 비교, 이동이 있다. 시간 복잡도, 즉 성능 측정에 사용되는 표기법은 크게 세 가지로 나뉘며 Big-O, Big-Omega($\Omega$), Theta($\theta$)가 있다.


  • Big-O

모든 $n$, $n \gt n_0$에 대해 $f(n) \le c\times g(n)$인 조건을 만족시키는 두 양의 상수 $c$와 $n_0$가 존재하기만 하면 $f(n)=O(g(n))$이다.


예를 들면 $O(n)$: 최악의 경우 $n$번까지 수행되면 프로그램을 끝낼 수 있다.


  • Big-Omega

모든 $n$, $n \gt n_0$에 대해 $f(n) \gt c\times g(n)$인 조건을 만족시키는 두 양의 상수 $c$와 $n_0$가 존재하기만 하면 $f(n)=\Omega(g(n))$이다.


예를 들면 $O(n)$: 최소 $n$번은 수행되어야 프로그램을 끝낼 수 있다.


  • Theta

모든 $n$, $n \gt n_0$에 대해 $c_1\times g(n) \le f(n) \le c_2\times g(n)$인 조건을 만족시키는 세 양의 상수 $c_1, c_2, n_0$가 존재하기만 하면 $f(n)=\theta(g(n))$이다.


$\Omega와\ O$의 교집합, 즉 차수가 같은 문제이다.


추가적으로 Small-O, Small-omega($\omega$) 표기법도 존재한다.

Small-O는 Big-O에서 등호를 뺀다.

예를 들면 $O(n)$: 최악의 경우에도 n번 미만으로 수행되면 프로그램은 끝낼 수 있다.


Small-O와 Big-O의 차이점은 다음과 같다.

- Big-O는 실수 $c>0$ 중에서 하나만 성립해도 된다.

- Small-O는 모든 실수 $c>0$에 대해서 성립해야 한다.



Big-O 표기법 성능 비교


시간 복잡도 함수의 그래프


Better $O(1)$ < $O(log\ n)$ < $O(n)$ < $O(n\times log\ n)$ < $O(n^2)$ < $O(2^n)$ < $O(n!)$ Worse

상수 함수 < 로그 함수 < 선형 함수 < 다항 함수 < 지수 함수 < 재귀 함수


Big-O 표기법 예제

  • $O(1)$: Operation push and pop on Stack
  • $O(log\ n)$: Binary Tree
  • $O(n)$: for loop
  • $O(n\times log\ n)$: Quick Sort, Merge Sort, Heap Sort
  • $O(n^2)$: Double for loop, Insert Sort, Bubble Sort, Selection Sort
  • $O(2^n)$: Fibonacci Sequence

시간 복잡도 분석 종류

$T(n)$: Every-case anlaysis

  • 입력크기(input size)에만 종속
  • 입력값과는 무관하게 결과값은 항상 일정


$W(n)$: Worst-case analysis

  • 입력크기와 입력값 모두에 종속
  • 단위연산이 수행되는 횟수가 최대인 경우 선택


$A(n)$: Average-case analysis

  • 입력크기와 입력값 모두에 종속
  • 모든 입력에 대해 단위연산이 수행되는 기대치(평균)
  • 각 입력에 대해서 확률 할당 가능


$B(n)$: Best-case analysis

  • 입력크기와 입력값 모두에 종속
  • 단위연산이 수행되는 횟수가 최소인 경우 선택

표기법 간의 관계

표기법의미
$f = \omega(g)$$f$는 $g$보다 크다, $f \gt g$
$f = \Omega(g)$$f$는 $g$보다 크거나 같다, $f \ge g$
$f = \theta(g)$$f$는 $g$와 대략 같다, $f = g$
$f = O(g)$$f$는 $g$보다 작거나 같다, $f \le g$
$f = o(g)$$f$는 $g$보다 작다, $f \lt g$



Big-O 계산 실습

a=10 # Constant 1
b=20 # Constant 1
c=30 # Constant 1

for i in range(n):
 for j in range(n):
    x = i * i # n^2
    y = j * j # n^2
    z = i * j # n^2

for k in range(n):
    w = a * k + 40 # n
    v = b * b # n


$T(n) =  3n^2 + 2n + 3$

$T(n) = On^2$


정렬 알고리즘 비교

Sorting Algorithm공간 복잡도시간 복잡도
최악최선평균최악
Bubble Sort$O(1)$$O(n)$$O(n^2)$$O(n^2)$
Heap Sort$O(1)$$O(n\times log\ n)$$O(n\times log\ n)$$O(n\times log\ n)$
Insertion Sort$O(1)$$O(n)$$O(n^2)$$O(n^2)$
Merge Sort$O(1)$$O(n\times log\ n)$$O(n\times log\ n)$$O(n\times log\ n)$
Quick Sort$O(log \ n)$$O(n\times log\ n)$$O(n\times log\ n)$$O(n^2)$
Selection Sort$O(1)$$O(n^2)$$O(n^2)$$O(n^2)$
Shell Sort$O(1)$$O(n)$

Smooth Sort$O(1)$$O(n)$$O(n\times log\ n)$$O(n\times log\ n)$




Reference

[1] https://arer.tistory.com/99

[2] https://noahlogs.tistory.com/27

[3] https://sehoi.github.io/2014-03-03/time-complexity/

[4] https://ratsgo.github.io/data%20structure&algorithm/2017/09/13/asymptotic/

[5] https://blog.chulgil.me/algorithm/

[6] https://wayhome25.github.io/cs/2017/04/20/cs-26-bigO/

+ Recent posts