时空权衡之字符串匹配中的输入增强技术

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

对于字符数为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

时间: 2024-10-12 17:27:59

时空权衡之字符串匹配中的输入增强技术的相关文章

深度学习中的数据增强技术(二)

上篇文章介绍了深度学习中数据增强技术的应用,及部分TensorFlow实现代码.废话不说了,这篇接着介绍: TensorFlow实现图片数据增强 注:类似的方法放在了代码中注释的部分,实际调试时可以分别打开运行 ③图像色彩调整 import matplotlib.pyplot as plt import tensorflow as tf # 读取图片 image_data = tf.gfile.FastGFile("data/dog3.jpg", 'br').read() # 4中调整

字符串匹配(BF,BM,Sunday,KMP算法解析)

字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强的实用价值,应用于信息搜索,拼写检查,生物信息学等多个领域. 今天介绍几种比较有名的算法: 1. BF 2. BM 3. Sunday 4. KMP -,BF算法 BF(Brute Force)算法又称为暴力匹配算法,是普通模式匹配算法. 其算法思想很简单,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,则主串和模式串都后移一个字符继续比较:若不相同,则回溯到主串S的第pos+1个字符重新

模糊字符串匹配:FuzzyWuzzy

FuzzyWuzzy 模糊字符串匹配,它使用Levenshtein Distance来计算简单易用的包中序列之间的差异. 前置条件 Python 2.7 or higher difflib python-Levenshtein(可选的,在字符串匹配中提供4-10倍的加速,不过在某些情况下可能导致不同的结果) 测试 pycodestyle hypothesis pytest 安装 使用PIP经由PyPI安装 或者用如下命令安装 使用PIP经由Github安装 添加你的requirementrequ

StartDT AI Lab | 数据增强技术如何实现场景落地与业务增值?

有人说,「深度学习“等于”深度卷积神经网络算法模型+大规模数据+云端分布式算力」.也有人说,「能够在业内叱咤风云的AI都曾“身经百战”,经历过无数次的训练与试错」.以上都需要海量数据做依托,对于那些数据量匮乏的领域,就衍生出了数据增强技术.即,根据一个原始数据,稍作改动,变成一个对于AI来说的全新的数据. 01 为什么做数据增强? 数据规模的重要性到底怎样呢?可以说,深度学习的火热和蓬勃发展,直接源于普林斯顿大学教授李飞飞及她所带领的团队创作的一个包含百万级图片的数据集ImageNet.工业级人

时空权衡之输入增强 ----字符串匹配算法Horspool算法和Boyer-Moore算法

在算法设计的时空权衡设计技术中,对问题的部分或者全部输入做预处理,对获得的额外信息进行存储,以加速后面问题的求解的思想,我们称作输入增强. 其中字符串匹配算法Horspool算法和Boyer-Moore算法就是输入增强的例子. 首先了解一下字符串匹配的概念.我们把在一个较长的n个字符的串中,寻找一个给定的m个字符的串的问题,称为字符串匹配问题.较长的串称为text,而需要寻找的串称为pattern. 字符串匹配问题的蛮力算法很好理解:我们把pattern与text第一个字符对齐,从左往右比较pa

【Java编程】Java中的字符串匹配

在Java中,字符串的匹配可以使用下面两种方法: 1.使用正则表达式判断字符串匹配 2.使用Pattern类和Matcher类判断字符串匹配 正则表达式的字符串匹配: 正则表达式:定义一组字符串的一系列字符和符号,它由常量字符和特殊符号构成. 下面是正则表达式的一些预定义字符类,实际上是一些转义字符序列: 1.\d   代表任何数字 2.\D  代表任何非数字字符 3.\w  代表任何单字字符(如:字母.数字.下划线等等) 4.\W  代表任何非单字字符 5.\s   代表任何空白字符 6.\S

Hash——字符串匹配(求s1在s2中出现的次数)

题目描述: 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A  中的出现次数.A 和 B中的字符均为英语大写字母. 求A 在 B 中出现了几次.(可重叠) 样例输入: 3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN 样例输出: 1 3 0 首先要知道什么是字符串hash(滚动哈希): 单哈希可以O(m)的时间计算长度为m的字符串的哈希值,但对于本题,总的时间复杂度没有改观.时间会爆. 这时我们就需要一个叫做滚动哈希的优化技巧.

LeetCode | 1408. String Matching in an Array数组中的字符串匹配【Python】

LeetCode 1408. String Matching in an Array数组中的字符串匹配[Easy][Python][字符串] Problem LeetCode Given an array of string words. Return all strings in words which is substring of another word in any order. String words[i] is substring of words[j], if can be o

在EditText中限制输入,自定义样式,监听输入的字符,自动换行

自动获取焦点 <!-- 添加:<requestFocus /> 会自动获取焦点 --> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:gravity="center_horizontal" android:hint="自