CSE/컴퓨터알고리즘
[시간복잡도] 개념 정리
minkylee
2024. 4. 20. 18:39
알고리즘이란?
- 컴퓨터 프로그램
- 특정 작업 (ex. 정렬)을 해결하는 개별 모듈로 구성된다.
- 문제를 해결하기 위한 절차나 방법, 더 정확한 정의로는 모든 입력값에 대해 튜링머신이 정지하게 하는 명령
표현 방법
- implementation
- 슈도 코드 (pseudo code)
- Natural Language(영어, 한국어)
- 알고리즘 이름, Input, Outpu, 방법이 나오도록 명시
용어 정리
- Correctness : 맞는 답을 찾아가는 과정
- ex. n개의 도시가 있고 도시간의 거리가 포함되어 있을 때 모든 도시를 방문하고 다시 내 도시로 돌아왔을 때 이동한 거리가 최소가 되는 값을 구해라
- 맞는 접근법을 찾아보자!
- 가장 가까운 도시부터 접근해서 돌아오기
- 모든 방법을 검사해서 최소값을 찾기
- 이런식으로 맞는 답을 찾아간다.
- ex. n개의 도시가 있고 도시간의 거리가 포함되어 있을 때 모든 도시를 방문하고 다시 내 도시로 돌아왔을 때 이동한 거리가 최소가 되는 값을 구해라
- Effiency : 얼마나 효율적인가
- 복잡도 분석
- Time complexity: 시간이 얼마나 걸리는가
- Memory(space) complexity : 메모리를 얼마나 차지하는가
복잡도 측정하기
어떤 문제를 풀 때 사용되는 Step 수가 달라진다.
하나의 instance를 넣었을 때
- worst case running time : 가장 최악의 step에 의해
- best case running time : 가장 최소의 step에 의해
- average case running time : 평균적인 step에 의해 (분석하기가 까탈스럽다.)
간단한 표현
n이 커질수록 차수가 작은 항들은 무시된다.
사이즈가 어느정도 커지고 나면
logn, n, nlogn, n^2 , n^3, 2^n 순으로 시간이 많이 걸린다.
어떤 일반적인 룰을 가지게 됨을 볼 수 있다.
빅 오 표기법
- 주어진 함수에서 가장 빨리 증가하는 항만을 남긴 채 나머지를 다 버리는 표기법
- 시간복잡도는 계산하기 힘들다는 문제점이 있음
- 모호한 필요 명령어의 수, 복잡한 알고리즘에서의 명령 수 계산 등
- 따라서 가장 깊이 중첩된 반복문의 개수만 고려했던 것처럼 전체 수행 시간에 큰 영향을 미치지 않는 상수 부분은 무시하고 반복문의 반복 수만 고려하게 되는 것
- 대략적으로 함수의
상한
을 나타낸다.
- 이 때 적절한 상수 C를 선택해서 $ N^2 $에 곱해주면 항상 $ N^2 $이 더 크다고 할 수 있음 (C와 N은 마음대로 결정할 수 있음)
- $ N^2 $ 은 100N + 1보다 작지만 이 중에서 가장 빨리 증가하는 항
- 빅 오 표기법의 경우 각 경우의 수행시간을 간단히 나타내는 표기법일 뿐, 특별히 최악의 수행 시간과 관련이 있는 것은 아님
- 예를 들어 퀵 정렬의 최악의 수행 시간을 분석해 보면 최고차항이 $ N^2 $으로 시간복잡도는 $ O(N^2)$ 이다.
- 그러나 평균 수행 시간을 계산해보면 최고차항이 NlogN 으로 평균 시간 복잡도는 최악의 경우와 달리 $ O(NlogN) $ 이다.
빅 오 표기법 이외에 다른 표기법도 있다.
- f(n) = Ω(g(n)) : f(n)의 하한이다.
- f(n) = Θ(g(n)) : n이 충분히 크다면 실행시간이 어떤 상수 $k_1$과 $k_2$에 대하여 최소 $n * k_1$ 이며 최대 $n *k_2$ 이 된다는 뜻이다.
참고
https://yurimkoo.github.io/algorithm/2020/05/09/time-complexity-2.html