Time complexity 我能否将时间复杂度表示为总和(不同长度元素的复杂度)

Time complexity 我能否将时间复杂度表示为总和(不同长度元素的复杂度),time-complexity,complexity-theory,Time Complexity,Complexity Theory,假设我必须迭代字符串数组中的每个字符,其中每个字符串都有不同的长度,因此arr[0].length!=arr[1]。长度等,例如: #prints every char in all the array for str in arr: for c in str: print(c) 这种性质的算法的时间复杂度应该如何表示?数组中元素的每个长度的总和?或者就像O(N*M),将N作为元素数,M作为数组的最大长度,它相应地超出了它的边界?有一种精确的数学理论,称为复杂性理论,它

假设我必须迭代字符串数组中的每个字符,其中每个字符串都有不同的长度,因此
arr[0].length!=arr[1]。长度
等,例如:

#prints every char in all the array
for str in arr:
    for c in str:
        print(c)

这种性质的算法的时间复杂度应该如何表示?数组中元素的每个长度的总和?或者就像
O(N*M)
,将N作为元素数,M作为数组的最大长度,它相应地超出了它的边界?

有一种精确的数学理论,称为复杂性理论,它回答了您的问题以及更多问题。在复杂性理论中,我们有所谓的图灵机,它是一种计算机。然后将图灵机进行计算的时间复杂度定义为自然数上定义的函数f,使得f(n)是机器在长度为n的输入上的最坏情况运行时间。在您的情况下,它只需要将其输入复制到其他地方,这显然具有O(n)时间复杂性(n这里是数组的组合长度)。由于NM大于n,这意味着执行您描述的算法的图灵机的运行时间不会超过某个常数倍NM,但由于数组元素长度的不规则性,它可能会更快停止


如果你对学习复杂性理论感兴趣,我推荐迈克尔·西普(Michael Sipser)的《计算理论导论》(Introduction to the theory of Computing)一书,这本书从头开始解释了这些概念。

有很多方法可以做到这一点。O(NM)的界是保守的上界。您还可以定义一个参数L,指示所有字符串的总长度,并说运行时为Θ(N+L),这本质上是您的求和思想,通过为求和指定一个名称,使求和变得更清晰。这是一个更精确的界限,更清楚地表明了工作在哪里进行。

为了方便起见,我们几乎总是使用后者。虽然图灵机器可以用来严格定义时间复杂度的含义,你是对的,在分析实际程序时,很少会出现TMs,因为它们很难使用。@templatetypedef图灵机是学习复杂性理论的重要组成部分。问一个基本问题表明他们对这个概念的理解是有限的,他们应该学习这个概念的理论方面,以便更深入地理解。然而,我不同意你所说的它们是笨拙的,因为你不需要为了检查它们的复杂性而详细描述它们。在您习惯了它们之后,用“高级”来描述它们变得非常容易,并确保您可以在需要时构建它。