該演算法主要利用壞字元規則和好字尾規則進行轉換。所謂壞字元規則,是指不能匹配時的字元在待匹配字串中從右邊數的位置;而好字尾規則則是指子串中從該不匹配位置後面所有字元(都是已匹配字元)再次在字串**現的位置(k),其中s[k,k+1,—,k+len-j-1] = s[j+1, j+1,—,len-1], 並且s[k-1] != [j] || s[k-1] = $, 其中$表示增補的字元,可以與任何字元相等。
#include
#include
#include
using namespace std;
#define size 256
//字符集字元數
void
generatebadchar
(char
*b,int m,
int*badchar)
//(模式串字元b,模式串長度m,模式串的雜湊表)
for(i =
0; i < m;
++i)
}void
generategs
(char
*b,int m,
int*suffix, bool *prefix)
//預處理模式串,填充suffix,prefix
for(i =
0; i < m-1;
++i)
//b[0,i]
if(j ==-1
)//查詢到模式串的頭部了
prefix[k]
= true;
//如果公共字尾子串也是模式串的字首子串}}
intmovebygs
(int j,
int m,
int*suffix, bool *prefix)
//傳入的j是壞字元對應的模式串中的字元下標
return m;
//case3,都沒有匹配的,移動m位(模式串長度)
}int
str_bm
(char
*a,int n,
char
*b,int m)
//a表示主串,長n; b表示模式串,長m
if(j <0)
//匹配成功
//這裡等同於將模式串往後滑動 j-badchar[int(a[i+j])] 位
movelen1 = j - badchar[
int(a[i+j])]
;//按照壞字元規則移動距離
movelen2 =0;
if(j < m-1)
//如果有好字尾的話
i = i +
max(movelen1,movelen2)
;//取大的移動
2.nonecase
5、rk演算法
rk演算法全稱:rabin-karp演算法,是由兩位發明者rabin和karp的名字來命名,它其實就是bf演算法的公升級版。
bf演算法的時間複雜度o(n*m)是因為在極端情況下子串和模式串需要比對每乙個字元,所以可以對bf演算法進行改造一下,引入hash演算法時間複雜度就會立馬降低。
rk演算法思路:
通過hash演算法堆主串中的n-m+1個子串分別求hash值,然後逐個與模式串的hash值比較大小,在不考慮hash衝突的前提下,只要子串的hash值跟模式串的hash值相等,那就說明子串和模式串是匹配的。hash值是乙個數字,數字之間的比較時非常快速的,這樣依賴模式串跟子串的比較不再是乙個個字元的比較,而是粗粒度hash值比較即可,比較效率就大大提高了。
但問題是,子串hash值的計算是乙個低效的過程,這個過程需要遍歷子串中的每個字元。因此整體rk演算法效率並沒有提高,要想真正提高rk演算法的效率,這個問題就必須解決,即想辦法提高計算子串hash值得效率,也就是計算子串hash值得雜湊演算法的設計問題。
如果選擇的素數q>=m, 則rk演算法的期望執行時間為o(n+m), 如果m<#include
#include
#include
#define q 144451
#define d 26
using namespace std;
intrk
(const string &t,
const string &p)
for(
int i=
0;i++i)
return-1
;}詳解原文
串匹配演算法
串匹配問題是解決許多應用 文字編輯器,資料庫檢索,c 模板匹配,模式識別等等 的重要技術。這個問題有兩個輸入,第乙個是文字 text 第二個是模式 pattern 目的是要在文字中尋找模式。通常而言文字要遠大於模式。t now is the time for all goodpeopleto com...
字串匹配演算法(2)BM
2017 02 24 本篇針對bm演算法 字串匹配 進行講解。這個演算法也是看了很久,看到這裡也感覺很力不從心,看來需要我把前面兩篇演算法實踐下了,不然總覺得空空的。概述 1 對於原有的都是從左往右進行匹配的模式進行修改,改為 從右往左 也就是先匹配最後面的字元。從這裡可以引出從右往左的bf演算法,...
KMP串匹配演算法
串的模式匹配是串處理系統中的最重要操作之一,普通匹配演算法的時間複雜度為o m n 然而,kmp演算法的演算法時間複雜度為o m n 其主要改進是 當出現比較不等時,不需回溯指標,而是利用已經得到的部分匹配的結果將模式向後滑動盡可能遠的距離。kmp演算法的本質是基於有限自動機理論,它簡化了有限自動機...