各種時間複雜度 c++ 範例
各種時間複雜度 c++ 範例
資料來源: https://chatgpt.com/s/t_68ef0f807e1081919ce4c96ab4cf31b2
O(1) – 常數時間(yeah)-不論輸入大小,執行時間固定。[數學又比演算法重要的重要演示]
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
cout << arr[2]; // 直接存取固定位置
return 0;
}
O(log n) – 對數時間(nice)-通常出現在「每次把問題縮小一半」的演算法(例如二分搜尋)。
#include <iostream>
#include <vector>
using namespace std;
int binarySearch(const vector<int>& arr, int target) {
int left = 0, right = arr.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
int main() {
vector<int> v = {1, 3, 5, 7, 9, 11, 13};
cout << binarySearch(v, 9);
}
O(n log n) – 線性對數時間(k-ish)-常見於快速排序(QuickSort)、合併排序(MergeSort)等分治演算法。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v = {5, 2, 9, 1, 5, 6};
sort(v.begin(), v.end()); // C++ sort() 是 O(n log n)
for (int x : v) cout << x << " ";
}
O(n) – 線性時間(ok)-隨著輸入資料量增加,執行時間等比例增加。[數學又比演算法重要的重要演示]
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
int sum = 0;
for (int x : v)
sum += x; // 每個元素都要處理一次
cout << sum;
}
O(n²) – 平方時間(my)-每個元素都要和其他元素比較,例如氣泡排序。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {5, 3, 8, 4, 2};
for (int i = 0; i < v.size(); ++i)
for (int j = i + 1; j < v.size(); ++j)
if (v[i] > v[j]) swap(v[i], v[j]);
for (int x : v) cout << x << " ";
}
O(n³) – 立方時間-每個元素都要和其他元素比較,例如氣泡排序。
#include <iostream>
using namespace std;
int main() {
int n = 3;
int sum = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
for (int k = 0; k < n; ++k)
sum += i + j + k;
cout << sum;
}
O(2ⁿ) – 指數時間-典型例子是遞迴解費波那契數列(無記憶化)。
#include <iostream>
using namespace std;
int fib(int n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
int main() {
cout << fib(20); // 計算成本隨 n 成指數增長
}
O(n!) – 階乘時間-排列組合類問題,例如產生所有排列(backtracking)。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v = {1, 2, 3};
do {
for (int x : v) cout << x << " ";
cout << endl;
} while (next_permutation(v.begin(), v.end()));
}
上面所有整合的完整Code
// time_complexity_demo.cpp
// 各種常見時間複雜度範例 + 執行時間比較
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>
using namespace std;
using namespace chrono;
// ===== O(1) =====
void O1_example() {
int arr[] = {1, 2, 3, 4, 5};
volatile int x = arr[2]; // volatile 防止編譯器優化
}
// ===== O(log n) =====
int binarySearch(const vector<int>& arr, int target) {
int left = 0, right = arr.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
void OlogN_example(int n) {
vector<int> v(n);
for (int i = 0; i < n; ++i) v[i] = i;
binarySearch(v, n - 1);
}
// ===== O(n) =====
void ON_example(int n) {
vector<int> v(n);
long long sum = 0;
for (int i = 0; i < n; ++i) sum += i;
}
// ===== O(n log n) =====
void OnlogN_example(int n) {
vector<int> v(n);
for (int i = 0; i < n; ++i) v[i] = rand();
sort(v.begin(), v.end());
}
// ===== O(n^2) =====
void On2_example(int n) {
long long cnt = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
cnt += i + j;
}
// ===== O(n^3) =====
void On3_example(int n) {
long long cnt = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
for (int k = 0; k < n; ++k)
cnt += i + j + k;
}
// ===== O(2^n) =====
int fib(int n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
void O2n_example(int n) {
fib(n);
}
// ===== O(n!) =====
void permute(vector<int>& v, int l, int r) {
if (l == r) return;
for (int i = l; i <= r; ++i) {
swap(v[l], v[i]);
permute(v, l + 1, r);
swap(v[l], v[i]);
}
}
void OnFactorial_example(int n) {
vector<int> v(n);
for (int i = 0; i < n; ++i) v[i] = i + 1;
permute(v, 0, n - 1);
}
// ===== 通用時間測量工具 =====
template <typename Func>
void measure(const string& name, Func f) {
auto start = high_resolution_clock::now();
f();
auto end = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(end - start).count();
cout << name << " 耗時: " << duration << " ms" << endl;
}
// ===== 主程式 =====
int main() {
cout << "==== 各種時間複雜度測試 ====" << endl;
measure("O(1)", []() { O1_example(); });
measure("O(log n)", []() { OlogN_example(1'000'000); });
measure("O(n)", []() { ON_example(1'000'000); });
measure("O(n log n)", []() { OnlogN_example(200'000); });
measure("O(n^2)", []() { On2_example(1'000); });
measure("O(n^3)", []() { On3_example(200); });
measure("O(2^n)", []() { O2n_example(25); }); // 小心,太大會爆炸!
measure("O(n!)", []() { OnFactorial_example(9); }); // 9! = 362,880 組合
cout << "=============================" << endl;
cout << "完成!可觀察不同複雜度耗時差異。" << endl;
return 0;
}
⚙️ 附加:各複雜度增長對比(理論)
| 複雜度 | n=10 | n=20 | n=50 | n=100 |
|---|---|---|---|---|
| O(1) | 1 | 1 | 1 | 1 |
| O(log n) | 3 | 4 | 6 | 7 |
| O(n) | 10 | 20 | 50 | 100 |
| O(n log n) | 30 | 80 | 282 | 664 |
| O(n²) | 100 | 400 | 2500 | 10000 |
| O(2ⁿ) | 1024 | 1,048,576 | — | — |
| O(n!) | 3,628,800 | 巨大 | — | — |
=========================================
上面自適應HTML表格(奇偶數被景色特意強化) code
<br /> <h2 data-start="2697" data-end="2722"> ⚙️ <strong data-start="2703" data-end="2722">附加:各複雜度增長對比(理論)</strong> </h2> <div class="_tableContainer_1rjym_1"> <div tabindex="-1" class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse"> <table data-start="2724" data-end="3034" class="w-fit min-w-(--thread-content-width)"> <thead data-start="2724" data-end="2760"> <tr data-start="2724" data-end="2760"> <th data-start="2724" data-end="2730" data-col-size="sm"> 複雜度 </th> <th data-start="2730" data-end="2737" data-col-size="sm"> n=10 </th> <th data-start="2737" data-end="2744" data-col-size="sm"> n=20 </th> <th data-start="2744" data-end="2751" data-col-size="sm"> n=50 </th> <th data-start="2751" data-end="2760" data-col-size="sm"> n=100 </th> </tr> </thead> <tbody data-start="2805" data-end="3034"> <tr data-start="2805" data-end="2829"> <td data-start="2805" data-end="2812" data-col-size="sm"> O(1) </td> <td data-col-size="sm" data-start="2812" data-end="2816"> 1 </td> <td data-col-size="sm" data-start="2816" data-end="2820"> 1 </td> <td data-col-size="sm" data-start="2820" data-end="2824"> 1 </td> <td data-col-size="sm" data-start="2824" data-end="2829"> 1 </td> </tr> <tr data-start="2830" data-end="2858"> <td data-start="2830" data-end="2841" data-col-size="sm"> O(log n) </td> <td data-col-size="sm" data-start="2841" data-end="2845"> 3 </td> <td data-col-size="sm" data-start="2845" data-end="2849"> 4 </td> <td data-col-size="sm" data-start="2849" data-end="2853"> 6 </td> <td data-col-size="sm" data-start="2853" data-end="2858"> 7 </td> </tr> <tr data-start="2859" data-end="2888"> <td data-start="2859" data-end="2866" data-col-size="sm"> O(n) </td> <td data-col-size="sm" data-start="2866" data-end="2871"> 10 </td> <td data-col-size="sm" data-start="2871" data-end="2876"> 20 </td> <td data-col-size="sm" data-start="2876" data-end="2881"> 50 </td> <td data-col-size="sm" data-start="2881" data-end="2888"> 100 </td> </tr> <tr data-start="2889" data-end="2925"> <td data-start="2889" data-end="2902" data-col-size="sm"> O(n log n) </td> <td data-col-size="sm" data-start="2902" data-end="2907"> 30 </td> <td data-col-size="sm" data-start="2907" data-end="2912"> 80 </td> <td data-col-size="sm" data-start="2912" data-end="2918"> 282 </td> <td data-col-size="sm" data-start="2918" data-end="2925"> 664 </td> </tr> <tr data-start="2926" data-end="2962"> <td data-start="2926" data-end="2934" data-col-size="sm"> O(n²) </td> <td data-col-size="sm" data-start="2934" data-end="2940"> 100 </td> <td data-col-size="sm" data-start="2940" data-end="2946"> 400 </td> <td data-col-size="sm" data-start="2946" data-end="2953"> 2500 </td> <td data-col-size="sm" data-start="2953" data-end="2962"> 10000 </td> </tr> <tr data-start="2963" data-end="2999"> <td data-start="2963" data-end="2971" data-col-size="sm"> O(2ⁿ) </td> <td data-col-size="sm" data-start="2971" data-end="2978"> 1024 </td> <td data-col-size="sm" data-start="2978" data-end="2990"> 1,048,576 </td> <td data-col-size="sm" data-start="2990" data-end="2994"> — </td> <td data-col-size="sm" data-start="2994" data-end="2999"> — </td> </tr> <tr data-start="3000" data-end="3034"> <td data-start="3000" data-end="3008" data-col-size="sm"> O(n!) </td> <td data-col-size="sm" data-start="3008" data-end="3020"> 3,628,800 </td> <td data-col-size="sm" data-start="3020" data-end="3025"> 巨大 </td> <td data-col-size="sm" data-start="3025" data-end="3029"> — </td> <td data-col-size="sm" data-start="3029" data-end="3034"> — </td> </tr> </tbody> </table> </div> </div> <br />
<p> <br /> </p> <h2 data-start="2697" data-end="2722"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>⚙️ </strong></span><strong data-start="2703" data-end="2722"><span style="font-family:DFKai-SB;font-size:24px;color:#E53333;">附加:各複雜度增長對比(理論)</span></strong> </h2> <div class="_tableContainer_1rjym_1"> <div tabindex="-1" class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse"> <table data-start="2724" data-end="3034" class="w-fit min-w-(--thread-content-width)"> <thead data-start="2724" data-end="2760"> <tr data-start="2724" data-end="2760"> <th data-start="2724" data-end="2730" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>複雜度</strong></span> </th> <th data-start="2730" data-end="2737" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>n=10</strong></span> </th> <th data-start="2737" data-end="2744" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>n=20</strong></span> </th> <th data-start="2744" data-end="2751" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>n=50</strong></span> </th> <th data-start="2751" data-end="2760" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>n=100</strong></span> </th> </tr> </thead> <tbody data-start="2805" data-end="3034"> <tr data-start="2805" data-end="2829"> <td data-start="2805" data-end="2812" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>O(1)</strong></span> </td> <td data-col-size="sm" data-start="2812" data-end="2816"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>1</strong></span> </td> <td data-col-size="sm" data-start="2816" data-end="2820"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>1</strong></span> </td> <td data-col-size="sm" data-start="2820" data-end="2824"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>1</strong></span> </td> <td data-col-size="sm" data-start="2824" data-end="2829"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>1</strong></span> </td> </tr> <tr data-start="2830" data-end="2858"> <td data-start="2830" data-end="2841" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>O(log n)</strong></span> </td> <td data-col-size="sm" data-start="2841" data-end="2845"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>3</strong></span> </td> <td data-col-size="sm" data-start="2845" data-end="2849"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>4</strong></span> </td> <td data-col-size="sm" data-start="2849" data-end="2853"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>6</strong></span> </td> <td data-col-size="sm" data-start="2853" data-end="2858"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>7</strong></span> </td> </tr> <tr data-start="2859" data-end="2888"> <td data-start="2859" data-end="2866" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>O(n)</strong></span> </td> <td data-col-size="sm" data-start="2866" data-end="2871"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>10</strong></span> </td> <td data-col-size="sm" data-start="2871" data-end="2876"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>20</strong></span> </td> <td data-col-size="sm" data-start="2876" data-end="2881"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>50</strong></span> </td> <td data-col-size="sm" data-start="2881" data-end="2888"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>100</strong></span> </td> </tr> <tr data-start="2889" data-end="2925"> <td data-start="2889" data-end="2902" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>O(n log n)</strong></span> </td> <td data-col-size="sm" data-start="2902" data-end="2907"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>30</strong></span> </td> <td data-col-size="sm" data-start="2907" data-end="2912"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>80</strong></span> </td> <td data-col-size="sm" data-start="2912" data-end="2918"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>282</strong></span> </td> <td data-col-size="sm" data-start="2918" data-end="2925"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>664</strong></span> </td> </tr> <tr data-start="2926" data-end="2962"> <td data-start="2926" data-end="2934" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>O(n²)</strong></span> </td> <td data-col-size="sm" data-start="2934" data-end="2940"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>100</strong></span> </td> <td data-col-size="sm" data-start="2940" data-end="2946"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>400</strong></span> </td> <td data-col-size="sm" data-start="2946" data-end="2953"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>2500</strong></span> </td> <td data-col-size="sm" data-start="2953" data-end="2962"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>10000</strong></span> </td> </tr> <tr data-start="2963" data-end="2999"> <td data-start="2963" data-end="2971" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>O(2ⁿ)</strong></span> </td> <td data-col-size="sm" data-start="2971" data-end="2978"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>1024</strong></span> </td> <td data-col-size="sm" data-start="2978" data-end="2990"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>1,048,576</strong></span> </td> <td data-col-size="sm" data-start="2990" data-end="2994"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>—</strong></span> </td> <td data-col-size="sm" data-start="2994" data-end="2999"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>—</strong></span> </td> </tr> <tr data-start="3000" data-end="3034"> <td data-start="3000" data-end="3008" data-col-size="sm"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>O(n!)</strong></span> </td> <td data-col-size="sm" data-start="3008" data-end="3020"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>3,628,800</strong></span> </td> <td data-col-size="sm" data-start="3020" data-end="3025"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>巨大</strong></span> </td> <td data-col-size="sm" data-start="3025" data-end="3029"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>—</strong></span> </td> <td data-col-size="sm" data-start="3029" data-end="3034"> <span style="font-family:DFKai-SB;font-size:24px;color:#E53333;"><strong>—</strong></span> </td> </tr> </tbody> </table> </div> </div> <span style="font-family:DFKai-SB;font-size:24px;"><strong></strong></span><br /> <br />