对于小输入尺寸,常数是否在时间复杂度方面很重要?怎么样?

时间:2017-11-12 14:20:03

标签: algorithm time-complexity big-o complexity-theory

我正在做一些关于时间复杂性的讲座&在这个链接上https://www.youtube.com/watch?v=__vX2sjlpXU作者在4:50解释说,当常量较小时常量在很多情况下都很重要。请解释

3 个答案:

答案 0 :(得分:3)

假设有两种算法的实际复杂度为100n且2n 2 ,因此它们是O(n)和O(n 2 )。对于n = 2,它们将分别执行200和8个CPU周期。但是对于n大于50的值,100n算法总是比2n 2 算法表现更好。

通过这种方式,我们可以看到,对于较小的输入,Big O可能不是算法的良好判断,常量起着重要的作用,特别是当它们与输入相比非常大时。

同样,在处理100 + n和2 + n 2 类似情况的时间复杂度时,您可以理解结果。对于不足以超过常量影响的n值,实际执行时间可能最终由常量而不是输入值n控制。

答案 1 :(得分:0)

对于时间复杂度的数学术语,无关紧要

然而,如果你有很大的常量,你的程序即使具有很好的复杂性,也可能比复杂性差的程序慢。这有点显而易见,想象为1 hour做一个睡眠,你的程序需要很长,一个很大的常数。但是它的复杂性类可能很好,因为常数并不重要。

为什么他们不重要?因为对于每个复杂性较差的程序,会有一个输入(大输入),在某些时候它们会变慢。

以下是一个例子:

复杂度很高O(1),无论如何都很慢:

void method() {
    sleep(60 * 60 * 1_000); // 1 hour
}

更复杂的O(n),对于小输入更快:

void method(int n) {
    for (int i = 0; i < n; i++) {
        sleep(1_000); // 1 second
    }
}

但是如果输入n > 60 * 60,第二种方法会变慢。

您不应该将时间复杂度与实际可衡量的运行时间相混淆,而是巨大差异

时间复杂度约为渐近边界,请参阅f in O(g)的定义:

enter image description here

答案 2 :(得分:0)

好吧,当我研究算法及其复杂性时,我们的教授简要解释了常量非常重要。在复杂性理论中,有两个主要的符号来解释复杂性。第一个是BigO,第二个是Tild符号。

假设您实现了一个优先级队列(使用堆),其中2lgN比较删除最大元素,1 + logN插入每个项目。现在人们实际上删除2logN并将其写为O(logN),但这不正确,因为1+logN仅需要插入元素,当您删除元素时你需要重新平衡队列(接收和游泳)功能。

如果您将~2logN写为O(logN),那么这意味着您只计算一个函数的复杂性,游泳或下沉。

作为参考,我将在一些顶级大学中添加,大多数教授使用~符号。

BigO可能有害。由Robert sedgewick and Kevin Wayne撰写的一本书使用~,并解释了为什么他更喜欢这样做。