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

  • 相关阅读:
    什么是微服务架构!
    Redis使用总结 (序列三)
    redis centos linux操作系统安装及集群使用(序列二)
    Python操作Redis缓存数据库
    高并发系统的限流实现方式
    如何服务器的操作系统中的型号
    B8 Concurrent JDK中的乐观锁与原子类
    B7. Concurrent 锁的分类
    B6. Concurrent 内存模型与线程
    B5. Concurrent JVM 锁优化
  • 原文地址:https://www.cnblogs.com/biong-blog/p/4432681.html
Copyright © 2011-2022 走看看