java - 内循环依赖外循环的嵌套 for 循环的时间复杂度
问题描述
我有一个嵌套的 for 循环:
for(i = 0; i < n*n; i++)
for(j = 0; j <= i/5; j++)
print("Hello World!");
我如何找到这个循环的时间复杂度。
我在考虑外循环,它从 0 运行到 n^2(不包括),所以它运行 n^2 + 1 次。
对于内部循环,它取决于 i ,这就是我迷路的地方。任何指针?
解决方案
几乎总是你可以插入常识告诉你构成最坏情况的数字。除非所说的最坏情况保证只运行固定次数而不管 N (即所有循环都接近最优,除了最多 5 个循环不是,即使我们循环一千次 - 非常罕见) - 然后只用最坏的情况做数学。
就每个单独的循环而言,这是最坏的情况。这是正确的,除非循环之间存在链接,例如,如果内部循环运行“最坏情况”,则只有当某些外部循环保证运行最佳情况时,反之亦然 - 当存在明确的关系时。
所以,让我们在这里应用它:
- i 从 0 运行到 n*n,这部分很容易。
- j 从 0 到 i (我们可以忽略常数因素,因此这
/5
部分无关紧要,我们可以忘记它)。
j 循环的最坏情况是 i 等于n*n
,这使得 j 从 0 运行到n*n
。所以让我们使用它。
这实际上是正确的答案;这是一个运行n*n
迭代的循环(这是j
循环),并且这个过程重复n*n
多次(i
循环),总复杂度为O(n^4)
(哎呀,随着 n 的增长,它会很快崩溃)。
如果您不确定数学是否可行,请尝试找到线性度。这保证了它。在这种情况下,最好的情况是 wheni
为 0,在这种情况下 j 循环只运行一次,而最坏的情况是 j 循环运行n*n
次数。至关重要的是,j
循环的特征是线性的:只需画出 j 循环在 i 循环的“生命周期”内的性能发生了什么变化,这是一个简单的直线关系。前 5 j 个循环运行一次,第二个 5 j 循环运行两次,一直到运行n*n/5
时间的最后一个 j 循环。
所有 j 循环的“平均值”就是该行的中间:一半n*n/5
。哪个是n*n/10
和常数因素无关紧要,所以仍然是n*n
。因此,为什么会这样,和本来O(n^4)
一样。for (j = 0; j < n*n; j++)
推荐阅读
- python - Keras 中的自定义 LearningRateScheduler
- google-bigquery - 如何在 BigQuery Sql 中使用混合(Metric 和 SUM(Metric))条件?
- google-cloud-platform - 与 VM 创建相关的 GCP 未知活动日志。可能是什么原因造成的?
- linux - 如何在 Linux 上设置 MinGW 以使用 pdcurses?
- flutter - 如何将小圆圈均匀排列成一个大圆圈?
- javascript - 如何让 impress.js 在我的 Flask/Bootstrap 堆栈中工作
- python - pyautogui 中的 write() 和 typewrite() 函数有什么区别?
- linux - Bash 从文件中读取参数
- google-chrome - 如何为 Chrome.exe 设置属性 - 需要替换快捷方式参数
- c++ - 在 MFC 中更改静态文本颜色