【问题标题】:Example about Constant time algorithm?关于恒定时间算法的示例?
【发布时间】:2014-03-18 04:20:53
【问题描述】:

我已经阅读了一些恒定时间算法的含义

恒定时间:O(1)

如果无论输入大小如何,算法都需要相同的时间,则称该算法以恒定时间运行。例子:

数组:访问任何元素

固定大小的堆栈:push 和 pop 方法

固定大小的队列:入队和出队方法

但我还是不太清楚上面的例子。

谢谢。

【问题讨论】:

  • 您能否更具体地说明不清楚的地方?
  • 搞清楚什么?固定时间 - 无论实际执行多少/很少的工作,总是花费相同的时间。
  • @MarcB 这实际上没有任何意义。时间与完成的工作成正比(在非并行算法中,就是我们在这里讨论的那种)。
  • 是的,但“时间”不是这个固定值。如果访问数组元素 [0] 需要(比如说)1 秒,那么访问数组元素 [100 亿] 也需要 1 秒。尽管理论上这些元素被大约 99 亿其他元素分开,但两种访问都需要相同的时间。
  • 我只想要一些示例代码或伪代码:)

标签: algorithm


【解决方案1】:

常数时间和O(1)的英文意思其实略有不同。

O(1) 表示以常数为上界,即以常数为界的函数。请注意,每个输入的含义并不相同。

例如考虑方法

uint f(uint n) {
    if (n % 2 == 0) {
        printf("111");
    } else {
        printf("111222333");
    }
}

这将花费不同的时间,具体取决于 n 是否为偶数(加上其他未知因素,如操作系统等)。

我们仍然称它为 O(1),因为理论上它的运行时间是由一个常数限制的:如果以执行的指令数来衡量的话。在谈论复杂性时,这种类型的指标很重要(并且通常在讨论中隐含)。在谈论复杂性之前,您需要有一个基础的计算模型。

通常人们会想到与当前现代计算机密切建模的单位成本word ram 模型。每条指令都有单位成本(包括内存访问),时间复杂度以执行的指令数量来衡量。这是人们谈论复杂性时常用的模型(在教科书/面试问题等中)。

在该模型中,上述示例将采用不超过固定数量的指令,即使某些输入可能会有所不同,但仍会小于该数量,并且为 O(1)。

之所以说它是“恒定的”,是因为我们可以用 NO-OPS 填充,以使每次执行都采用相同数量的指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多