c - 时间复杂度嵌套循环内循环+外循环
问题描述
谁能解释这个算法的时间复杂度是多少?
for (i = 1; i <= n; i++){
for(j = 1; j <= n; j += i) { // note: not j++
printf("Iteration %d : %d\n", i, j);
}
}
解决方案
printf
内部循环中的in 被准确地 ceil(n) + ceil(n/2) + ceil(n/3) + ... ceil(n/n)
调用次数。为了摆脱ceil
,我们知道ceil(y/n)
是 有界的y/n + 1
,所以我们知道执行次数是>= n + n/2 + n/3 ... n/n
但是是< n + 1 + n/2 + 1 + n/3 + 1 + n/4 + 1... + n/n + 1
。前者可以分解为n(1 + 1/2 + 1/3 + 1/4 ... 1/n)
,后者可以重构为n(1 + 1/2 + 1/3 + 1/4 ... 1/n) + n
。
后一个因素是无穷大的第一个加数是发散的谐波级数。k
已知 Wikipedia 页面中第一个术语的总和是有界的:
这意味着这1 + 1/2 + 1/3 + 1/4 ... 1/n
是Ө(ln n) = Ө(log n)
; printf
我们可以为调用的次数给出严格的界限 ( c(n)
: n log n <= c(n) < n log n + 2n
。由于n log n
增长速度比 快2n
,我们可以只保留前者,并注意到两个界限都属于Ө(n log n)
,因此也c(n)
属于Ө(n log n)
(Ө(F)
意味着函数都是Ω(F)
和O(F)
)。
推荐阅读
- javascript - 如何通过getElementByClassName或querySelector在javascript中设置选择值下拉列表而不使用id
- excel - 连接后在excel中每隔5行偏移一次
- python - ImportError: matplotlib is required for plotting when the default backend "matplotlib" is selected
- authentication - 如何使用 keycloak-saml 适配器将第三方 IdP SAML 属性映射到我的本地应用程序角色
- javascript - 为什么我的 axios 调用似乎永远持续下去?
- sql - SQL 语句:Group BY 无法正常工作
- javascript - 在计算机上随处可用的 Angular 快捷方式
- python - 带有 PySide2 的文件浏览器:获取文件的路径,然后终止 GUI
- python - 如何解决 django 中的无反向匹配错误
- javascript - 如何从 Jmeter 中的 JSON 请求中提取值