我的一位同事问我一个问题:是不是 o(1)
(小记法空的?
我的问题是:是 o(1)
空集?如果没有,是否有一个程序 o(1)
时间复杂度?
提醒,小o的定义 Cormen:
一个功能
f(n)
据说是在o(g(n))
如果是积极的 不变c>0
,存在一个常数n0 > 0
这样的0 <=f(n) < cg(n)
, 对全部n>= n0
。
直觉,如果 f(n)
在... o(g(n))
如果它在 O(g(n))
,但这个约束并不紧张。
我的一位同事问我一个问题:是不是 o(1)
(小记法空的?
我的问题是:是 o(1)
空集?如果没有,是否有一个程序 o(1)
时间复杂度?
提醒,小o的定义 Cormen:
一个功能
f(n)
据说是在o(g(n))
如果是积极的 不变c>0
,存在一个常数n0 > 0
这样的0 <=f(n) < cg(n)
, 对全部n>= n0
。
直觉,如果 f(n)
在... o(g(n))
如果它在 O(g(n))
,但这个约束并不紧张。
这套 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,欧米茄和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)嗯,对于普通情况,图像可以是非自然数,但我们假设这里最坏的情况复杂,尽管声称仍然可以保持平均情况,因为没有空程序。
从定义来看 little o
为了满足这个条件(是o(1)),必须有在任意短时间内完成的算法。
这与图灵机的定义相矛盾,图灵机需要“将无限带标记为正方形(有限尺寸)”。只有这个解决方案是空的图灵程序执行0指令。
但是,这样的程序无法构建,因为它需要机器,它以终止状态启动,因此不能执行任何其他程序而不是图灵机。
函数f(n)= 0在o(1)中,因此o(1)不为空。因为每个c> 0,f(n)<c * 1。
这是一个观点(或定义)问题,一个程序的时间复杂度是否可以是o(1)。如果您认为某个程序可以在没有基本操作的情况下存在,那么它将具有o(1)中的时间复杂度。如果您认为程序不存在而没有基本操作,那么无论输入是什么,它总是至少需要1个时间单位,并且在little-o的定义中选择c = 0.5可以证明它的时间复杂度是不是o(1)。