【发布时间】:2021-11-05 00:30:45
【问题描述】:
我写了一个简单的代码:
int temp = 10;
long startTime = System.currentTimeMillis();
for (int i = 0; i < temp; i++) {
for (int j = 0; j < temp; j++) {
for (int k = 0; k < temp; k++) {
System.out.println(i + " " + j + " " + k);
}
}
}
long stopTime = System.currentTimeMillis();
System.out.println("Total Time: " + (stopTime - startTime));
此程序的总时间约为 50 毫秒。
但是,当我将温度更改为 100 时,我坚持认为总时间估计约为 500 毫秒(因为我们将温度增加了 10 倍 50*10=500),但另一方面我认为因为这是一个三次函数(时间复杂度为 O(n^3))结果不应该正好是 500,它应该更多,因为随着温度的增加,总时间会根据它的时间复杂度增加。实验结束后,我运行程序,结果是 3234ms(总是在 3000 左右)。
那么,有人可以向我解释一下时间执行如何根据其时间复杂度而变化吗?例如,如果我们有 10 个项目的执行时间为 50 毫秒,而 100 个项目的执行时间为 3000 毫秒,有人可以解释为什么会以更精确的方式发生吗?
【问题讨论】:
-
时间复杂度是执行时间增长的理论界限,因为变量(例如
n)趋于无穷大。执行时间是特定值n所花费的时间,它通常远小于无穷大,因此可能与时间复杂度“预测”的时间没有太大关系。 -
10^3=1000,因此您可以预计估计时间约为 50 000 毫秒,但我怀疑测量 50 毫秒并不准确(对于这么小的工作来说太大了,可能是由于控制台输出系统初始化或其他)
-
如果你运行你的代码做一些热身,去掉
System.out.println(ideone.com/z6IUkk),你可以看到10和100之间的差异确实是1000x:(9.6e -6s 与 1.1e-2s)。 (不过,我不会声称这是一个可靠的微基准测试;但至少您可以大致看到预期的效果)。
标签: java algorithm time time-complexity