集合o(1)
不为空。
首先重要的是要记住,f(x)
当o(g(x))
且仅当
lim_x->infinity { f(x) / g(x)} = 0
对于非零 g(x)
但是,更重要的是,候选人的集合是f(x)
什么?
有些人在所有实函数 [1]上定义它,即f:R->RU{U}
(其中 U 对于函数的某些值未定义)。这意味着,我们可以使用任何实到实的函数,包括函数f(x)=1/x
。我们还可以看到这g(x)=1
是一个非零函数,实际上:
lim_x->infinity { 1/x / 1} = 0
这意味着,o(1)
包括函数f(x)=1/x
,我们可以得出结论该集合不为空。
Knuth 也将该函数g(n) = n^-1
称为有效函数,并O(n^-1)
在他对大 O、Omega 和 Theta 的解释中使用(1976)
其他人,Cormen 就是其中之一,将集合定义为 f:N->N,其中 N={0,1,...},这也包括f(x)=0
,它再次满足为 o(1) 的条件。[2]
没有复杂度函数T(n)
的算法o(1)
虽然在实数上定义了很少的符号,但我们的算法复杂度函数却没有。它们是在自然数[3]上定义的。你要么做指令,要么不做。你不能做一半的指令,或者 e -1指令。这意味着,复杂度函数集是f:N->N
。由于不存在没有指令的“空程序”(回想一下,调用它本身的开销需要时间),它甚至将这个范围缩小到f:N->N\{0}
.
换句话说,对于算法的任何复杂度函数T(n)
,对于所有的n>0
,T(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) 好吧,对于平均情况,图像可以是一个非自然数,但我们在这里假设最坏情况的复杂性,尽管该声明仍然适用于平均情况,因为没有空程序。