7.2串匹配中的输入增强技术
模式匹配算法,数据结构中已经很详细的介绍过此算法,在此就不在讨论(有疑问的可以留言);在这里我们学习一种新的算法:
7.2.1Horspool算法
这个算法相对简单直观多了,移动过程如上图所示,就是直接往后移动模式,移动时分两种情况:
1)模式最后一个元素对应原串的元素存在于模式当中:如上模式长度为6,原串第6个为A,A对应模式中的A距离为4,于是右移模式距离4;此时模式最后一个元素R对应原串为E,原串的E对应模式的E距离为1,于是右移模式距离为1;
2)模式最后一个元素对应原串的元素不存在于模式当中,如上的 _ ,此时直接右移模式距离为其长度6;
3)还有一种小的情况,如上第4步,模式最后对应的原串为B,而模式中有2个B,则此时以后面最接近于原串的B为距离标准,即为2;
此处的Table[]即为模式向后移动的距离长度;
7.2.2 Boyer-Moore算法
对于数据结构中学习的KMP算法,当时学的时候感觉对于普通的字符串匹配算法优化已经非常绝妙了;
但是我们日常用的搜索(Ctrl+F)等,竟然还有更优的算法,就是现在我们将要学习研究的Boyer-Moore算法:
与KMP第一个不同的是,此算法是从模式的尾部开始向前匹配(即从右向左,同上Horspool算法);
其实此算法精髓部分分为两步:
第一步的思想即同Horspool,坏字符规则:后移位数d1 = 坏字符的位置 - 模式中相同且最近字符位置;
第二步:好后缀规则d2 = 好后缀的位置 - 模式中相同且最近字符位置;
(坏字符即从右向左匹配时第一个不匹配的字符;好后缀,指的是后面匹配的字符,以匹配串最后一个字符的位置为准向前查找相同字符位置(同Horspool),得到距离d2)
最终后移的距离 d = max (d1 , d2);
具体详细实例可参见:http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
7.3/4:介绍了一些基本的散列以及B树的概念,基本没有数据结构中介绍的更加仔细详尽,再次不再赘述;
第八章 动态规划
如果问题是由交叠的子问题构成的,我们就可以使用动态规划用于解决;其建议,与其对交叠的子问题一次又一次的求解,
还不如对每个较小的子问题只求解一次并结果记录在表中,这样就可以从表中得出原始问题的解。
8.1计算二项式系数 C(n,k)
8.2 Warshall算法和Floyd算法
8.2.1 Warshall算法(用于计算有向图传递闭包)
如上可以用深度或广度优先遍历获得其传递闭包,但求解过程中必须对有向图遍历多次效率不高;而Warshall算法通过一系列n阶布尔矩阵来构造一个给定的n个顶点有向图的传递闭包,由R(k-1)推出R(k),(R(0)表示图的邻接矩阵本身,R(1)表示添加一个中间节点之后路径节点之间的可达性,对于n的个点的图则R(n)即表示考虑到所有节点的可达性之后所得到的图的传递闭包);
核心算法思想:
1)如果R(k-1)的R(i,j)=1(即第i行j列),则R(k)的R(i,j)=1;(因为R(k-1)的第i行j列为1,即表示只考虑k-1个节点时,有i到j节点的路径,若再多考虑一个节点即R(k)则此时路径肯定存在,所以一定为1)
2)相反若R(k-1)的R(i,j)=0(即第i行j列),则只有R(k-1)的R(i,k)=1且R(k,j)=1时,此时才有R(k)的R(i,j)=1(当R(k-1)时的R(i,k)=1表示考虑k-1个节点时,有从i到k的路径,R(k,j)=1时表示有从k到j的路径,所以当再多考虑一个节点k时,R(k)既有R(i,j)=1)
8.2.2 Floyd算法(计算任两点间最短路径长度)
可以说这个算法的思想完全基于以上算法的思想,在直接可达性求得最短路径的情况下,
再多考虑一个节点求的此时的最短路径,取得两个值的较小值即为最终的最短路径;
W即为直接权重矩阵不包含任何间接节点时的;
8.3最优二叉查找树
还有待理解深化,后续掌握再添加!