2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )
来源:互联网 发布:标志设计软件手机版 编辑:程序博客网 时间:2024/05/16 05:45
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)呢?
- 2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )
- 快排最优时间复杂度,平均时间复杂度和最差时间复杂度分析
- 快排最优时间复杂度,平均时间复杂度和最差时间复杂度分析
- 冒泡算法的时间复杂度为什么是O*2
- 平均时间复杂度为O(n)的选择算法
- 快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2)
- 为什么基于比较的排序算法,时间复杂度总是大于等于nlgn
- 逆序数 时间复杂度O(nlgn)
- 归并排序(时间复杂度O(nlgn)(最坏))
- 排序的最低时间复杂度为什么是O(nlogn)
- 为什么建堆的时间复杂度是O(n)?
- 关于中位数的时间复杂度为什么是O(n)
- 用哈希算法的思想解决排序和字符串去重问题,时间复杂度为O(N)
- 作业:递归实现插入排序和在o(nlgn)时间复杂度内寻找和为定值的两个元素
- KMP算法的时间复杂度
- 分治算法;随机化划分函数;快速排序;线性时间选择第K小元素;快速排序平均时间复杂度nlgn;
- 寻找 最小的k个数 线性选择算法 平均时间复杂度 O(n)
- 最长单调递减子序列 采用二分搜索算法,时间复杂度O(nlgn)。
- Oracle 在线重定义(将普通堆表转换成分区表)
- FCKeditor问题以及解决
- struts-2.1.7包含DTD学习
- 在Java中将数据库查询结果保存为List<Map>类型的JavaScript数组文件
- MySQL存储过程及java中存储过程的调用
- 2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )
- hbase 架构
- C调用Zlib库解压文件示例
- DTD 语法快速指南
- 两个有序数组找第k小的数
- 说说Android桌面(Launcher应用)背后的故事(一)——揭开她神秘的面纱
- jdk环境变量设置
- Windows+Tomcat安装配置
- 经典c/c++面试笔试题