1.从KMP算法体现出的思想
一句话总结:不要去做重复的事情。(或不去做已经做过的事情)
见下图
较长的字符串为文本串,较短的字符串为模式串。
黄色的区域表示对应字符匹配,灰色区域表示出现对应字符不匹配的情况。
因为已经匹配了一段距离,因此我们就有了文本串已匹配过区域的信息,
那为什么还要像暴力方法一样从新开始一个位置一个位置的匹配呢?
2. 快排平均时间复杂度为什么是O(nlgn)
这个证明在《Introduction to Algorithms》讲快排的那一章给出了。
其中有这样一句话:
“对于快排的时间分析,关键要理解:划分的平衡性是怎样在递归中体现出来的。”
接下来书上证明只要按常数比例划分,快排的时间复杂度都是O(nlgn)。
无论是按 1:1,1:9,1:99,1:999 划分,快排的时间复杂度都是O(nlgn)。
下面以按 1:9 的比例划分为例,说明为什么只要按常数比例划分,快排的时间复杂度都是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)呢?