algorithm - 什么是以下时间复杂度?
问题描述
如果一个for循环被定义为
for (int i = 2; i < n; i = i*i + i)
“i*2+i”代表什么时间复杂度。big-O 表示法中的时间复杂度是多少?我如何解决这个不断增加的索引的大 O 表示法?例如: i = 2 , 6 , 42 , 1086 , ....(通式“i*2+i”)
解决方案
由于i
具有具体类型 ( int
),它是有界的,复杂性是 perforce O(1)
。
此外,该功能的增长速度如此之快,以至于int
到第六学期就超过了an的容量。
如果认为给定代码是伪代码并且int
s 是无界的,那么可以使用
i[k]² <= i[k+1] = i[k]² + i[k] <= a i[k]²
其中a
是一个待确定的常数。
然后取以 2 为底的对数
2 lg i[k] <= lg(i[k+1]) <= 2 lg(i[k]) + lg(a)
并通过归纳
2^m lg(i[k]) <= lg(i[k+m]) <= 2^m lg(i[k]) + (2^m - 1) lg(a) <= 2^m lg(a.i[k])
再次取对数,
m + lg(lg(i[k])) <= lg(lg(i[k+m])) <= m + lg(lg(a.i[k]))
也写了
lg(lg(i[k+m])) - lg(lg(a.i[k])) <= m <= lg(lg(i[k+m])) - lg(lg(i[k]))
Asm
表示第一次之后的迭代次数k
,因为n = i[k + m]
我们有
lg(lg(n)) - lg(lg(a.i[k])) <= m <= lg(lg(n)) - lg(lg(i[k]))
特别是,有了k=0
,我们可以取a = 3/2
和
lg(lg(n)) - lg(lg(3)) <= m <= lg(lg(n)) - lg(lg(2))
这证明m = Θ(lg(lg(n))
。
推荐阅读
- python - 从具有多个选项卡的网站中提取数据
- python - 如何在 HTML 模板中调用表单的视图
- git - 从特定提交到现在创建拉取请求
- reactjs - 当我单击链接 URL 更改但未查看时反应路由器问题 || 我在应用程序中使用 React 和 Redux
- sql - 选择客户的第一份合同以在 COUNT 中计算他们当时的年龄?
- r - 在日期中格式化 POSIX 场景
- android - 我怎样才能在android中获得这种textview
- ios - 对于正在开发的项目,是否可以在没有 AASA 文件的情况下实现通用链接?
- python - 比较两个字典是否相同并打印不匹配的键和值
- c++ - 宏 INT_MAX 在哪里定义?