线性和常数分析之间的混淆

时间:2018-11-01 11:12:28

标签: big-o complexity-theory analysis

假设我们有一个唯一的ASCII字符的字符串,这意味着它的长度将永远不会超过128个字符。

如果由于某种原因要扫描此字符串,此扫描是否算作O(n)或O(1)?

2 个答案:

答案 0 :(得分:2)

答案

当以n表示算法的时间或空间复杂度时,您需要定义n是什么。

n个字符的数组进行线性扫描的时间复杂度为O(n)。由于您将相同的算法应用于<= 128个字符的数组,因此可以肯定地说您正在对数组应用O(n)算法。

但是,如果您将算法定义为“扫描最多128个字符的字符数组”,则您的算法的时间复杂度确实为O(1),因为其运算数量上限是一个常数

因此回答您的问题:这是一个透视问题。您如何定义算法?

  • “对长度为n的数组的广义扫描”?然后是O(n),其中您的特定应用程序中的n恰好永远不会超过128(对您有好处)。
  • “扫描128个字符或更少的字符”?然后是O(1),因为它的时间是一个常量的上限。

进一步哲学化

现在,即使您要扩展数组的长度以填满所有RAM,无论它有多大,它仍然是一个有限的整数,因此,从数学上讲,您可以断言它将在{中运行{1次。 但是!定义一种算法来扫描适合您RAM的数组有多重要?我们只是严重降低了算法的实用性,因为如果说我的RAM比您多,那么您的算法将无法满足我的需求。

这就是为什么我们使用参数O(1)来表示某些指标(此处为数组的长度)的原因。这允许我们定义一种扫描算法,该算法适用于ANY(!)大小的输入。如您所知,此算法充其量是n,听起来可能不像O(n)那样好,但是现在它是一种通用算法,可用于任何输入大小,而不是我们输入的大小。将输入限制作为算法本身的一部分。

答案 1 :(得分:0)

一方面是O(n),因为程序的复杂性取决于某个变量n,该变量n可以在[0,128]范围内更改宽度。

另一方面,如果程序总是进行相同数量的操作,则将具有O(1)。情况并非如此,因为如果长度更大,将需要更多的工作。

尽管考虑到最坏的情况是O(128)从而使其变为O(1)