假设我们有一个唯一的ASCII字符的字符串,这意味着它的长度将永远不会超过128个字符。
如果由于某种原因要扫描此字符串,此扫描是否算作O(n)或O(1)?
答案 0 :(得分:2)
当以n
表示算法的时间或空间复杂度时,您需要定义n
是什么。
对n
个字符的数组进行线性扫描的时间复杂度为O(n)
。由于您将相同的算法应用于<= 128个字符的数组,因此可以肯定地说您正在对数组应用O(n)
算法。
但是,如果您将算法定义为“扫描最多128个字符的字符数组”,则您的算法的时间复杂度确实为O(1)
,因为其运算数量上限是一个常数
因此回答您的问题:这是一个透视问题。您如何定义算法?
n
的数组的广义扫描”?然后是O(n)
,其中您的特定应用程序中的n
恰好永远不会超过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)