【问题标题】:Is there any function that is in o(1)?o(1) 中是否有任何函数?
【发布时间】:2015-05-05 11:30:04
【问题描述】:

我的一个同事问了我一个问题:集合o(1) (little o notation) 是空的吗?

我的问题是:o(1) 是一个空集吗?如果没有,有没有o(1)时间复杂度的程序?

提醒,Cormen 对 little-o 的定义:

函数f(n) 被称为在o(g(n)) 中,如果有任何肯定的话 常量c>0,存在一个常量n0 > 0,使得0 <=f(n) < cg(n),对于所有n>= n0

直观地说,如果f(n)o(g(n)) 中,如果它在O(g(n)) 中,但这个界限并不紧密。

【问题讨论】:

  • “little o”和Omega一样吗?
  • @Pacane 没有。请参阅此处和维基百科链接上的定义。这不是大欧米茄

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


【解决方案1】:

集合o(1)不为空

首先要记住f(x)o(g(x)) 中当且仅当

lim_x->无穷大 ​​{ f(x) / g(x)} = 0
对于非零 g(x)

但是,更重要的是,f(x) 的候选集是什么?

有些人在所有real functions [1] 上定义它,即f:R->RU{U}(其中 U 对于函数的某些值未定义)。这意味着,我们可以使用任何实到实的函数,包括函数f(x)=1/x。 我们还可以看到g(x)=1 是一个非零函数,而且确实:

lim_x->无穷大 ​​{ 1/x / 1} = 0

这意味着,o(1) 包含函数f(x)=1/x,我们可以得出结论该集合不为空。
Knuth 还将函数 g(n) = n^-1 引用为有效函数,并在 his explanation of big O,Omega and Theta (1976) 中使用 O(n^-1)

Others,Cormen 就是其中之一,定义集合为 f:N->N,其中 N={0,1,...},这也包括f(x)=0,它又保持了存在的条件o(1).[2]

o(1)中没有复杂度函数T(n)的算法

虽然在实数上定义了很少的符号,但我们的算法复杂度函数却没有。它们是在自然数 [3] 上定义的。你要么做指令,要么不做。你不能做一半的指令,或者 e-1 指令。这意味着,复杂函数集是f:N->N。由于没有像“empty program”这样没有指令的东西(回想一下,调用它本身的开销需要时间),它甚至将这个范围缩小到f:N->N\{0}

换句话说,对于算法T(n) 的任何复杂度函数,以及对于所有n>0T(n)>0

我们现在可以回到我们的公式:

lim_x->infinity { T(x) / 1} >= lim_x->infinity { 1 / 1} = 1 > 0

这表明o(1) 中没有正自然函数,我们可以得出结论,没有算法具有o(1) 中的复杂度函数。


脚注
(1) 如果你不确定,回想一下泰勒级数,在某些时候我们会停止添加无限级数,只是提到它是O(x^n)。我们在这个大 O 符号中“隐藏”的函数不是自然数。
(2)然而,如果我们将集合 N+={1,2,...} 定义为正自然数的集合,并且将 o(g(n)) 定义为正自然函数的子集,则 o (1) 是一个空集,其证明与没有算法具有这种复杂性的证明相同。
(3) 好吧,对于一般情况,图像可以是非自然数,但我们在这里假设最坏情况的复杂性,尽管对于一般情况,这种说法仍然成立,因为没有空程序。

【讨论】:

  • 是否将空程序视为程序是一个定义问题。我不确定你关于 f(x)=1/x 是从 R 到 R 的函数的观点。在我看来,这不是因为它没有定义为 0。我不明白关于截断泰勒级数的部分...一般来说,这会改变复杂性。
  • @Anonymous 泰勒系列只是一个评论,展示了非实数的常见用法。我经常看到系列的“尾巴”(anx^n + an+1 x^n+1 + ...)被简单地视为O(x^n),尤其是在处理 x0=0 时,以表明当它存在且不为 0 时,它足够小,可以忽略 x 到 x0 的足够接近的值。
  • @Anonymous 我已经通过扩展f:R->RU{U} 的定义解决了 1/x 未定义为 0 的问题,因为我确实在文献中看到了很多这种特定功能的出现(其中之一在这个答案中提到),我相信这个扩展是有效的。
  • 我认为这个答案包含太多有点切题(并且在某些地方可疑)的细节,也许是在处理问题背后的模棱两可的定义。我试图更简洁地回答。
【解决方案2】:

函数 f(n)=0 在 o(1) 中,所以 o(1) 不为空。因为对于每一个 c>0,f(n)

程序的时间复杂度是否为 o(1) 是一个意见(或定义)问题。如果您认为一个程序可以在没有基本操作的情况下存在,那么它的时间复杂度将在 o(1)。如果你认为一个程序没有基本操作就不能存在,那么无论输入如何,它总是至少需要 1 个时间单位,在 little-o 的定义中选择 c=0.5 可以证明它的时间复杂度是不是 o(1)。

【讨论】:

    【解决方案3】:

    little o的定义可知,要满足这个条件(即o(1)),必须有一个算法可以在任意短时间内完成。
    这与图灵机的定义相矛盾,图灵机需要“将无限带标记为正方形(有限大小)”。唯一的解决方案是执行 0 指令的空图灵程序。
    但是,这样的程序不能被构建,因为它需要机器,以终止状态开始,因此不能执行任何其他程序并且不是图灵机。

    【讨论】:

    • 我喜欢您关于“没有图灵机可以具有 o(1) 的复杂性”的说法,但是当您将 o(1) 称为一组算法时,我不能赞成答案,而它是一组函数。您的回答可能是我回答的第二部分的一个很好的回答,但在第一部分失败并误导了读者,因为 o(1) 不是一组算法。
    • 你说得对,我没有注意到函数和算法之间没有区别。我在这个推理中也有同样的差距。
    猜你喜欢
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2016-11-01
    • 2011-08-15
    • 2012-07-05
    • 2020-10-29
    • 2019-04-12
    • 2022-08-17
    相关资源
    最近更新 更多