c - 这个小代码的时间复杂度是多少?
问题描述
这个小代码的时间复杂度是多少?
int count = 0;
for (int i = n; i > 0; i = i/2) {
for (int j = 0; j < i; j++) {
count++;
}
}
我想知道这段代码的时间复杂度。对我来说,我计算为 O(n log n) 因为外循环运行logn
时间和内循环运行O(n)
时间。但我很困惑,因为内循环 j 取决于 i。那么实际的时间复杂度是多少,为什么?
解决方案
确切的总和是
n + n/2 + n/4 + ... + 1
这是
n * (1 + 1/2 + 1/4 + ... + 1/n)
众所周知,1/2 的非负幂的总和在极限内接近 2,因此总和接近2*n
。结果,复杂度为O(n)
; i
下降得足够快,以避免线性增长。
推荐阅读
- css - 如何在反应中使用css模块模式覆盖外部模块类
- iis - azure web 服务:webconfig 子域文件重写
- graphdb - 询问关于 Graphdb 的推理
- c++ - 在 macOS 中使用 linux getopt
- node.js - socket.io/ 用 firefox 表示“跨域请求被阻止”,在 chrome 中表示“ERR_CONNECTION_REFUSED”
- sas - 如何从 sas 中的混合变量列表(num+char)中仅提取字符值
- java - 如何在导航抽屉中维护片段的回栈?
- kubernetes - 公开应用程序时出现 Kubernetes 入口控制器错误
- java - Play Framework 2.8.x MySQL 连接问题
- javascript - 响应式导航栏菜单(汉堡菜单)无法通过单击打开