我的一位同事问了我一个问题:o(1)
(little o notation)集是否为空?
我的问题是:o(1)
是空集吗?如果没有,是否有一个时间复杂度o(1)
的程序?
提醒,Cormen定义了小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))
中,但这个界限不紧张。
答案 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>0
,T(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)。