时间复杂度是衡量算法运行时间随输入规模增长的趋势,用大 O 记号表示。核心思路:只看最高阶项,忽略常数和低阶项。
常见时间复杂度从小到大:
| 复杂度 | 名称 | 示例(n=100万时) |
|---|---|---|
| O(1) | 常数 | 1 次操作 |
| O(log n) | 对数 | ~20 次 |
| O(n) | 线性 | ~100万次 |
| O(n log n) | 线性对数 | ~2000万次 |
| O(n²) | 平方 | ~1万亿次 ⚠️ 超时 |
| O(2ⁿ) | 指数 | 💀 爆炸 |
# 输出: 42
for(int i=0; i
vector<int> a,实现以下操作并分析各自的时间复杂度:#include<iostream>
#include<vector>
using namespace std;
// ① 找最大值:遍历一遍 → O(n)
int findMax(vector<int>& a) {
int mx = a[0]; // 初始化为第一个元素
for(int i = 1; i < a.size(); i++) // 从第2个开始比较
if(a[i] > mx) mx = a[i]; // 更新最大值
return mx; // 总共n-1次比较 → O(n)
}
// ② 二分查找:每次折半 → O(log n)
bool binarySearch(vector<int>& a, int target) {
int lo = 0, hi = a.size()-1; // 搜索区间 [lo, hi]
while(lo <= hi) { // 区间不为空就继续
int mid = lo + (hi-lo)/2; // 防溢出写法
if(a[mid] == target) return true;
else if(a[mid] < target) lo = mid+1; // 右半边
else hi = mid-1; // 左半边
}
return false; // O(log n)
}
// ③ 合并两个有序数组:每步选一个 → O(n)
vector<int> merge(vector<int>& a, vector<int>& b) {
vector<int> res;
int i=0, j=0; // 双指针
while(i < a.size() && j < b.size()) {
if(a[i] <= b[j]) res.push_back(a[i++]); // 小的先入
else res.push_back(b[j++]);
}
while(i < a.size()) res.push_back(a[i++]); // 剩余直接追加
while(j < b.size()) res.push_back(b[j++]);
return res; // 总共最多n步 → O(n)
}
int main() {
vector<int> a = {1,3,5,7,9};
cout << "最大值: " << findMax(a) << endl;
cout << "查找5: " << (binarySearch(a,5)?"找到":"没找到") << endl;
vector<int> b = {2,4,6,8};
vector<int> c = merge(a,b);
for(int x:c) cout << x << " ";
cout << endl;
return 0;
}
for j=i),实际是 n(n-1)/2,仍然是 O(n²)——因为忽略常数和低阶项。f(n)=f(n-1)+f(n-2) 是 O(2ⁿ),因为每层展开2个分支。push_back 是均摊 O(1),但 insert 在中间插入是 O(n)(要移动元素)。sort() 是 O(n log n),别记成 O(n²)。但手写冒泡是 O(n²)。