zoukankan      html  css  js  c++  java
  • 时空权衡之字符串匹配中的输入增强技术

    字符串匹配的蛮力的算法:

    对于字符数为n的文本,模式(要匹配的字符串)字符为m的字符串,简单的从左到右比较模式和文本中每一对相应的字符,,如果不匹配,模式向右移一格,再进行下一轮的尝试。

    这样尝试的最大次数为n-m+1次,模式进行m次比较,这样比较次数一共是m(n-m+1)=O(nm),次,对于随机的自然文本,它的平均效率为O(n+m)

    使用输入增强的思想:对模式进行预处理以得到它的一些信息,把这些信息储存在表中,然后在给定文本中实际查找模式时使用这些信息。

    以下是这种思维下的两种算法:

    一、Horpool算法

    预先计算出每次移动的距离并把它们存在表中,这个表是以文本中所有可能遇到的字符为索引

    计算移动距离的公式

               模式的长度m(如果c不包含在模式的前m-1个字符中)

    t(c)={                                                                                                      (公式1)

               模式前m-1个字符中最右边的c到模式最后一个字符的距离(其他情况下)

    这里有一个简单的算法计算用来计算移动表中每个单元格的值,初始时,把所有的单元格都设置为模式的长度m,然后从左到右扫描模式,将下列步骤重复m-1遍:

    对于模式中的第j个字符(0<=j<=m-2),将它在表中的单元格改写为m-1-j,这是该字符到模式右端的距离。注意该算法是从左到右扫描算法,一个字符的最后一次改写是在该字符最右边一次出现的时候,这正是我们希望的。

    算法 ShiftTable(p[0..m-1])

          //用Horspool 算法和Boyer-Moore算法填充移动表

          //输入:模式p[0..m-1]以及一个可能出现字符的字母表

         //输出:以字母表中字符为索引的数组Table[0..size-1],

         //表中填充的移动距离是通过(公式1)

        for  i<-0  to  size-1 do  Table[i]=m

        for  j<-0  to  m-1   do   Table[p[j]]=m-1-j

        return  Table

  • 相关阅读:
    013.ES6 -对象字面量增强型写法
    012. ES6
    011. ES6 语法
    10. 9. Vue 计算属性的setter和getter 以及 计算属性的缓存讲解
    4. Spring MVC 数据响应方式
    3. SpringMVC 组件解析
    9. Vue 计算属性
    【洛谷 2984】给巧克力
    【洛谷 1821】捉迷藏 Hide and Seek
    【洛谷 1821】银牛派对Silver Cow Party
  • 原文地址:https://www.cnblogs.com/biong-blog/p/4432681.html
Copyright © 2011-2022 走看看