BM算法--串匹配

BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快。时间复杂度O(m/n)

C++描述(教师版)

int BM(char S[],char T[], int n, int m)
{
//主串长度为n,模式串长度为m,主串和模式串的数组下标从1开始
      int i=m;
      int j;
      while(i<=n){
            j=m;
            while(j>0&&S[i]==T[j]){
	   j--;
	   i--;
            }
            if(j==0) return i+1;
            else {
	    i=i+dist(S[i],T,m);
	    cout<<"重新从主串的"<<i<<"处向前匹配"<<endl;
            }
      }
      return

 我的javascript版实现

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>BM算法</title>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript">
        //T:子串,S:主串,SI:主串起始下标,TJ:子串起始下标
        function BM(S, T, SI, TJ) {
            while ( TJ >=0&&SI<S.length) {
                if (S[SI] == T[TJ]) {

                    if (TJ==0) {
//返回开始的位置,自然记数。
                        return SI+1;
                    }

                    SI--;
                    TJ--;

                } else {
                    SI = SI + dist(T, S[SI]);
                    TJ = T.length - 1;
                }
            }
//查找不到时返回-1
             return -1;

        }

        function dist(array, target) {
            for (var i = 0; i < array.length; i++) {
                if (array[i] == target) {
                    if (i == array.length - 1) {
                        return array.length;
                    }

                    return array.length - i -1;
                }

            }

            return array.length;

        }

    </script>
</head>
<body>

<input type="text" id="S" placeholder="要查找的字符串"/><br/>
<input type="text" id="T" placeholder="关键字符串"/><br/>
<input type="button"  value="确认" onclick="demo();"/>
<script type="text/javascript">
    function demo() {
        var S = $(‘#S‘).val();
        var T = $(‘#T‘).val();
        alert(BM(S, T, T.length - 1, T.length - 1));

    }
</script>

</body>
</html>

 

时间: 2024-08-07 18:39:24

BM算法--串匹配的相关文章

算法——字符串匹配之BM算法

前言 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左开始比较,但模式串的移动依然是从左到右的.在实践中,BM算法效率高于前面介绍的<KMP算法>,算法分为两个阶段:预处理阶段和搜索阶段:预处理阶段时间和空间复杂度都是是O(m+sigma),sigma是字符集大小,一般为256:在最坏的情况下算法时间复杂度是O(m*n):在最好的情况下达到O(n/m). BM算法实现 BM算法预处理过程 BM算法有两个规则分别为坏字符规则(Bad Cha

Boyer-Moore(BM)算法,文本查找,字符串匹配问题

KMP算法的时间复杂度是O(m + n),而Boyer-Moore算法的时间复杂度是O(n/m).文本查找中“ctrl + f”一般就是采用的BM算法. Boyer-Moore算法的关键点: 从右遍历,如果有txt里面的i+j元素和pat里面的j元素不一致,调整.根据right[]调整,right[]类似与KMP算法里面的nextval.skip = j - right[txt.charat(i+j)]; if(skip < 1) skip = 1;  i+=skip; 即找txt里面的第i+j

字符串匹配——BM算法

BM算法通过Java语言实现. public class BFMatching { public static void main(String[] args) { long startTime; long endTime; long durationTime; startTime = System.nanoTime(); BM(); endTime = System.nanoTime(); durationTime = endTime - startTime; System.out.print

BM算法详解(转)

1977 年,Robert S.Boyer和J Strother Moore提出了另一种在O(n)时间复杂度内,完成字符串匹配的算法,其在绝大多数场合的性能表现,比KMP算法还要出色,下面我们就来详细了解一下这 一出色的单模式匹配算法,在此之前推荐读者读一下我的另一篇文章<KMP算法详解>,对于透彻理解BM算法大有裨益. 在讲解Boyer-Moore算法之前,我们还是要提一提KMP算法的老例子,当模式串与目标串匹配至如下位置时:  1  2  3  4  5  6  7  8  9 10 11

字符串查找与匹配之BM算法

一.字符串查找:1.在Word. IntelliJ IDEA.Codeblocks等编辑器中都有字符串查找功能.2.字符串查找算法是一种搜索算法,目的是在一个长的字符串中找出是否包含某个子字符串. 二.字符串匹配:1.一个字符串是一个定义在有限字母表上的字符序列.例如,ATCTAGAGA是字母表 E ={A,C,G,T}上的一个字符串.2.字符串匹配算法就是在一个大的字符串T中搜索某个字符串P的所有出现位置.其中,T称为文本,P称为模式,T和P都定义在同一个字母表E上.3.字符串匹配的应用包括信

经典的BM算法

KMP的匹配是从模式串的开头开始匹配的,而1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法:Boyer-Moore算法,简称BM算法.该算法从模式串的尾部开始匹配,且拥有在最坏情况下O(N)的时间复杂度.在实践中,比KMP算法的实际效能高. BM算法定义了两个规则: 坏字符规则:当文本串中的某个字符跟模式串的某个字符不匹配时,我们称文本串中的这个失配字符为坏字符,此时模式串需要向右移动,移动的位数 = 坏字符在模式串中

BM算法详解

BM算法 后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,经典的BM算法其实是对后缀蛮力匹配算法的改进.为了实现更快移动模式串,BM算法定义了两个规则,好后缀规则和坏字符规则,如下图可以清晰的看出他们的含义.利用好后缀和坏字符可以大大加快模式串的移动距离,不是简单的++j,而是j+=max (shift(好后缀), shift(坏字符)) 先来看如何根据坏字符来移动模式串,shift(坏字符)分为两种情况: 坏字符没出现在模式串中,这时可以把模式串移动到坏字符的下一个字符

C++ SUNDY算法(BM算法的改进)

字符串查找算法中,最著名的两个是KMP算法Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情 况下均具有线性的查找时间.BM算法往往比KMP算法快上3-5倍.但是BM算法还不是最快的算法,这里介绍一种比BM算法更快一些的查找算法. 例如我们要在"substringsearchingalgorithm"查找"search" 第一步,把子串与文本左边对齐: s u b s t r i n g s e a r c h i n g

字符串匹配算法 - BM算法

BM算法原理分析 BM 算法包含两部分,分别是 坏字符规则(bad character rule)和 好后缀规则(good suffix shift) 1.坏字符规则 我们从模式串的末尾往前倒着匹配,当我们发现某个字符没法匹配的时候.我们把这个没有匹配的字符叫做** 坏字符 **(主串中的字符) 当发生不匹配的时候,我们把坏字符对应的模式串中的字符下标记做si.如果坏字符在模式串中存在,我们把这个坏字符在模式串中的下标记做xi.如果不存在,我们把xi记做-1.那模式串往后移动的位数就等于si-x