o(1)
不为空。f(x)
在o(g(x))
中:
但更重要的是,候选lim_x->infinity { f(x) / g(x)} = 0
对于非零的g(x)
f(x)
的集合是什么?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、Omega和Theta(1976)的解释中使用了O(n^-1)
。f(x)=0
,它再次满足o(1)的条件。[2]
没有时间复杂度函数T(n)
在o(1)
中
虽然小o符号是针对实数定义的,但我们算法的复杂度函数不是。它们是在自然数上定义的[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) 对于平均情况,图像可能是非自然数,但我们将在这里假设最坏情况的复杂度,尽管该声明仍然适用于平均情况,因为不存在空程序。
O(x^n)
,特别是在处理x0=0时,以显示虽然它存在且不为0,但对于足够接近x到x0的值而言,它足够小可以忽略不计。 - amitf:R->RU {U}
的定义,因为我看到很多文献中都出现了这个特定函数(其中之一在此答案中提到),我相信这个扩展是有效的。 - amit函数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)。