2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )

1.从KMP算法体现出的思想

一句话总结:不要去做重复的事情。(或不去做已经做过的事情

见下图

较长的字符串为文本串,较短的字符串为模式串。

《2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )》

黄色的区域表示对应字符匹配,灰色区域表示出现对应字符不匹配的情况。

因为已经匹配了一段距离,因此我们就有了文本串已匹配过区域的信息,

那为什么还要像暴力方法一样从新开始一个位置一个位置的匹配呢?

2. 快排平均时间复杂度为什么是O(nlgn)

这个证明在《Introduction to Algorithms》讲快排的那一章给出了。

其中有这样一句话:

“对于快排的时间分析,关键要理解:划分的平衡性是怎样在递归中体现出来的。”

接下来书上证明只要按常数比例划分,快排的时间复杂度都是O(nlgn)。

无论是按 1:1,1:9,1:99,1:999 划分,快排的时间复杂度都是O(nlgn)。

下面以按 1:9 的比例划分为例,说明为什么只要按常数比例划分,快排的时间复杂度都是O(nlgn)。

《2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )》

上图是按 1:9 比例划分时,一次完整的快排产生的递归树。树的最大高度  h = log( 10/9 n )。

下面证明 log( 10/9 n ) = O( log2n )。


log( 10/9 n ) = log2n / log2(10/9)

因为 1 / log2(10/9) 是常数

所以 log( 10/9 n ) = O( log2n )

其实用到了高中学的对数的性质

现在已经证明了树高 h = O( lgn ),每层代价 O(n),所以快排的时间复杂度 O(nlgn)

引申,思考 : 那什么情况下的划分达到快排的最坏的时间复杂度O(n^2)呢? 

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/nvfumayx/article/details/6979197
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞