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


我的一位同事问我一个问题:是不是 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)),但这个约束并不紧张。


9012
2018-05-05 11:30


起源

downvoter请评论为什么你认为这个问题“没有显示任何研究成果;不清楚或没有用”?我相信它对于深入理解little-o(和其他符号)是非常有用的。我已经付出了很多努力来回答我的同事问题,我相信社区也可以从中受益。 - amit
我认为这是一个非常有趣的问题和答案。来自我的+1。 - IVlad
“小o”和Omega一样吗? - Pacane
@Pacane没有。请参阅此处和维基百科链接中的定义。这不是大欧米茄 - amit


答案:


这套 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>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)嗯,对于普通情况,图像可以是非自然数,但我们假设这里最坏的情况复杂,尽管声称仍然可以保持平均情况,因为没有空程序。


8
2018-05-05 11:30



您是否将空程序视为程序是一个定义问题。我不确定你的观点是关于f(x)= 1 / x是从R到R的函数。在我看来它并不是因为它没有定义为0.我不理解关于截断泰勒级数的部分' ......总的来说,这会改变复杂性。 - Paul Hankin
@匿名泰勒系列只是一个评论,它显示了非实数的常见用法。我经常看到系列的“尾巴”(一个x ^ n + an + 1 x ^ n + 1 + ...)简称为 O(x^n),特别是在处理x0 = 0时,为了表明当它在那里并且不是0时,它足够小,可以忽略足够接近的x到x0的值。 - amit
@Anonymous我通过扩展定义来解决1 / x未在0定义的问题 f:R->RU{U}因为我确实在文献中看到了很多这种特定功能的出现(在这个答案中提到了其中一个),我相信这个扩展是有效的。 - amit
我认为这个答案包含了太多的切向(并且有些可疑的)细节,或许还有一些模糊的定义,这些定义构成了问题的基础。我更加简洁地回答了问题。 - Paul Hankin


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


1
2018-05-05 12:27



我喜欢你关于“没有图灵机可以具有o(1)的复杂性”的说法,但是当你将o(1)称为算法集时,我无法提出答案,而它是一组 功能。你的答案对我的答案的第二部分来说可能是一个非常好的答案,但是失败并误导读者关于它的第一部分,因为o(1)不是一组算法。 - amit
你是对的,我没有注意到功能和算法之间没有区别。我在这个推理中也存在相同的差距。 - Luka Rahne


函数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)。


1
2018-05-06 08:37