ex) O(n) 과 O(2^n) 비교
1. 100000 x n
2. 1000, 2000, 4000, 8000 .... (2^n x 1000)=> n값 커지면 기하급수적 증가


예제 1) 3n + 2는 Ω(n)이라고 할 수 있는가?
f(n) = 3n + 2
n = g(n)
3n + 2 >= c * n
c = 3이라고 하면,
-> 3n + 2 >= 3n
-> 2 >= 0
n0 값이 뭐가 되든 만족함
3n + 2 = O(n) => upper bound
3n + 2 = Ω(n) => lower bound
예제 2) 10n^2 + 4n + 2 = Ω(n^2)이라고 할 수 있는가?
f(n) = 10n^2 + 4n + 2
n^2 = g(n)
10n^2 + 4n + 2 >= c * n^2
c = 10이라고 하면,
-> 10n^2 + 4n + 2 >= 10n^2
-> 4n + 2 >= 0
-> 2(2n + 1) >= 0
-> n이 -1/2 이상이면 항상 만족함. n0 = -1/2
예제 3) 6 x 2^n + n^2 = Ω(2^n)이라고 할 수 있는가?
f(n) = 6 x 2^n + n^2
2^n = g(n)
6 x 2^n + n^2 >= c x 2^n
c = 6이라고 하면,
-> 6 x 2^n + n^2 >= 6 x 2^n
-> n^2 >= 0
-> n0 값이 뭐가 되든 만족함



ex) Sequential Search
1, 3, 4, 5, 6, 7, 9, 11, 15
1) worst-case => 15 or 15보다 더 큰 수(없는 수)
2) best-case => 1
int binsearch(int list[], int searchnum, int left, int right) { int middle; while (left <= right) { middle = (left + right) / 2; switch (COMPARE(list[middle], searchnum) { case -1: left = middle + 1; break; case 0: return middle; case 1: right = middle - 1; } } return -1; }worst-case => O(log(base2)n) --- (n/2->n/4->n/8......->1)
best-case => O(1)
float rsum(float list[], int n) { if (n) return rsum(list, n-1) + list[n-1]; return 0; }길이 n인 배열의 실행 시간 = 길이 n-1인 배열의 실행 시간 + 상수 시간
[Recurrence equation]
T(n) = T(n-1) + 1
T(0) = 1 => n=0이 되면 if문에서 나와 return 0 후 끝나므로 상수 시간 소요
- Solve T(n)
T(n) = T(n-1)+1
= (T(n-2)+1)+1
= ((T(n-3)+1)+1)+1
= ...
= (..((T(0)+1)+1)...)+1 = 1 + 1*n = n+1
=> O(n)
[Recurrence equation] (assume that n = 2^k)
T(n) = T(n/2) + 1
T(0) = 1
- Solve T(n)
T(n) = T(n/2)+1
= (T(n/4)+1)+1
= ((T(n/8)+1)+1)+1
= ...
= (..((T(n/2^k)+1)...)+1 = 1 + 1*k = 1+k = 1+log(base2)
=> O(log(base2)n)
F(0) = 0, F(1) = 1
F(i) = F(i-1) + F(i-2)for (i = 2; i <= n; i++) f[i] = f[i-1] + f[i-2]=> O(n)
[Recurrence equation]
T(n) = T(n-1) + T(n-2) + 1
T(0) = T(1) = 1
- Solve T(n)
T(n) = T(n-1)+T(n-2)+1 <= 2T(n-1)+1
2T(n-1)+1
= 2(2T(n-2)+1)+1
= 2(2(2T(n-3)+1)+1)+1
= ...
= 2^n-1T(1)+2^n-2+2^n-3+...+2+1 (등비수열)
=> O(2^n)- 등비수열의 합 공식 : a(r^k-1)/r-1 (공비 r, 항 개수 k, 첫번째 항 a)