(끼에엑 Big-O 표기법이다!)
1년도 더 전에 썼던 글이지만 (분명 참고 자료가 있었을텐데 기억나지 않음)
가끔 한 번씩 리마인딩 하기 좋을 것 같아서 남겨놓은 자료.
그땐 cpp로 코드예시를 들었지만, 이번엔 go로 바꿔보았다.
알고리즘의 자원 사용량을 분석한다.
주로 자원은 통상적으로 실행 시간, 메모리, 저장장치, 통신 등을 뜻하나
여기선 실행 시간의 분석에 대해서 다룬다.
입력으로 n개의 데이터가 저장된 배열이 주어지고, 그 중 n/2번째 데이터를 반환하는 경우
func find(data []int, n int) int{ return data[n/2]; }
→ n에 관계없이 상수 시간이 소요되며, 알고리즘의 시간 복잡도는 O(1)이다.
n개의 데이터가 저장된 배열이 주어지고, 그 합을 구하여 반환하는 경우
func sum(data []int, n int) int{ res = 0; for int i=0;i<n;i++ { res += data[i]; // 가장 자주 실행되는 문장 return res; }
→ 실행 횟수는 항상 n번이다.
→ 이처럼 가장 자주 실행되는 문장의 실행 횟수가 n번이라면, 모든 문장의 실행 횟수의 합은 n에 선형적으로 비례하고, 모든 연산들의 실행 횟수의 합도 n에 선형적으로 비례한다.
→ 선형 시간 복잡도를 가지며, 알고리즘의 시간 복잡도는 O(n)이다.
배열이 주어지고, 배열 안에 정수 target이 있는지 검색하는 경우
func find(data []int, n, target int){ for int i=0;i<n;i++ { if data[i] == target // 가장 자주 실행되는 문장 return i; } return -1; }
→ worst-case analysis는 n 이다.
배열에 중복된 원소가 있는지 검사하는 경우
func isDistinct(n int, data []int) bool{ for int i=0;i<n-1;i++ { for int j=i+1;j<n;j++ { if(data[i] == data[j]) // 가장 자주 실행되는 문장 return false; } } } return true; }
→ worst-case analysis는 n(n-1)/2 이다.
→ 시간복잡도는 O(n^2)로 나타낸다.
Q. 증가율이 곱셈일 경우?
for int i=1;i<n;i*=2 { // 가장 자주 실행되는 문장 }
→ worst-case analysis는 O(log2(n))