【问题标题】:How exactly does time complexity affect time execution时间复杂度究竟如何影响时间执行
【发布时间】: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


【解决方案1】:

您必须意识到,永远不可能真正观察到渐近复杂性。

对于小的 N(比如低于 1000),低阶项是不可忽略的,测量没有意义,即使在理论上也是如此。

对于较大的 N(介于 1000 和 10 亿之间),缓存和虚拟内存效应等因素起着重要作用,并使“恒定访问时间”假设无效。

对于非常大的N(超过十亿),机器容量已经耗尽。

【讨论】:

    【解决方案2】:

    一般来说,时间复杂度并没有说明特定输入的执行时间以及它们之间的关系。

    对于您给出的示例,有以下 cmets:

    • 转换为字符串和连接字符串(如i + " " + j + " " + k)将需要更长的时间,具体取决于生成的单个数字的数量。理论上,这样一种评估的时间复杂度为 O(log(ijk))

    • System.out.println 是一个复杂的野兽,取决于几个外部因素。你真的应该从你想要进行基准测试的代码中排除任何打印。

    • 如果去掉打印、类型转换和字符串连接,那么时间复杂度确实是O(n³),但是执行时间会包含低阶因素:比如j的声明发生了O(n)次k 的声明发生 O(n²) 次。鉴于不相关的整体时间复杂度,但就执行时间而言,它会有所不同。

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2012-08-14
      • 1970-01-01
      • 2012-08-08
      • 2018-06-16
      相关资源
      最近更新 更多