일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 코딩좀알려주라
- 프로그래밍
- 알고리즘
- 대외활동
- 한국외대
- 파이썬
- 양방향 연결 리스트
- 큐
- HTML
- 코뮤니티
- 자료구조
- 모각코
- 코딩
- 스택
- 선형 자료 구조
- 한국대학생IT경영학회
- 서포터즈
- 웹 기초
- 대학생
- 연결 리스트
- LIFO
- 한방향 연결 리스트
- O(1)
- 리스트
- 동적 배열
- CSS
- IT
- 수파자
- 시간 복잡도
- FIFO
Archives
- Today
- Total
대학생 쩡딱구리
1-2. 시간 복잡도 분석 본문
1. 알고리즘 분석
0. 알고리즘과 자료 구조 1. 알고리즘이란? "유튜브 알고리즘이 나를 꽤 괜찮은 곳으로 데리고 왔다." 2PM의 '우리 집' 유튜브 영상에 달린 베스트 댓글 중 하나다. 이 예시와 같이 우리는 알게 ��
jjeongttakgoori.tistory.com
이번 게시글도 저번 게시글에서 이어진다.
1. 시간 복잡도
시간 복잡도(Time Complexity)란 연산의 실행 횟수를 입력 크기 n에 대한 함수로 표기한 것을 말한다. 알고리즘 내에서 실행되는 기본 연산의 횟수라고도 볼 수 있는 시간 복잡도는 T(n)(n은 입력의 크기)으로 표시한다. 알고리즘에서 시간 복잡도를 분석하기 위해서는 몇 가지 가정을 해야 한다.
1. 알고리즘은 가상 컴퓨터에서 가상 언어로 작성되어야 한다.
- 가상 컴퓨터: 하드웨어의 용량 제한이 없는 RAM, 폰 노이만 구조를 따름
- 가상 언어: 실제 프로그래밍 언어보다 간단하고 융통성 있음.
- 가상 코드: 가상 언어로 작성된 코드로, 의사 코드(Pseudo Code)라고도 함.
2. 최악의 경우 입력을 가정해 알고리즘의 수행 시간을 측정한다. - 최악의 수행 시간 T(n)
3. 알고리즘의 실제 수행 시간 = 연산 횟수 X 상수
2. 시간 복잡도 분석
시간 복잡도를 어떻게 분석할 수 있을까? 카드 놀이에서의 삽입 정렬을 예로 들어보자.
- 테이블에 카드가 뒤집힌 채 쌓여 있고, 가장 위의 카드를 한 장씩 가져와 정렬하고자 한다.
- 왼손에 들고 있는 카드와 앞에서 한 장씩 비교해 정렬된 위치를 찾는다.
- 따라서 왼손에는 항상 카드가 정렬되어 있고 이 카드는 원래 테이블에 쌓여 있던 카드의 윗쪽에 있던 카드이다.
- 이 과정을 테이블에 쌓여 있는 모든 카드에 대해 반복하면 전체 카드가 정렬된다.
이제 이러한 상황에서 삽입 정렬에 대한 가상 코드를 작성해보았다.
INSERTION-SORT(A) # 주의: index가 1부터 시작되는 것으로 가정되어 있음
for j = 2 to A:length
key = A[j]
// Insert A[j] into the sorted sequence A[1 .. j - 1]
i = j - 1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i - 1
A[i + 1] = key
이 코드를 실행할 때 최악의 수행 시간은 아래와 같을 것이다.
INSERTION-SORT(A) # cost: times
for j = 2 to A:length # c1: n
key = A[j] # c2: n-1
// Insert A[j] ~ # 0: n-1
i = j - 1 # c4: n-1
while i > 0 and A[i] > key # c5: σ 𝑗=2 to n tj (tj = j)
A[i + 1] = A[i] # c6: σ 𝑗=2 to n (tj-1) (tj = j)
i = i - 1 # c7: σ 𝑗=2 to n (tj-1) (tj = j)
A[i + 1] = key # c8: n-1
즉, 삽입 정렬에서 알고리즘의 수행 시간을 간단히 정리하면 다음과 같을 것이다.
tj = ∑nj=2 j = n(n+1)/2 - 1 ∑nj=2 (j-1) = ∑n-1j=1 j = n(n-1)/2 이므로
T(n) = (c5/2 + c6/2 + c7/2)n2 + (c1 + c2 + c4 + c5/2 - c6/2 - c7/2 + c8)n
- (c2 + c4 + c5 + c8)
3. 점근적 표기법
연산의 횟수를 정확히 세는 건 귀찮고 까다로운 편이기 때문에 시간 복잡도를 추상화하거나, 추상화한 것을 단순화한다. 이것을 점근적 표기법(Asymptotic Notation)이라 한다.
추상화 | 추상화의 단순화 |
T(n) = an2 + bn + c a = (c5/2 + c6/2 + c7/2) b = (c1 + c2 + c4 + c5/2 - c6/2 - c7/2 + c8) c = - (c2 + c4 + c5 + c8) cost를 추상화함 |
O(n2 ) Rate of growth of f(n): 입력의 크기 n에 대해 수행 시간이 증가하는 정도, 최고 차수 항만 남기고 나머지 생략 Rate of growth가 중요 |
다음 게시글에서는 Big-O 표기법을 다룬다!
'STUDIES > DATA STRUCTURE' 카테고리의 다른 글
2-1. 배열 (0) | 2020.10.14 |
---|---|
1-3. Big-O 표기법 (0) | 2020.10.14 |
1-1. 알고리즘 분석 (0) | 2020.10.13 |
0. 파이썬의 자료구조 (0) | 2020.10.10 |
0. 알고리즘과 자료 구조 (0) | 2020.10.10 |