成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

字符串匹配的KMP算法

開發 后端 前端 算法
許多算法可以完成這個任務,Knuth-Morris-Pratt算法(簡稱KMP)是最常用的之一。它以三個發明者命名,起頭的那個K就是著名科學家Donald Knuth。

字符串匹配是計算機的基本任務之一。

舉例來說,有一個字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一個字符串"ABCDABD"?

[[72072]]

許多算法可以完成這個任務,Knuth-Morris-Pratt算法(簡稱KMP)是最常用的之一。它以三個***命名,起頭的那個K就是著名科學家Donald Knuth。

[[72073]]

這種算法不太容易理解,網上有很多解釋,但讀起來都很費勁。直到讀到Jake Boxer的文章,我才真正理解這種算法。下面,我用自己的語言,試圖寫一篇比較好懂的KMP算法解釋。

1.

首先,字符串"BBC ABCDAB ABCDABCDABDE"的***個字符與搜索詞"ABCDABD"的***個字符,進行比較。因為B與A不匹配,所以搜索詞后移一位。

2.

因為B與A不匹配,搜索詞再往后移。

3.

就這樣,直到字符串有一個字符,與搜索詞的***個字符相同為止。

4.

接著比較字符串和搜索詞的下一個字符,還是相同。

#p#

5.

直到字符串有一個字符,與搜索詞對應的字符不相同為止。

6.

這時,最自然的反應是,將搜索詞整個后移一位,再從頭逐個比較。這樣做雖然可行,但是效率很差,因為你要把"搜索位置"移到已經比較過的位置,重比一遍。

7.

一個基本事實是,當空格與D不匹配時,你其實知道前面六個字符是"ABCDAB"。KMP算法的想法是,設法利用這個已知信息,不要把"搜索位置"移回已經比較過的位置,繼續把它向后移,這樣就提高了效率。

8.

怎么做到這一點呢?可以針對搜索詞,算出一張《部分匹配表》(Partial Match Table)。這張表是如何產生的,后面再介紹,這里只要會用就可以了。

9.

已知空格與D不匹配時,前面六個字符"ABCDAB"是匹配的。查表可知,***一個匹配字符B對應的"部分匹配值"為2,因此按照下面的公式算出向后移動的位數:

  移動位數 = 已匹配的字符數 - 對應的部分匹配值

因為 6 - 2 等于4,所以將搜索詞向后移動4位。

10.

因為空格與C不匹配,搜索詞還要繼續往后移。這時,已匹配的字符數為2("AB"),對應的"部分匹配值"為0。所以,移動位數 = 2 - 0,結果為 2,于是將搜索詞向后移2位。

11.

因為空格與A不匹配,繼續后移一位。

12.

逐位比較,直到發現C與D不匹配。于是,移動位數 = 6 - 2,繼續將搜索詞向后移動4位。

#p#

13.

逐位比較,直到搜索詞的***一位,發現完全匹配,于是搜索完成。如果還要繼續搜索(即找出全部匹配),移動位數 = 7 - 0,再將搜索詞向后移動7位,這里就不再重復了。

14.

下面介紹《部分匹配表》是如何產生的。

首先,要了解兩個概念:"前綴"和"后綴"。 "前綴"指除了***一個字符以外,一個字符串的全部頭部組合;"后綴"指除了***個字符以外,一個字符串的全部尾部組合。

15.

"部分匹配值"就是"前綴"和"后綴"的最長的共有元素的長度。以"ABCDABD"為例,

  1.   - "A"的前綴和后綴都為空集,共有元素的長度為0;  
  2.  
  3.   - "AB"的前綴為[A],后綴為[B],共有元素的長度為0;  
  4.  
  5.   - "ABC"的前綴為[A, AB],后綴為[BC, C],共有元素的長度0;  
  6.  
  7.   - "ABCD"的前綴為[A, AB, ABC],后綴為[BCD, CD, D],共有元素的長度為0;  
  8.  
  9.   - "ABCDA"的前綴為[A, AB, ABC, ABCD],后綴為[BCDA, CDA, DA, A],共有元素為"A",長度為1;  
  10.  
  11.   - "ABCDAB"的前綴為[A, AB, ABC, ABCD, ABCDA],后綴為[BCDAB, CDAB, DAB, AB, B],共有元素為"AB",長度為2;  
  12.  
  13.   - "ABCDABD"的前綴為[A, AB, ABC, ABCD, ABCDA, ABCDAB],后綴為[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的長度為0。 

16.

"部分匹配"的實質是,有時候,字符串頭部和尾部會有重復。比如,"ABCDAB"之中有兩個"AB",那么它的"部分匹配值"就是2("AB"的長度)。搜索詞移動的時候,***個"AB"向后移動4位(字符串長度-部分匹配值),就可以來到第二個"AB"的位置。

原文鏈接:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

責任編輯:林師授 來源: 阮一峰的網絡日志
相關推薦

2024-07-03 11:23:14

2023-12-15 10:27:01

暴力匹配算法Python字符串

2023-04-11 08:54:57

字符串匹配算法

2013-05-06 10:49:21

Boyer-Moore算法字符串匹配

2014-10-30 14:19:13

本文由簡單的字符串匹配

2023-02-26 22:33:32

字符串排列算法

2009-08-07 14:46:59

C#匹配字符串

2016-12-30 13:32:24

字符串算法代碼

2021-09-03 09:41:36

字符串時間復雜度

2024-06-26 07:58:06

2016-12-30 13:16:51

字符串算法代碼

2011-03-15 15:20:46

2021-09-10 08:31:54

翻轉字符串單詞

2016-12-30 13:37:50

字符串算法代碼

2010-09-09 11:48:00

SQL函數字符串

2009-08-11 10:26:49

C#算法C#字符串反轉

2010-11-26 13:58:48

MySQL字符串匹配

2009-09-16 17:02:15

正則表達式匹配字符串

2021-03-08 08:23:24

Java字符串截取

2024-04-01 08:41:39

字符串.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 特黄小视频 | 欧美v日韩v| 日韩精品视频一区二区三区 | 国产成人免费视频网站高清观看视频 | 日本aa毛片a级毛片免费观看 | 亚洲一区二区三区免费在线观看 | 国产精品久久久久久久久久免费看 | 成人在线视频网 | 成人国产毛片 | 黑人成人网 | av网站在线播放 | 亚洲高清av | 久久久一区二区三区 | 亚洲精选一区二区 | 中文字幕亚洲欧美日韩在线不卡 | 国产精品亚洲一区 | 国产精品久久久久久久久久三级 | 国产色网站| 国产高清久久久 | 中文字幕亚洲区一区二 | 91影院在线观看 | 国产a视频 | 超碰在线人| 精品一区电影 | 欧美成人猛片aaaaaaa | 午夜久久久久久久久久一区二区 | 国产性生活一级片 | 九九热在线观看视频 | 一级毛片成人免费看a | 91素人 | 一区中文字幕 | 一级毛片播放 | av不卡一区 | 91在线视频免费观看 | 国产精品久久久久一区二区三区 | 亚洲综合网站 | 亚洲久久一区 | 久久91精品久久久久久9鸭 | 成人久草 | 亚洲激情av | 国产精品久久777777 |