<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
從今天開始, 小白我將帶大家開啟 Java 資料結構 & 演演算法的新篇章.
KMP (Knuth-Morris-Pratt), 是一種改進的字串匹配演演算法. KMP 演演算法解決了暴力匹配需要高頻回退的問題, KMP 演演算法在匹配上若干字元后, 字串位置不需要回退, 從而大大提高效率. 如圖:
舉個例子 (字串 「abcabcdef」 匹配字串 「abcdef」):
次數 | 暴力匹配 | KMP 演演算法 | 說明 |
---|---|---|---|
1 | a bcabcdef a bcdef |
a bcabcdef a bcdef |
a 和 a 匹配 |
2 | ab cabcdef ab cdef |
ab cabcdef ab cdef |
ab 和 ab 匹配 |
3 | abc abcdef abc def |
abc abcdef abc def |
abc 和 abc 匹配 |
4 | abca bcdef abcd ef |
abca bcdef abcd ef |
abca 和 abcd 不匹配, 回退. 暴力匹配回退到索引 1, 即 「b」, KMP 演演算法索引跳置 3, 即 「a」 |
5 | ab cabcdef a bcdef |
abca bcdef a bcdef |
暴力匹配 b 和 a 不匹配, 後移. KMP 演演算法 a 和 a 匹配 |
6 | abc abcdef a bcdef |
abcab cdef ab cdef |
暴力匹配 c 和 a 不匹配, 後移. KMP 演演算法 ab 和 ab 匹配 |
7 | abca bcdef a bcdef |
abcabc def abc def |
暴力匹配 a 和 a 匹配. KMP 演演算法 abc 和 abc 匹配 |
8 | abcab cdef ab cdef |
abcabcd ef abcd ef |
暴力匹配 ab 和 ab 匹配. KMP 演演算法 abcd 和 abcd 匹配 |
9 | abcabc def abc def |
abcabcde f abcde f |
暴力匹配 abc 和 abc 匹配. KMP 演演算法 abcde 和 abcde 匹配 |
10 | abcabcd ef abcd ef |
abcabcdef abcdef |
暴力匹配 abcd 和 abcd 匹配. KMP 演演算法 abcdef 和 abcdef 匹配 , 匹配完成 |
11 | abcabcde f abcde f |
abcabcdef abcdef |
暴力匹配 abcde 和 abcde 匹配. KMP 演演算法匹配完成 |
12 | abcabcdef abcdef |
abcabcdef abcdef |
暴力匹配 abcd 和 abcd 匹配, 匹配完成. KMP 演演算法匹配完成 |
部分匹配表 (Partial Match Table) 指的是 「字首」 和 「字尾」 的最長共有元素的長度.
舉個例子, 字串 「ABCDABD」 的字首與字尾:
字串 | 字首 | 字尾 | 共同部分 | 值 |
---|---|---|---|---|
A | NaN | NaN | NaN | 0 |
AB | A | B | NaN | 0 |
ABC | A, AB | C, BC | NaN | 0 |
ABCD | A, AB, ABC | D, CD, BCD | NaN | 0 |
ABCDA | A, AB, ABC, ABCD | A, DA, CDA, BCDA | A | 1 |
ABCDAB | A, AB, ABC, ABCD, ABCDA | B, AB, DAB, CDAB, BCDAB | AB | 2 |
ABCDAB | A, AB, ABC, ABCD, ABCDA, ABCDAB | D, BD, ABD, DABD, CDABD, BCDABD | NaN | 0 |
重點:
KMP 演演算法中移動的位數 = 已匹配的字元數 - 對應的部分匹配值
import java.util.Arrays; public class KMPMatch { public static int Match(String str1, String str2, int[] next) { // 初始化索引 int i = 0; int j = 0; for (; i < str1.length(); i++) { if (j > 0 && str1.charAt(i) != str2.charAt(j)) { // 不匹配, 回退 i = i - next[j - 1]; j = 0; } // 匹配 if (str1.charAt(i) == str2.charAt(j)) { j++; } // 返回索引 if (j == str2.length()) { return i - j + 1; } } return -1; } // 部分匹配 public static int[] getNext(String s) { // 定義陣列 int next[] = new int[s.length()]; // 初始化i, j int i = 0; int j = -1; next[0] = -1; // 遍歷 while (i < s.length() - 1) { if (j == -1 || s.charAt(i) == s.charAt(j)) { // 匹配成功 next[i] = j + 1; i++; j++; } else { //一旦不匹配成功j回退到-1 j = -1; } } return next; } public static void main(String[] args) { // 字串1 String str1 = "BBCABCDAB ABCDABD"; // 字串2 String str2 = "ABCDABD"; // 匹配表 int[] next = getNext(str2); System.out.println(Arrays.toString(next)); // KMP演演算法 int result = Match(str1, str2, next); System.out.println(result); } }
輸出結果:
[0, 0, 0, 0, 1, 2, 0]
10
到此這篇關於Java 資料結構與演算法系列精講之KMP演演算法的文章就介紹到這了,更多相關Java KMP 演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45