扫描有界长度字符串的复杂性。 O(n)或O(1)?

问题描述 投票:2回答:2

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

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

其中n是字符串的实际长度。

big-o complexity-theory analysis
2个回答
2
投票

答案

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

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

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

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

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

进一步哲学化

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.