首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

时间复杂度,该如何处理

2012-03-17 
时间复杂度O(1),O(n),O(n^2)这三个什么意思啊?谁能用通俗的语言描述一下,最好配代码说明,3Q~~~[解决办法]

时间复杂度
O(1),O(n),O(n^2)这三个什么意思啊?
谁能用通俗的语言描述一下,最好配代码说明,3Q~~~


[解决办法]
楼主学过数学吧?O(1),你可以理解为y=c(c为常数),这样的复杂度是不随x的变化而改变的。
O(n)你就理解成y=x咯,复杂度是随着x的增长成线性增加的。
同理,O(n^2)可以理解成y=x^2,复杂度随着x的增长成二次函数增加。
当n比较大(在具体的项目中一般都比较大),O(1),o(n),o(n^2)三者的复杂度关系是:
O(1)<o(n)<o(n^2)
应该书上有更具体的解释,楼主再参照下书上的吧
[解决办法]
简单来讲,O(1)是指常数时间的复杂度,比如:for(int i = 0; i < 5; i++)这个循环,是常数时间内的复杂度,所以其时间复杂度为O(1)。
O(N)是线性时间的复杂度,比如:for(int i = 0; i < n; i++)这个循环,具体的执行次数和n相关。
O(N^2)是多项式时间的复杂度,比如:
for(int i = 0; i < n; i++) {
for(int j = 0; j < i; j++)

}
这种循环嵌套的执行次数和N^2相关。

这三者的关系是:O(1) < O(N) < O(N^2)

希望对你有所帮助。
[解决办法]
O(1)哈希查找,索引查找
O(n)遍历查找,有序数组可以优化成O(logN)折半查找,也可以优化为O(1)哈希查找
O(n^2)冒泡排序,可以优化为快速排序O(n*logN)分治思想

以上是算法的精髓和基本,掌握这些,才能继续。
[解决办法]

O(1),你可以理解为y=c(c为常数),这样的复杂度是不随x的变化而改变的。
O(n)你就理解成y=x咯,复杂度是随着x的增长成线性增加的。
同理,O(n^2)可以理解成y=x^2,复杂度随着x的增长成二次函数增加。
当n比较大(在具体的项目中一般都比较大),O(1),o(n),o(n^2)三者的复杂度关系是:
O(1)<o(n)<o(n^2)
应该书上有更具体的解释,……

简单的说:
O(1) : 不用循环
O(n) : 一个循环
O(n^2):嵌套循环


[解决办法]
O(1)的算法,就是算法执行完需要的时间与问题规模无关,是一个常数
O(n)的算法,就是算法执行完需要的时间与问题规模成正比
O(n^2)的算法,就是算法执行完需要的时间与问题规模的平方成正比
三者比较,从时间开销上来说,O(1)的算法最好,O(n^2)的算法最差。
拿排序算法举例,如果要排序的数字从n=10增长到n=10000,那么O(1)的算法运行的时间不会随着增加,但O(n)的算法执行的时间就线性增加了,而O(n^2)的算法的执行时间就平方级增加了。
比较下来O(1)算法的执行效率最高,O(n^2)算法的执行效率最差
[解决办法]
Big O notation:算法执行时间的上界。T(n)=O(f(n)),存在常数c,当n足够大时,T(n)<c*f(n)

热点排行