您的位置:首页 > 其它

分治法和二分法的时间复杂度简明分析

2017-12-18 22:12 225 查看
原文链接:http://blog.csdn.net/qilei2010/article/details/51345278

本方法从九章算法视频课程中的令狐老师那里学来的,链接一下以表感谢。 

本文需要你了解二分算法和分治算法,文内对二分和分治不作详细介绍。


时间复杂度

二分算法,我们比较熟悉,时间复杂度是 O(logN)。 

分治算法,时间复杂度是多少呢?大致是O(N)。

为什么区别这么大呢?因为二分是分治的一个特殊情况,二分算法是比较一次,直接扔掉不符合要求的那一半。分治不能这么做,它只是做了划分,并没有减小问题规模。

注:因为分治算法是个统称,这里的时间复杂度也只是个初略计算。


简明分析方法

非常简明的时间复杂度分析方法:

二分:通过O(1)的操作,将规模为 n 的问题变成了 n/2 的问题。 

即:T( n ) = T( n / 2 ) + O( 1 ) 

分治:通过O(1)的操作,将规模为 n 的问题变成了2个 n/2 的问题。 

即:T( n ) = 2 T( n / 2 ) + O( 1 ) 

区别:分治的问题规模并没有变

对上面2个式子进行递推:

T( n ) = T( n/2 ) + O( 1 ) 

T( n ) = T( n/4 ) + 2 O( 1 ) 

T( n ) = T( n/8 ) + 3 O( 1 ) 

… 

…[共 logN 次] 

… 

T( n ) = T( 1 ) + logN·O( 1 )

T( n ) = O(logN)

n 和 logN 里的 N 意义一致,大小写仅为了美观

T( n ) = 2 T( n/2 ) + O( 1 ) 

T( n ) = 4 T( n/4 ) + 3 O( 1 ) 

T( n ) = 8 T( n/8 ) + 7 O( 1 ) 

… 

…[共 logN 次] 

… 

T( n ) = n T( 1 ) + (2 logN - 1)·O( 1 )

T( n ) = O(N)

如有错误,望留言指出。


附注

在计算机算法这个话题内,log( N ) 若没有特殊说明,一般均指以
2
为底的对数,即 log2(N)。

大O运算法则:

n * O( 1 ) = O( n ); 

c * O( n ) = O( n ); 【常数系数直接省略】 

O( cm ) + O( cn ) = O( cm ); 【常数相加取最大项】 

O( m ) * O( n ) = O( m * n);

注意理解
T(n)
O(n)
的区别: 
T(n)
表示问题规模为 n 的时间复杂度,是一个未知值的表示符号(代数式); 
O(n)
表示时间复杂度是
O(n)
,表示的就是一个值,不是一个代数式。只不过这个值是计算机算法领域内的一个值,表示成这个样子也是比较奇葩。

原文计算的解释

T( n ) = n T( 1 ) + (2 logN - 1)·O( 1 ) 

因为 

T( 1 ) = O( 1 ) ; // 规模为1的问题的时间复杂度为O( 1 ) 

(2 logN - 1) ·O( 1 ) = O( logN ) 

所以 

T( n ) = O( n ) + O( logN ) 

T( n ) = O(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  知识点总结