摘要:
第7章,动态规划,Dynamic Programming 又是动态规划,上一次想整理动态规划,结果还没有整理完,实际上是没有整理的动力了,整理一道题都好费时间的。 现在又要整理,这次能整理多少了?已经开始写了,那至少有些成果吧。 最长公共子序列问题 书上例题,先简单分析一下,然后看与之类似的一个问题。 给出两个长度为n和m的字符串A=a1a2..an和B=b1b2..bm,确定A和B的最长公共子序列的长度。其中,子序列的定义是形式为ai1,ai2,..aik的字符串,ij满足1<i1<i2<..<ik<n,也就是没有要求子序列是元字符串中连续的字符序列。 为了使用 阅读全文
摘要:
第6章,分治法,divide & conquer 分治,分而治之,先把问题划分为小问题,先解决小问题,然后把小问题的解组合得到的大问题的解。这跟归纳法类似之处在于,都是先解决小问题,再由小问题得到大问题的解。只是归纳法中小问题的解与大问题的解之间是递推关系,分治法多个小问题之间是并列关系。 经典算法有合并排序,快速排序,大整数乘法,矩阵分块乘法,寻找第k小元素,最近点对。下面先看排序算法。 在review1.2里面,已经给除了集中经典的排序算法的实现,并且给出归并排序和快速排序的时间复杂度都是O(nlogn),而这一章给出了一个平均比较次数(不是运行时间的)的测试结果,归并排序的性能比 阅读全文
摘要:
第14章,随机算法,random algorithm。 随机算法,当算法在执行过程中面临一个选择时,随机行选择常比最优选择快,因此随机算法可以在一定程度上降低算法的复杂度。 由于随机过程的存在,对所求解问题的同一个输入,可能得到完全不同的输出。 随机算法一般分为四类,数值随机算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法。 数值概率算法常用于数值问题的求解。这类算法所得到的往往是近似解。而且近似解的精度随计算时间的增加不断提高。在许多情况下,要计算出问题的精确解是不可能或没有必要的,因此用数值概率算法可得到相当满意... 阅读全文
摘要:
复习算法,整理一下这个KMP算法。给定一个长为n的字符串S,和长为m的模式字符串P,判断P是否在S中出现,如果出现给出位移。直接的想法就是,循环,从S的第i位开始,比较S[i,..,i+m-1]与P是否相同,这样的循环要n-m+1次,每次循环的时间复杂度O(m),那么总的时间复杂度就是O(nm)。对字符串的查找有更快的线性时间算法,那就是KMP算法。K就是Knuth。KMP算法的主要思想是,对模式字符串预处理,得到自身匹配的位移信息,然后在与目标字符串匹配的过程中,如果发生不匹配,那么接下来根据自身匹配的位移信息进行移位,例如S=abababca,P=ababca,模式字符串自身匹配位移信息如 阅读全文