01_complexity.cpp

Download
cpp 259 lines 7.9 KB
  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}