1. 程式人生 > >串的模式匹配(BF演算法,KMP演算法)

串的模式匹配(BF演算法,KMP演算法)

        第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即為1。

詳細解析: 當i=1時,j=0 當i=2時,j=1 當i=3時,看i的前一位即2的值為b,next值為1對應的內容是a,不相等,a的next值為0,所以j=1; 當i=4時,看i的前一位即3的值為a,next值為1對應的內容是a,相等 ,j=3的next值加1,所以j=2;
當i=5時,看i的前一位即4的值為a,next值為2對應的內容是b,不相等,再看2的next值1,對應的內容為a,與4相等,所以j=2的next值加1,所以j=2; 當i=6時,看i的前一位即5的值為b,next值為2對應的內容是b,相等,所以j=5的next值加1,為6 當i=7時,看i的前一位即6的值為c,next值為3對應的內容為a,不相等,3的next值為1對應的內容為a,不相等,所以j=1; 當i=8時,看i的前一位即7的值為a,next值為1對應的內容為a,所以j=7的next值加1,為2 next [ j ]是否完美無缺?  答:未必,例如當      S=‘a b a a a a b’,T=‘a a a a b’時,仍有多餘動作


詳細解析: 求nextval的值,是建立在求next值的基礎上的。 當i=1時,nextval[1]的值為0; 當i=2時,2的值為a,2的next值為1對應的內容為a,相等,所以2的nextval[2]的值,繼承nextval[1]的值為0; 當i=3時,3的值為a,3的next值為2對應的內容為a,相等,所以3的nextval[3]的值,繼承nextval[2]的值為0; 當i=4時,4的值為a,4的next值為3對應的內容為a,相等,所以4的nextval[4]的值,繼承nextval[3]的值為0; 當i=5時,5的值為b,5的next值為4對應的內容為a,不相等,所以5的nextval[5]的值,與其next值相等,為4 下面給出一個長的,加深印象。
             123456789……
             abcaabbabcabaacbacba
next:     01112231234532211211
nextval: 01102130110532210210


KMP演算法的時間複雜度 
        回顧BF的最惡劣情況:S與T之間存在大量的部分匹配,比較總次數為: (n-m+1)*m=O(n*m)         而此時KMP的情況是:由於指標i無須回溯,比較次數僅為n,即使加上計算next[j]時所用的比較次數m,比較總次數也僅為n+m=O(n+m),大大快於BF演算法。  注意:由於BF演算法在一般情況下的時間複雜度也近似於O(n+m),所以至今仍被採用。 KMP演算法的用途:         因為主串指標i不必回溯,所以從外存輸入檔案時可以做到邊讀入邊查詢,“流式”作業!


相關推薦

模式匹配BF演算法KMP演算法

        第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next

的比較與模式匹配BF演算法

串的比較 //標頭.h #include<iostream> #include<string> #include<cstdlib> using namespace std; typedef int Status; #defin

[演算法]兩種字串匹配演算法索引法KMP演算法對比C語言實現

今天做了個一個簡單的字元對比程式,功能是實現從A串刪除包含B最多的字元的操作,比如A=“aaaaabbbbbbabababa” B=“aaccbaab”,應當刪除“aab”的,不是aa,相信知道搜尋引擎的朋友肯定是知道的吧,這種演算法主要用於去除頁面中無效的關鍵字,來減少收錄的計算消耗的一種方法,好了,具體演

模式匹配演算法BF演算法KMP演算法

串的模式匹配演算法 子串的定位操作通常稱為串的 模式匹配,其中T稱為 模式串。 一般的求子串位置的定位函式(Brute Force) 我寫java的程式碼是這樣的 int index(String S,String T,int pos){

【資料結構與演算法模式匹配——從BF演算法KMP演算法附完整原始碼

模式匹配子串的定位操作通常稱為串的模式匹配。模式匹配的應用很常見,比如在文書處理軟體中經常用到的查詢功能。我們用如下函式來表示對字串位置的定位:int index(const string &T

資料結構- 模式匹配演算法KMP演算法

1、KMP演算法求解什麼型別問題? 字串匹配。給你兩個字串,尋找其中一個字串是否包含另一個字串,如果包含,返回包含的起始位置。 2、完整的KMP演算法 #include <bits/stdc++

字串匹配問題BF演算法KMP演算法

問題: 給定兩個字串S和T,在主串S中查詢子串T的過程稱為串匹配,T稱為模式。 BF演算法(樸素模式匹配): BF演算法思想:         就是將目標串S的第一個字元與模式串T的第一個字元進行匹配,若相等,則繼續比較S的第二個字元和T的第二個字元;若不相等,則比較

資料結構例程——模式匹配Brute-Force演算法

問題:模式匹配,設有主串s和子串t,在主串s中找到一個與子串t相等的子串。 解答:(標頭檔案sqstring.h見順序串演算法庫) #include <stdio.h> #inc

簡單講解KMP模式匹配與AC演算法模式匹配KMP

前言 本篇是對於KMP單模式匹配以及AC演算法多模式匹配的簡單講解,KMP演算法與AC演算法是關鍵字檢索中的常見演算法,能夠快速而高效地查找出目標字串中的多個關鍵字的匹配情況,而要檢索的關鍵字通常被稱為模式串,因此模式匹配四個字也就好理解了。網上的很多對於KMP的講解總是結

字串模式匹配BF演算法KMP演算法的java實現

關於BF演算法和KMP演算法的具體解釋,文章【部落格地址】:KMP字串匹配演算法與next陣列中有推薦部落格的具體地址,可以在這些部落格中找到詳細的解釋。 以下只有具體的java程式碼實現: BF演

字串模式匹配簡單模式匹配演算法KMP演算法

一般的字串模式匹配演算法是類似下面的逐次匹配,舉例說明如下 主串s=ababcabcacbab 從串t=abcac 一般匹配方法如下圖所示 程式碼如下 int index(string s,string t) {     int i=0,j=0;     int

匹配問題-BF演算法KMP演算法、BM演算法

BF演算法int BF(char A[], char B[]){ int i = 0, j = 0; while(A[i] != '\0' && B[j] != '\0'){ if(A[i] == B[j]){

字符模式匹配KMP算法中的next數組算法及C++實現

完整 牛客網 names 數據 代碼 str 關於 clu .com 一、問題描述: 對於兩個字符串S、T,找到T在S中第一次出現的起始位置,若T未在S中出現,則返回-1。 二、輸入描述: 兩個字符串S、T。 三、輸出描述: 字符串T在S中第一次出現的起始位置,若未出現,則

模式匹配算法KMP的C語言實現

退回 lib false else 不同 存在 == 根據 status #include "string.h"#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #

KMP-字符模式匹配-python實現

spa 分享 ext ima raw_input [] sel span pre KMP算法可以在O(n+m)的時間數量級上完成模式匹配,其做法在於:沒當一次匹配過程中出現字符比較不等時,不需要回溯指針,而是利用已經得到的“部分匹配”的結果將模式向右“滑動”盡可能遠的一段距

【HDU - 3068】最長迴文Manacher演算法馬拉車演算法求最長迴文子

題幹: 給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩

bzoj1729:[Usaco2005 dec]Cow Patterns 牛的模式匹配kmp+思維

Problem 有一個 nn 個數的數列 AA,其數字範圍為 11~k(k<=25)k(k<=25) 。 還有 mm 個數 BB。 問從數列 nn 數列取出連續 mm 個數,排名與 B

-模式匹配-KMP

子串的定位操作通常稱作串的模式匹配,是各種串處理系統中最重要的操作之一。 演算法有BF蠻力演算法和KMP演算法,KMP演算法的特點是速度快。可以在O(n+m)的時間數量級上完成串的模式匹配操作。 演算法思想: 與蠻力演算法相比,其改進在於,每當一趟匹配過程中出現字元比較

-模式匹配-MP演算法

之前學習了KMP演算法,現在學習一下它的弱化版:MP演算法。 為啥還要學習它呢?因為它是接下來要學習的AC-自動機的基礎。 輸入:主串S,子串T 輸出:主串中子串第一次出現的位置(0-length(S-1))。匹配不到不輸出. 樣例: S:ababcabcacbab

資料結構之模式匹配C語言實現

一、暴力匹配演算法(BF) BF全稱為Brute-Force,最簡單直觀的模式匹配演算法。 1.演算法思想 兩個字串進行匹配時,一個主串和一個模式串,就是按照我們最容易想到的演算法來進行匹配。用兩個變數i,j分別記錄主串和模式串的匹配位置,如果兩者在某個字