首页 > 作文

Java 数据结构与算法系列精讲之KMP算法

更新时间:2023-04-05 01:43:14 阅读: 评论:0

概述

从今天开始, 小白我将带大家开启 java 数据结构 & 算法的新篇章.

kmp 算法

kmp (knuth-morris-pratt), 是一种改进的字符串匹配算法. kmp 算法解决了暴力匹配需要高频回退的问题, kmp 算法在匹配上若干字符后, 字符串位置不需要回退, 从而大大提高效率. 如图:

举个例子 (字符串 “abcabcdef” 匹配字符串 “abcdef”):

次数暴力匹配kmp 算法说明1abc播音与主持艺术abcdef abcdefabcabcdef abcdefa 和 a 匹配2abcabcdef abcdefabcabcdef abcdefab 和 ab 匹配3abcabcdef abcdefabcabcdef abcdefabc 和 abc 匹配4abcabcdef abcdefabcabcdef abcdefabca 和 abcd 不匹配, 回退. 暴力匹配回退到索引 1, 即 “b”, kmp 算法索引跳置 3, 即 “a”5abcabcdef abcdefabcabcdef abcdef暴力匹配 b 和 a 不匹配, 后移. kmp 算法 a 和 a 匹配6abcabcdef abcdefabcabcdef abcdef暴力匹配 c 和 a 不匹配, 后移. kmp 算法 ab 和 ab 匹配7abcabcdef abcdefabcabcdef abcdef暴力匹配 a 和 a 匹配. kmp 算法 abc 和 abc 匹配8abcabcdef abcdefabcabcdef abcdef暴力匹配 ab 和 ab 匹配. kmp 算法 abcd 和 abcd 匹配9abcabcdef abcdefabcabcdef abcdef暴力匹配 abc 和 abc 匹配. kmp 算法 abcde 和 abcde 匹配10abcabcdef abcdefabcabcdef abcdef暴力匹配 abcd 和 abcd 匹配. kmp 算法 abcdef 和 abcdef 匹配 , 匹配完成11abcabcdef abcdefabcabcdef abcdef暴力匹配 abcde 和 abcde 匹配. kmp 算法匹配完成12abcabcdef abcdefabcabcdef abcdef暴力匹配 abcd 和 abcd 匹配, 匹配完成. kmp 算法匹配完成

部分匹配表

部分匹配表 (partial match table) 指的是 “前缀” 和 “后缀” 的最长共有元素的特殊称谓长度.

举个例子, 字符串 “abcdabd” 的前缀与后缀:

字符串前缀后缀共同部分值anannannan0ababnan0abca, abc, bcnan0abcda, ab, abcd, cd, bcdnan0abcdaa, ab, abc, abcda, da, cda, bcdaa1abcdaba, ab, abc, abcd, abcdab, ab, dab, cdab, bcdabab2abcdaba, ab, abc, abcd, abcda, abcdabd, bd, abd, dabd, cdabd, bcdabdnan0

kmp 算法实现

重点:

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;            }            // 匹配        windows7优化设置    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++;            } el {                //一旦不匹配成功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 算法内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-05 01:43:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/a1d776675a48c97ab22bbe1a8ee93829.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Java 数据结构与算法系列精讲之KMP算法.doc

本文 PDF 下载地址:Java 数据结构与算法系列精讲之KMP算法.pdf

标签:算法   暴力   字符串   不匹配
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图