假设我们有一个唯一ASCII字符的字符串,这意味着它的长度将永远不会超过128个字符。
如果出于某种原因要扫描此字符串,此扫描是否算作O(n)或O(1)?
其中n是字符串的实际长度。
[以n
表示算法的时间或空间复杂度时,您需要定义n
是什么。
众所周知,n
个字符数组的线性扫描的时间复杂度为O(n)
。由于您正在对<= 128个字符的数组应用相同的算法,因此可以肯定地说您正在对数组应用O(n)
算法。
但是,如果将算法定义为“扫描最多128个字符的字符数组”,则您的算法实际上将具有O(1)
的时间复杂度,因为其运算数量上限是一个常数。
因此回答您的问题:这是一个透视问题。您如何定义算法?
n
的数组的广义扫描”?然后是O(n)
,在您的特定应用程序中,n
恰好永远不会超过128(对您有好处)。O(1)
,因为它的时间是一个常量的上限。现在,即使您要扩展数组的长度以填满所有RAM,无论它有多大,它仍然是一个有限整数,因此,从数学上讲,您将声称它将在[C0中运行] 时间。 但是!定义一种算法来扫描适合您RAM的数组有多重要?我们只是严重降低了算法的实用性,因为例如,如果我的RAM比您多,那么您的算法将无法满足我的需求。
这就是为什么我们使用参数O(1)
来表示某些度量(此处为数组的长度)的原因。这允许我们定义了一种扫描算法,该算法适用于ANY(!)大小的输入。如您所知,此算法充其量是n
,听起来可能不及O(n)
,但现在它已成为一种通用算法,可用于任何输入大小,而不是我们包含输入限制的大小作为算法本身的一部分。
一方面是O(n),因为程序的复杂度取决于某个变量n,它可以在[0,128]的范围内改变宽度。
另一方面,如果程序总是执行相同数量的操作,则将具有O(1)。情况并非如此,因为如果长度更大,则需要更多的工作。
尽管考虑到最坏的情况是O(128)从而使其成为O(1)