有关时间复杂度的问题
2016-04-20 14:25
302 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">前一段时间面试大众点评,被面试官问到了有关于嵌套for循环的时间复杂度,回来总结了一下。</span>
在这篇文章中,我们用简单的循环程序进行分析讨论时间复杂度。
1) O(1)
一个函数调用或是一组语句都认为是O(1)的复杂度 (如果没有调用不包含循环,递归或其他非常量复杂度的函数)。
例如函数 swap() 是 O(1)的时间复杂度. 如果循环的次数是一个常量,则也认为是 O(1)
// set of non-recursive and non-loop statements
2) O(n)
如果在一个大小为n循环中,循环变量按照一个常量C递增或递减,这个循环的复杂度就为O(n).
//这里C为常数 for (int i = 1; i <= n; i += c) { //一些 O(1) 的语句 } for (int i = n; i > 0; i -= c) { //一些 O(1) 的语句 }
3) O(nc)
嵌套循环的时间复杂度等于行最内层语句执行的次数。例如,下面的示例循环具有为O(n 2)的时间复杂度
for (int i = 1; i <=n; i += c) { for (int j = 1; j <=n; j += c) { // some O(1) expressions } } for (int i = n; i > 0; i += c) { for (int j = i+1; j <=n; j += c) { // some O(1) expressions }
例如选择排序和插入排序具有为O(n 2)的时间复杂度。
4) O(Log n)
如果在一个大小为n循环中,循环变量按照一个常量C的进行倍数的递增或递减,这个循环的复杂度就为O(Log n).
for (int i = 1; i <=n; i *= c) { // some O(1) expressions } for (int i = n; i > 0; i /= c) { // some O(1) expressions }
5) O(Log Log n)
如果在一个大小为n循环中,循环变量是指数级的递增或递减,这个循环的复杂度就为O(Log log n).
// c为比1大的常量 for (int i = 2; i <=n; i = pow(i, c)) { // some O(1) expressions } //这里的 fun 函数可以是sqrt 或 cuberoot 或任何其他恒定的根 for (int i = n; i > 0; i = fun(i)) { // some O(1) expressions }
如何计算连续循环的复杂性?
当有连续的循环,我们计算时间复杂度为时间各个循环的复杂总和。
for (int i = 1; i <=m; i += c) { // some O(1) expressions } for (int i = 1; i <=n; i += c) { // some O(1) expressions } 上面的时间复杂度 O(m) + O(n) = O(m+n) 如果 m == n 就是 O(2n),也可缩写为 O(n) 常量可以忽略不计
如果循环中有许多if …else [b]如何计算时间复杂度?[/b]
一般情况我们只考虑最快情况下的复杂度。例如考虑线性搜索函数,我们只考虑元素出现在最后或没有该元素。
如何计算时间的递归函数的复杂性?
递归函数一般可以写成一个数学递推关系。为了计算时间复杂度,我们必须知道如何解决递归公式,这个问题将在后面讨论。
参考:http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/
http://www.acmerblog.com/analysis-of-loops-5069.html
相关文章推荐
- SpringMVC:dispatcherServlet对HandlerMapping的初始化
- Codeforces 631D Messenger KMP
- 喇叭发声原理简析
- 漫游Kafka实现篇之消息和日志
- 开发工具汇总
- Android ActivityManagerService根据oom_adj数值内存回收机制
- http需重定向到https时apache的rewrite模块配置和安装
- 谈谈MVC模式 及 MVP 和 MVVM 的图示
- 漫游Kafka实战篇之客户端编程实例
- Activiti 源代码下载
- JSP错误:Unable to compile class for JSP
- (23)Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
- Xcode的调试之GDB
- 病毒木马查杀实战第018篇:病毒特征码查杀之基本原理
- Android开发四大组件之Service(具体解释篇)
- 统计NSString中英文字符串长度
- 漫游Kafka设计篇之主从同步
- lucene学习之创建索引
- MySQL的root密码忘记怎么办 修改root密码的方式
- 漫游Kafka设计篇之Producer和Consumer