algorithm - 对子数组求和将如何影响嵌套 for 循环中的时间复杂度?

标签 algorithm time-complexity computer-science

试图计算一些简单代码的时间复杂度,但我不知道如何在对子数组求和时计算时间复杂度。代码如下:

for i=1 to n {
   for j = i+1 to n {
       s = sum(A[i...j])
       B[i,j]=s
}}

所以我知道嵌套的 for 循环不可避免地给我们一个 O(n^2),我相信求和到子数组的函数也是 O(n^2)。但是,我认为整个算法的时间复杂度是 O(n^3)。我如何获得这些信息?谢谢!

最佳答案

我喜欢将 for 循环视为求和。因此,步数(写成一个函数,T(n))是:

T(n) = \sum_{i=1}^n numStepsInInnerForLoop

在这里,我使用了一些用伪 MathJax 编写的东西,并将外部 for 循环编写为从 i=1n 的总和内部 for 循环中的步骤(从 i+1n 的步骤)。您可以将其类比地认为是将内部 for 循环中的步骤数相加,从 i=1n。替换为 numStepsInInnerForLoop 结果:

T(n) = \sum_{i=1}^n [\sum_{j=i+1}^n numStepsOfSumFunction]

这个函数现在表示两个 for 循环都被充实为总和的步骤数。假设 s = sum(A[i...j]) 需要 j-i+1 步并且 B[i,j]=s 只需一步,我们可以将 numStepsOfSumFunction 替换为这些更有用的参数,现在等式变为:

T(n) = \sum_{i=1}^n [\sum_{j=i+1}^n (j-i+1 + 1)]

当您解决这些求和时(使用您在 this summation tutorial page 上看到的那种公式),您将获得 T(n) 的三次函数,它对应于 O(n^ 3)

关于algorithm - 对子数组求和将如何影响嵌套 for 循环中的时间复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54559334/

相关文章:

java - 数字谜题解决方案的数字平方和可以进一步优化吗?

algorithm - 从给定范围中找到数字的最高最小差

java - 在 Java 中验证给定上下文无关语法的字符串

database - 将图形数据结构映射到关系数据库是否有意义?

algorithm - 找出一个号码属于哪个组?

python - 在 Python 中优化 itertools 排列

algorithm - Big-O 和 Little-O 符号之间的区别

math - 什么是 "entropy and information gain"?

java - 卡在一个带有随机数据轴的简单快速排序实现中

algorithm - 从具有 2 个节点的二叉搜索树中删除一个节点,是否可以使用不同的方法?