随笔分类 -  字符串匹配算法

[近似匹配] BPD算法
摘要:BPD算法是对角式位并行算法,我是真没搞懂这个算法的原理是什么。但是根据伪代码我写出来了BPD算法的c++版实现。当容错率在0.1以上的时候,用BPD算法的效率要更高一些。 1 void BPD(char *p, char *t,int k) 2 { 3 int Pstr_len,Tstr_len,j,i,pos,D,x; 4 int B[128],BB[128]; 5 Pstr_len = strlen(p); 6 Tstr_len = strlen(t); 7 8 //Preprocessing 9 for(j=0;j<128;j++)... 阅读全文
posted @ 2012-07-24 22:52 unhealthy 阅读(374) 评论(0) 推荐(0)
[近似匹配] BPR算法
摘要:近似匹配字符串的BPR算法,其实shift-and算法就是BPR算法的一种特例,就是精确匹配版的BPR。 BPR也是用到位并行技术。 原理嘛我还是没有很彻底的搞清楚,但是我把代码给写出来了..... 我的BPR算法C++实现: 1 int BPR(const char *p, char *t, int k) 2 { 3 int Pstr_len,Tstr_len,i,pos; 4 int R[128],B[256],pR,nR; 5 Pstr_len = strlen(p); 6 Tstr_len = strlen(t); 7 8 ... 阅读全文
posted @ 2012-07-24 11:36 unhealthy 阅读(669) 评论(0) 推荐(0)
[基于子串搜索的方法] BNDM算法
摘要:BNDM算法的搜索方法与BDM算法相同,但它使用了位并行来识别子串。 与原始的BDM相比,BNDM更简单,内存用量更少,具有更好的引用局部性,并且易于扩展到更复杂的模式串的情形。 在当前搜索窗口内,设已读入的字符串为u,BNDM算法维护一个集合,记录u在prv中的所有出现位置。同shift—and算法一样,该集合可以用一个位向量D来表示。如果子串pj...pj+|u|-1等于u,那么D的第m-j+1位是1,表示p的位置j是一个活动状态。 当读入一个新的文本字符σ时,要从D更新到D'。D‘的一个活动状态j对应于σu在模式串中的一个起始位置,也就是说: * u出现在模式串的位置j+1,.. 阅读全文
posted @ 2012-07-24 11:27 unhealthy 阅读(612) 评论(0) 推荐(0)
[基于后缀搜索的方法] Horspool 算法
摘要:Horspool算法是首个对BM算法进行简化的算法。Horspool算法对d3进行了一些修改,使其易于计算并能产生更大的跳跃距离。 对于每个搜索窗口,该算法将窗口内文本的最后一个字符和模式串的最后一个字符进行比较。如果相等,则需要一个验证过程。该验证过程在搜索窗口中从后向前对文本和模式串进行比较,直到完全相等或者在某个字符处不匹配。然后,无论匹配与否,都将根据窗口内文本的最后一个字符的下一个出现位置将窗口向右移动。我的Horspool算法c++版实现代码: 1 void Horspool(char *p, char *t) 2 { 3 int Pstr_len,Tstr_len,i,... 阅读全文
posted @ 2012-07-05 00:00 unhealthy 阅读(328) 评论(0) 推荐(0)
[基于前缀搜索的算法] shift-and/shift-or算法
摘要:与KMP算法一样,shift-and 和shift-or算法都是基于前缀搜索的字符串匹配算法。但是该算法的思想比KMP简单很多,它维护一个字符串的集合,集合中的每个字符串既是模式串P的前缀,同时也是已读入文本的后缀。每读入一个新的文本字符,该算法即用位并行的方法更新集合。该集合用一个位掩码D=dm......d1来表示。先说shift-and算法。D的第j位被置为1(称为D的第j位是活动的)当且仅当p1...pj是t1....tj的后缀。当dm是活动时,就表示有一个成功的匹配。当读入下一个字符ti+1时,需要重新计算新的位掩码D’。D’的第j+1位是活动的当且仅当D的第j位是活动的(即p1.. 阅读全文
posted @ 2012-07-04 16:05 unhealthy 阅读(1706) 评论(0) 推荐(0)