(입출력) 0개 이상의 외부 입력, 1개 이상의 출력
(명확성) 각 단계는 모호하지 않고 단순 명확해야함
(유한성) 한정된 수의 작업 후에는 반드시 종료
(유효성) 모든 명령어는 수행 가능해야함.
- (실용적 관점) 효율적이어야 함.
설계
표현 / 기술
정확성 검증 ( 분석 )
효율성 분석 ( 분석 )
- Dynamic Programming
- 분할된 소문제들이 겹치는 부분을 가지고 있어, 이를 한 번만 계산할 수 있도록 하는 상향식 방법
- Divide and Conquer
- 문제를 더 작은 문제로 쪼갠 후, 각각의 해를 이용하여 전체 문제의 해를 찾는 하향식 방법
- Greedy
- 각 단계마다 최선이라고 여겨지는 선택을 통해 해를 찾는 방법
- 테스트 데이터는 일반성을 띄기 힘들거나 때에 따라 결과가 다를 수 있기 때문에
정확하지 않으므로, 좋은 방법이 아님.
- 수학적으로 논리 증명을 하기 때문에 Perfect하다.
그래서 아래의 방법으로 측정한다.
Sn : 크기가 n인 입력들의 집합
P(I) : 입력 I가 발생할 확률
t(I): 입력 I일 때의 수행 시간
시간 복잡도는 최악 수행 시간을 기준으로 한다.
def search_sequential(a: list, n, x):
i = 0 # c1 > 1번 수행
while a[i] != x: # c2 > k번 수행
i += 1 # c3 > k-1번 수행
return i # c4 1번 수행
평균 수행 시간
- k = 2 / n
최악 수행 시간
- k = n
n을 무한대로 보내면, 상수항 보다 n의 차수가 더 중요하다.
상수의 정확한 값은 컴퓨터의 성능이나 최적화에 따라 달라지므로 계산이 곤란.
입력 크기 n이 충분히 커짐에 따라 결정되는 성능
점근적 상한 ( Big-Oh )
점근적 하한 ( Big-Omega )
점근적 상하한 ( Big-Theta )
- 어떤 양수 c와 n0이 존재하여, 모든 n >= n0에 대해,
f(n) <= cg(n)을 만족하면, f(n) = O(g(n)) 이다.
- 어떤 양수 c와 n0이 존재하여, 모든 n >= n0에 대해,
f(n) >= cg(n)을 만족하면, f(n) = Omega(g(n)) 이다.
- 양의 상수 c1, c2와 n0가 존재하여 모든 n≥n0에 대해 c1g(n) ≤ f(n) ≤ c2g(n)이면,
f(n)=Θ(g(n))이다.
자기 자신의 알고리즘을 다시 수행하는 형태의 순환(Recursion, 재귀) 알고리즘의 성능은
지금까지의 방법으로 구할 수 없고 일반적으로 점화식을 유도하고 점화식의 폐쇄형을 구해서 계산한다.