알고리즘분석ants.mju.ac.kr/2019fall/dm/module4-2.pdf · 2019-10-07 · 2...
TRANSCRIPT
알고리즘 분석
1
2
만약 동일한 결과를 구할 수 있는 알고리즘이여러 개 존재한다면,우리는 당연히 더 좋은 알고리즘을 사용한다.
그러면, 어떤 알고리즘이 더 좋은 알고리즘일까?더 좋은 알고리즘을 선택하는 기준은 무엇인가?
3
일반적으로 좋은 알고리즘을 선택하는 기준은
속도:이 알고리즘을 실행할 때 시간이 얼마나 걸리는가?
메모리 사용 공간:이 알고리즘을 실행할 때 메모리 공간이 얼마나 필요한가?
Bubble sort
4
Get n and a list of n items, (a1,a2, …, an)marker ← nWhile (marker ≠ 1)
i ← 1while (i < marker)
if ( ai > ai+1) exchange ai with ai+1
i ← i +1marker ← marker - 1
5
예를 들어, 리스트 (5, 1, 3, 9, 4, 2)을 정렬한다면,
1 단계: (5,1,3,9,4,2)↑
(1,5,3,9,4,2)(1,3,5,9,4,2)(1,3,5,9,4,2)(1,3,5,4,9,2)(1,3,5,4,2,9)
2 단계: (1,3,5,4,2,9)↑
(1,3,5,4,2,9)(1,3,5,4,2,9)(1,3,4,5,2,9)(1,3,4,2,5,9)
3 단계: (1,3,4,2,5,9)↑
(1,3,4,2,5,9)(1,3,4,2,5,9)(1,3,2,4,5,9)
4 단계: (1,3,2,4,5,9)↑
(1,3,2,4,5,9)(1,2,3,4,5,9)
5 단계: (1,2,3,4,5,9)↑
(1,2,3,4,5,9)
6
Bubble sort에서 각 단계에서 걸리는 시간은 두 가지 동작에 의해 결정된다.
1. 비교(comparison)2. 위치 교환(swap)
각 단계에서 “비교”와 “위치 교환”을 하는 회수는 얼마인가?
Selection sort
7
Get n and a list of n items, (a1,a2, …, an)marker ← nWhile (marker ≠ 1)
large ← a1
large_position← 1i ← 2while (i ≤ marker)
if ( ai > large) large ← ai
large_postion ← ii ← i +1
exchange alarge_postion with amarker
marker ← marker - 1
8
예를 들어, 리스트 (5, 1, 3, 9, 4, 2)을 정렬한다면,
1 단계: (5,1,3,9,4,2)↑
large=5 (5,1,3,9,4,2)large=5 (5,1,3,9,4,2)large=9 (5,1,3,9,4,2)large=9 (5,1,3,9,4,2)large=9 (5,1,3,9,4,2)
(5,1,3,2,4,9)2 단계: (5,1,3,2,4,9)
↑large=5 (5,1,3,2,4,9)large=5 (5,1,3,2,4,9)large=5 (5,1,3,2,4,9)large=5 (5,1,3,2,4,9)
(4,1,3,2,5,9)
3 단계: (4,1,3,2,5,9)↑
large=4 (4,1,3,2,5,9)(4,1,3,2,5,9)(4,1,3,2,5,9)(2,1,3,4,5,9)
4 단계: (2,1,3,4,5,9)↑
large=2 (2,1,3,4,5,9)large=3 (2,1,3,4,5,9)
(2,1,3,4,5,9)
5 단계: (2,1,3,4,5,9)↑
large=2 (2,1,3,4,5,9)(1,2,3,4,5,9)
9
각 단계에서 “비교”와 “위치 교환”을 하는 회수는 얼마인가?
10
두 개의 sort 알고리즘의 비교 회수는?
N개로 이루어진 리스트에서(n-1) + (n-2) + (n-3) + … + 2 + 1 = n(n-1)/2
n n2 n(n-1)/2
10 100 45
100 10,000 4,950
1000 1,000,000 499,500
10000 100,000,000 49,995,000
100000 10,000,000,000 4,999,950,000
11
앞의 표에서 보는 바와 같이 n(n-1)/2은 n2과 동일한 추세로증가한다.
증가 추세를 결정하는 것은 최고 차수(n2)이고 나머지 차수는상관없다.
그리고 최고 차수의 계수의 값에 상관없이 증가 추세는 최고 차수에의해 결정된다.
12
0.0001n2과 100n은 어느 것이 계산 회수가 더 많은가?
n이 커지면 결국은 n2이 n보다 계산 회수가 많아진다.
13
2n2
100n2
2n2+10n
등등
n2
따라서, c2n2+c1n+c0 의 증가 추세는 n2이라고 할 수 있다.
단순 정렬 알고리즘의 복잡도
14
그렇다면 우리는 다음과 같이 정렬(sort) 알고리즘의 복잡도를정리할 수 있다.
정렬 알고리즘의 복잡도는 비교하는 회수에 의해 결정된다.비교 회수는 n(n-1)/2이다.
단순 정렬 알고리즘의 복잡도는 n2이라고 할 수 있다.
n(n-1)/2의 증가 추세는 n2으로 나타낼 수 있다.
15
알고리즘의 복잡도를 결정하는 것은n이 증가할 때 계산 회수의 증가 추세이다.
따라서 알고리즘의 복잡도가 n인 것은 n2보다더 좋은 알고리즘이다.
알고리즘 복잡도
16
앞에서 본 바와 같이 어떤 알고리즘의 복잡도는함수 f(n)으로 나타낼 수 있다.
f(n) : 입력 데이터의 수 n에 대한계산 회수의 증가추세를 나타내는 식
f(n)의 비교
알고리즘 복잡도 표기법
17
어떤 알고리즘의 복잡도를 나타내는 함수를O(f(n))으로 표현한다. (Big-Oh라고 읽음)
O(f(n))이외에도 Θ(f(n)), Ω(f(n))등이 있는데이것의 자세한 정의는 여기서는 생략한다.
18
우리가 관심을 갖는 (실행 가능한) 알고리즘은O(nk)이다.
- 즉, 1, n, n2, n3 등등- 그리고 O(log n), 혹은 O(n logn)은 아주
좋은 알고리즘이다.- polynomially bounded
만약 어떤 문제를 푸는 알고리즘의 복잡도가O(kn)이라면 우리는 그 문제를아주 어려운(intractable) 문제라고 한다.
19
만약에 1초에 10,000번 연산을 하는 컴퓨터라면,
예: 순차 검색(sequential search)
20
알고리즘 분석
21
이 알고리즘의 실행 시간은 비교 회수에 의해 결정된다.
최선의 경우(best case) – 비교 회수는 1번최악의 경우(worst case) – 비교 회수는 n번평균 경우(average case) – 비교 회수는 n/2번
따라서, 이 알고리즘의 증가 추세 함수 f(n)=?
이 알고리즘의 복잡도는 O(n)이다.
예: 이진 탐색(binary search)
22
get target, N and [n1,n2,…nN]beginning ← 1end ← nFound ← NOWhile (Found = NO AND beginning ≤ end)
m ← (beginning + end)/2if (target = nm)
print nm
Found = YESelse
if(target < nm) end ← m-1
elsebeginning ← m+1
if (Found = NO) print “can’t find target”stop
예: 이진 탐색(binary search)
23
만약 list가 정렬이 되어 있다면,
예: target=10, list = [1, 4, 5, 7, 10, 12, 14, 22]
1st 비교: mid=4 (value=7), target > 7, 왼쪽 부분은 버림
[1, 4, 5, 7, 10, 12, 14, 22]
2nd 비교: mid=7 (value=14), target < 14, 오른쪽 부분은 버림
3rd 비교: mid=5 (value=10), target=10, 드디어 찾음!!
[1, 4, 5, 7, 10, 12, 14, 22]
알고리즘 분석
24
이 알고리즘의 실행 시간은 비교 회수에 의해 결정된다.
최선의 경우(best case) – 비교 회수는 1번
최악의 경우(worst case) – 비교 회수는 ??
25
7=10?
1, 4, 5 10, 12, 14, 22
14=10?
10, 12 22
10=10?
10 12마지막까지 비교할 경우log2 n 만큼 비교하게 된다.
알고리즘 분석
26
이 알고리즘의 실행 시간은 비교 회수에 의해 결정된다.
최선의 경우(best case) – 비교 회수는 1번최악의 경우(worst case) – 비교 회수는 log2n평균 경우(average case) – 비교 회수는 log2n/2
따라서, 이 알고리즘의 증가 추세 함수 f(n)=?
이 알고리즘의 복잡도는 O(log2n)이다.