o(1)中是否有任何函数?

时间:2015-05-05 11:30:05

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

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

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

提醒,Cormen定义了小o:

  

如果有任何正面的函数,则f(n)被称为o(g(n))   常量c>0,对于所有n0 > 00 <=f(n) < cg(n)存在常量n>= n0

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

3 个答案:

答案 0 :(得分:9)

o(1)不为空

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

  

lim_x-&gt;无穷大{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-&gt; infinity {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)

其他人,Cormen就是其中之一,将集合定义为f:N&gt; N,其中N = {0,1,...},这也包括f(x)=0,它再次保留了条件为o(1)。 [2]

T(n)

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

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

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

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

  

lim_x-&gt; infinity {T(x)/ 1}&gt; = lim_x-&gt; infinity {1/1} = 1&gt; 0

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

脚注
(1)如果你不确定它,请回忆泰勒系列,在某些时候我们停止添加无限系列,并提到它是O(x^n)。我们隐藏的功能&#34;在这个大O符号中并没有超过自然数。
(2)然而,如果我们将集合N + = {1,2,...}定义为正自然数的集合,并且o(g(n))是正自然函数的子集, o(1)是一个空集,其证明与没有算法具有这种复杂性的证明相同。
(3)嗯,对于普通情况,图像可以是非自然数,但我们假设这里的情况最复杂,尽管声称仍然可以保持平均情况,因为没有空程序

答案 1 :(得分:1)

little o的定义来看,为了满足这个条件(是o(1)),必须有在任意短时间内完成的算法。
这与图灵机的定义相矛盾,图灵机需要“将无限带标记为正方形(有限尺寸)”。只有这个解决方案是空的图灵程序执行0指令 但是,这样的程序无法构建,因为它需要机器,它以终止状态启动,因此不能执行任何其他程序而不是图灵机。

答案 2 :(得分:1)

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

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