一个时间复杂度的问题
2016-10-23 13:10
176 查看
本总结是是个人为防止遗忘而作,不得转载和商用。
题目
对于代码:voidCalcTime() {
inti, j;
for (i = 1; i < n; i *=3) {
for(j = i/3; j < i; j ++) {
MyFunc();
}
}
}
假定函数MyFunc()的时间复杂度为O(1),则上面代码的时间复杂度关于整数n是多少?
O(NlogN)还是O(N)
还是其他?
分析
如果这样考虑:for (i = 1; i < n; i *=3) 行的时间复杂度是 O(n)
for (j = i/3; j < i; j ++) 行的时间复杂度是 O(n)
的话,那这段代码的时间复杂度就是 O(n2)。
但真实情况是这样吗?
先看内层循环:
对于给定的i,j从(i/3)累加到i,循环次数为(2/3)i
再看外层循环:
i从1到n遍历,每次变成当前值的3倍,即1,3,9,27…,通项为3k,(k = 0,1,…3k<N)
所以将内层循环次数按照递增3倍做累加后,得循环总次数:
Time = (2/3)*1 + (2/3)*3 + (2/3)*9 + …+ (2/3)*3k
= (2/3)*(1 + 3 + 9 + … + 3k)
= (2/3)*((1-3k+1)/(1-3)
= 3k - (1/3)
< N
所以时间复杂度是 O(N)。
图示分析
其实用图示更能够清楚的反映这一问题:上图中,当外层循环的i位于紫色位臵时,内层循环执行的是紫色的①;下次循环,当外层循环的i位于红色位臵 3*i时,内层循环执行的是红色的②,依次类推。所以,循环次数的上限为N。从而,时间复杂度为O(N)。
相关文章推荐
- 一个时间复杂度的问题
- 一个时间转换的问题,顺便谈谈搜索技巧
- [原创]一个AIX FTP文件名显示错误带时间的问题
- 时间模糊查询一个很变态的问题!
- 对一个简单递归的 时间复杂度的分析
- 一个关于时间的SQL分组排序问题
- 3月24日 想到了一个字符串匹配的新算法 程序 时间复杂度自己不会算
- 【开放 5月18日 发布】:子数组的最大乘积问题_____问题简单,请思考如何逐步降低时间复杂度,跟帖回复,群内讨论.
- 时间比较问题 举一个简单例子说明:比如一个论坛对当天发表的贴子用new图片标记一下
- 如何计算一个算法的时间复杂度
- J2ME中处理日期相关问题以及收藏一个日期处理类(忽略时间)
- [原创]一个AIX FTP文件名显示错误带时间的问题
- 黑月:常用的一个计算时间复杂度的公式!
- 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法
- 关于JavaScript处理时间跨度差问题的一个小细节
- 一个时间转换的问题,顺便谈谈搜索技巧
- 整明白一个问题需要耗费这么多时间?
- 中时间数据查询需要注意的一个小问题
- 一个线性时间复杂度的质因数分解函数(查找全部的素数、得到全部的质因数分解个数)
- 回溯算法;双船装载问题;限界+约束;子集树;时间复杂度:O(2的n次方);