成人免费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

本文由簡單的字符串匹配

2009-08-07 14:46:59

C#匹配字符串

2023-02-26 22:33:32

字符串排列算法

2021-09-03 09:41:36

字符串時間復雜度

2016-12-30 13:32:24

字符串算法代碼

2024-06-26 07:58:06

2016-12-30 13:16:51

字符串算法代碼

2021-09-10 08:31:54

翻轉字符串單詞

2011-03-15 15:20:46

2016-12-30 13:37:50

字符串算法代碼

2010-09-09 11:48:00

SQL函數字符串

2009-08-11 10:26:49

C#算法C#字符串反轉

2024-04-01 08:41:39

字符串.NET

2009-09-16 17:02:15

正則表達式匹配字符串

2010-11-26 13:58:48

MySQL字符串匹配

2021-03-08 08:23:24

Java字符串截取
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91视频免费 | 色爱av| 中文字幕一区二区三区不卡 | 成人av激情| 日本免费一区二区三区四区 | 欧美一区二区在线 | 久久精品国产亚洲夜色av网站 | 91亚洲免费 | 天天操天天插 | 99伊人网| 国产欧美一区二区三区久久手机版 | 成人a视频在线观看 | 国产在线观看不卡一区二区三区 | 日本aa毛片a级毛片免费观看 | 精品一区二区在线观看 | 亚洲一区二区三 | 久久另类 | 日韩一级一区 | 美女天天操 | 粉嫩av久久一区二区三区 | 亚洲精品自拍视频 | 精品91久久 | 国产免费福利在线 | 5060网一级毛片 | 欧美日韩综合一区 | 日韩和的一区二区 | www免费视频 | 日韩有码在线观看 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 精品国产一区二区三区日日嗨 | 欧美日韩中文国产一区发布 | 亚洲品质自拍视频网站 | 成人免费视频播放 | 久久婷婷国产麻豆91 | 中文精品一区二区 | 中文成人在线 | 国产欧美一区二区三区免费 | 亚洲最大成人综合 | 在线中文字幕视频 | 日本精品网站 | 热久久性|