我的电脑CPU是2.7GHZ,即27亿HZ,f = 1 / T, 代表计算机1s可以进行27亿次操作。但这27亿包括一条指令需要不止一次操作 + 计算机内存管理往往使用缓存技术,由于运行局部性,导致频繁访问相同地址的时间比访问不同地址要快一些 + 不同进程抢占资源。
lc上通常超时时间是1s,实际用到leetcode上代码运行的操作是:1s大概5亿次;即当程序时间复杂度是O(n)时,程序运行所需的实际操作次数超过5亿次就会超时,同理,O(n^2)不超时的操作次数是根号下5亿次;
//测试代码
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace chrono;
// O(n)
void function1(long long n) {
long long k = 0;
for (long long i = 0; i < n; i++) {
k++;
}
}
// O(n^2)
void function2(long long n) {
long long k = 0;
for (long long i = 0; i < n; i++) {
for (long j = 0; j < n; j++) {
k++;
}
}
}
// O(nlogn)
void function3(long long n) {
long long k = 0;
for (long long i = 0; i < n; i++) {
for (long long j = 1; j < n; j = j * 2) { // 注意这里j=1
k++;
}
}
}
int main() {
long long n; // 数据规模
while (1) {
cout << "输入n:";
cin >> n;
milliseconds start_time = duration_cast<milliseconds >(
system_clock::now().time_since_epoch()
);
function1(n);
// function2(n);
// function3(n);
milliseconds end_time = duration_cast<milliseconds >(
system_clock::now().time_since_epoch()
);
cout << "耗时:" << milliseconds(end_time).count() - milliseconds(start_time).count()
<<" ms"<< endl;
}
}