美文网首页
数据结构与算法-BMP算法

数据结构与算法-BMP算法

作者: SK_Wang | 来源:发表于2020-04-24 01:26 被阅读0次

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。
KMP算法的时间复杂度O(M + N)

KMP算法原理

部分匹配表(Partial Match Table)如何计算

首先,要理解两个概念:

  • 前缀:指除了最后一个字符以外,一个字符串的全部头部组合;
  • 后缀:指除了第一个字符以外,一个字符串的全部尾部组合。

部分匹配值就是指前缀后缀的最长共有元素的长度。

KMP代码实现

/*
 KMP 算法
 */

void get_next(String T, int *next) {
    int i, j;
    i = 0;
    j = 1;
    
    next[1] = 0;
    while (j < T[0]) {
        if (i == 0 || T[i] == T[j]) {
            i++;
            j++;
            next[j] = i;
        } else {
            i = next[i];
        }
    }
}

int Index_KMP(String S, String T, int pos) {
    int next[MAXSIZE];
    get_next(T, next);
    
    int i = pos;
    int j = 1;
    while (i < S[0] && j <= T[0]) {
        if (j == 0 || S[i] == T[j]) {
            i++;
            j++;
        } else {
            j = next[j];
        }
    }
    
    if (j > T[0]) {
        return i - T[0];
    } else {
        return -1;
    }
}

优化

/*
 KMP优化
 */

void get_next(String T, int *next) {
    int i, j;
    i = 0;
    j = 1;
    
    next[1] = 0;
    while (j < T[0]) {
        if (i == 0 || T[i] == T[j]) {
            i++;
            j++;
            
            if (T[i] != T[j]) {
                next[j] = i;
            } else {
                next[j] = next[i];
            }
        } else {
            i = next[i];
        }
    }
}

int Index_KMP(String S, String T, int pos) {
    int next[MAXSIZE];
    get_next(T, next);
    
    int i = pos;
    int j = 1;
    while (i < S[0] && j <= T[0]) {
        if (j == 0 || S[i] == T[j]) {
            i++;
            j++;
        } else {
            j = next[j];
        }
    }
    
    if (j > T[0]) {
        return i - T[0];
    } else {
        return -1;
    }
}

相关文章

  • 数据结构与算法-BMP算法

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人...

  • 数据结构与算法 - 查找

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构数据结构...

  • 数据结构与算法 - 树形结构

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构 目录 ...

  • 思维导图之数据结构+算法

    数据结构+算法 = 程序 数据结构比较 参考文章 数据结构与算法数据结构与算法(java)

  • 最新完整数据结构与算法

    最新完整数据结构与算法 P11_课程介绍 P22_数据结构与算法概述_数据结构 P33_数据结构与算法概述_算法 ...

  • Hash算法

    数据结构与算法分析:大纲数据结构:数组算法:hash算法算法:排序算法Java实现 1 Hash算法? 将任意长度...

  • 数据结构与算法-目录

    数据结构与算法-目录 C语言篇 数据结构和算法-C语言篇1-绪论数据结构和算法-C语言篇2-初识算法数据结构与算法...

  • 数据结构与算法

    数据结构与算法之美 数据结构与算法之美1--如何学数据结构与算法之美2--复杂度分析(上)数据结构与算法之美3--...

  • 数据结构与算法

    参考链接:算法 数据结构与算法 iOS数据结构 和 算法 上 算法 1、数据结构: 集合结构: 线性结构: 树形结...

  • 算法与数据结构(1),List

    算法与数据结构(1),List 算法与数据结构(2),Map 算法与数据结构(3),并发结构 习惯了,深夜更新博客...

网友评论

      本文标题:数据结构与算法-BMP算法

      本文链接:https://www.haomeiwen.com/subject/reroihtx.html