1/*
2 * ์๊ฐ ๋ณต์ก๋ (Time Complexity)
3 * Big O Notation and Complexity Analysis
4 *
5 * ์๊ณ ๋ฆฌ์ฆ์ ํจ์จ์ฑ์ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
6 */
7
8#include <iostream>
9#include <vector>
10#include <algorithm>
11#include <chrono>
12#include <functional>
13
14using namespace std;
15
16// =============================================================================
17// 1. O(1) - ์์ ์๊ฐ
18// =============================================================================
19
20int constantTime(const vector<int>& arr) {
21 // ๋ฐฐ์ด ํฌ๊ธฐ์ ๋ฌด๊ดํ๊ฒ ํญ์ ์ผ์ ํ ์๊ฐ
22 return arr[0];
23}
24
25// =============================================================================
26// 2. O(log n) - ๋ก๊ทธ ์๊ฐ
27// =============================================================================
28
29int binarySearch(const vector<int>& arr, int target) {
30 int left = 0, right = arr.size() - 1;
31
32 while (left <= right) {
33 int mid = left + (right - left) / 2;
34
35 if (arr[mid] == target)
36 return mid;
37 else if (arr[mid] < target)
38 left = mid + 1;
39 else
40 right = mid - 1;
41 }
42
43 return -1;
44}
45
46// =============================================================================
47// 3. O(n) - ์ ํ ์๊ฐ
48// =============================================================================
49
50int linearSearch(const vector<int>& arr, int target) {
51 for (size_t i = 0; i < arr.size(); i++) {
52 if (arr[i] == target)
53 return i;
54 }
55 return -1;
56}
57
58int sumArray(const vector<int>& arr) {
59 int sum = 0;
60 for (int x : arr) {
61 sum += x;
62 }
63 return sum;
64}
65
66// =============================================================================
67// 4. O(n log n) - ์ ํ ๋ก๊ทธ ์๊ฐ
68// =============================================================================
69
70void merge(vector<int>& arr, int left, int mid, int right) {
71 vector<int> L(arr.begin() + left, arr.begin() + mid + 1);
72 vector<int> R(arr.begin() + mid + 1, arr.begin() + right + 1);
73
74 size_t i = 0, j = 0;
75 int k = left;
76
77 while (i < L.size() && j < R.size()) {
78 if (L[i] <= R[j])
79 arr[k++] = L[i++];
80 else
81 arr[k++] = R[j++];
82 }
83
84 while (i < L.size()) arr[k++] = L[i++];
85 while (j < R.size()) arr[k++] = R[j++];
86}
87
88void mergeSort(vector<int>& arr, int left, int right) {
89 if (left < right) {
90 int mid = left + (right - left) / 2;
91 mergeSort(arr, left, mid);
92 mergeSort(arr, mid + 1, right);
93 merge(arr, left, mid, right);
94 }
95}
96
97// =============================================================================
98// 5. O(nยฒ) - ์ด์ฐจ ์๊ฐ
99// =============================================================================
100
101void bubbleSort(vector<int>& arr) {
102 int n = arr.size();
103 for (int i = 0; i < n - 1; i++) {
104 for (int j = 0; j < n - i - 1; j++) {
105 if (arr[j] > arr[j + 1]) {
106 swap(arr[j], arr[j + 1]);
107 }
108 }
109 }
110}
111
112int countPairs(const vector<int>& arr) {
113 int count = 0;
114 int n = arr.size();
115 for (int i = 0; i < n; i++) {
116 for (int j = i + 1; j < n; j++) {
117 count++;
118 }
119 }
120 return count; // n*(n-1)/2
121}
122
123// =============================================================================
124// 6. O(2^n) - ์ง์ ์๊ฐ
125// =============================================================================
126
127int fibonacciRecursive(int n) {
128 if (n <= 1) return n;
129 return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
130}
131
132// O(n) ์ต์ ํ ๋ฒ์
133int fibonacciIterative(int n) {
134 if (n <= 1) return n;
135
136 int prev2 = 0, prev1 = 1;
137 for (int i = 2; i <= n; i++) {
138 int curr = prev1 + prev2;
139 prev2 = prev1;
140 prev1 = curr;
141 }
142 return prev1;
143}
144
145// =============================================================================
146// 7. ์๊ฐ ์ธก์ ์ ํธ๋ฆฌํฐ
147// =============================================================================
148
149template<typename Func, typename... Args>
150double measureTime(Func func, Args&&... args) {
151 auto start = chrono::high_resolution_clock::now();
152 func(forward<Args>(args)...);
153 auto end = chrono::high_resolution_clock::now();
154 chrono::duration<double> diff = end - start;
155 return diff.count();
156}
157
158// =============================================================================
159// 8. ๊ณต๊ฐ ๋ณต์ก๋ ์์
160// =============================================================================
161
162// O(1) ๊ณต๊ฐ
163void reverseInPlace(vector<int>& arr) {
164 int n = arr.size();
165 for (int i = 0; i < n / 2; i++) {
166 swap(arr[i], arr[n - 1 - i]);
167 }
168}
169
170// O(n) ๊ณต๊ฐ
171vector<int> reverseWithCopy(const vector<int>& arr) {
172 vector<int> result(arr.rbegin(), arr.rend());
173 return result;
174}
175
176// =============================================================================
177// ํ
์คํธ
178// =============================================================================
179
180void printArray(const vector<int>& arr, int limit = 10) {
181 cout << " [";
182 for (size_t i = 0; i < arr.size() && i < (size_t)limit; i++) {
183 cout << arr[i];
184 if (i < arr.size() - 1 && i < (size_t)limit - 1) cout << ", ";
185 }
186 if (arr.size() > (size_t)limit) cout << ", ...";
187 cout << "]" << endl;
188}
189
190int main() {
191 cout << "============================================================" << endl;
192 cout << "์๊ฐ ๋ณต์ก๋ (Time Complexity) ์์ " << endl;
193 cout << "============================================================" << endl;
194
195 // 1. O(1)
196 cout << "\n[1] O(1) - ์์ ์๊ฐ" << endl;
197 vector<int> arr1 = {5, 2, 8, 1, 9};
198 cout << " ์ฒซ ๋ฒ์งธ ์์: " << constantTime(arr1) << endl;
199
200 // 2. O(log n)
201 cout << "\n[2] O(log n) - ์ด๋ถ ํ์" << endl;
202 vector<int> arr2 = {1, 3, 5, 7, 9, 11, 13, 15};
203 int idx = binarySearch(arr2, 7);
204 cout << " ๋ฐฐ์ด: [1,3,5,7,9,11,13,15]" << endl;
205 cout << " 7์ ์์น: " << idx << endl;
206
207 // 3. O(n)
208 cout << "\n[3] O(n) - ์ ํ ํ์" << endl;
209 vector<int> arr3 = {4, 2, 7, 1, 9, 3};
210 cout << " ๋ฐฐ์ด ํฉ: " << sumArray(arr3) << endl;
211
212 // 4. O(n log n)
213 cout << "\n[4] O(n log n) - ๋ณํฉ ์ ๋ ฌ" << endl;
214 vector<int> arr4 = {64, 34, 25, 12, 22, 11, 90};
215 cout << " ์ ๋ ฌ ์ : ";
216 printArray(arr4);
217 mergeSort(arr4, 0, arr4.size() - 1);
218 cout << " ์ ๋ ฌ ํ: ";
219 printArray(arr4);
220
221 // 5. O(nยฒ)
222 cout << "\n[5] O(nยฒ) - ๋ฒ๋ธ ์ ๋ ฌ" << endl;
223 vector<int> arr5 = {64, 34, 25, 12, 22, 11, 90};
224 bubbleSort(arr5);
225 cout << " ์ ๋ ฌ ํ: ";
226 printArray(arr5);
227 cout << " 5๊ฐ ์์์ ์ ๊ฐ์: " << countPairs(vector<int>(5)) << endl;
228
229 // 6. O(2^n) vs O(n)
230 cout << "\n[6] O(2^n) vs O(n) - ํผ๋ณด๋์น" << endl;
231 cout << " ํผ๋ณด๋์น(20) ์ฌ๊ท: " << fibonacciRecursive(20) << endl;
232 cout << " ํผ๋ณด๋์น(20) ๋ฐ๋ณต: " << fibonacciIterative(20) << endl;
233 cout << " ํผ๋ณด๋์น(40) ๋ฐ๋ณต: " << fibonacciIterative(40) << endl;
234
235 // 7. ๊ณต๊ฐ ๋ณต์ก๋
236 cout << "\n[7] ๊ณต๊ฐ ๋ณต์ก๋" << endl;
237 vector<int> arr7 = {1, 2, 3, 4, 5};
238 cout << " ์๋ณธ: ";
239 printArray(arr7);
240 reverseInPlace(arr7);
241 cout << " O(1) ๊ณต๊ฐ ๋ค์ง๊ธฐ: ";
242 printArray(arr7);
243
244 // 8. ๋ณต์ก๋ ์์ฝ
245 cout << "\n[8] ๋ณต์ก๋ ์์ฝ" << endl;
246 cout << " | ๋ณต์ก๋ | 1000๊ฐ ์ฐ์ฐ | ์์ |" << endl;
247 cout << " |-----------|-------------|-------------------|" << endl;
248 cout << " | O(1) | 1 | ๋ฐฐ์ด ์ธ๋ฑ์ฑ |" << endl;
249 cout << " | O(log n) | 10 | ์ด๋ถ ํ์ |" << endl;
250 cout << " | O(n) | 1000 | ์ ํ ํ์ |" << endl;
251 cout << " | O(n log n)| 10000 | ๋ณํฉ ์ ๋ ฌ |" << endl;
252 cout << " | O(nยฒ) | 1000000 | ๋ฒ๋ธ ์ ๋ ฌ |" << endl;
253 cout << " | O(2^n) | ๋งค์ฐ ํผ | ๋ชจ๋ ๋ถ๋ถ์งํฉ |" << endl;
254
255 cout << "\n============================================================" << endl;
256
257 return 0;
258}