BNDM
目的:
本篇博客以BNDM算法为载体,意图在减少思维断层情况下了解算法思想。
目录:
1:其他算法回顾
2:BNDM算法介绍
3:构建辅助表B
4:容器创建和更新
5:过程展示
1:其他算法回顾
在众多单字符匹配算法BF、KMP、Shift-And/Or、BM、Horspool、Sunday,个人最喜欢Shift-And/Or,尽管它不是效率最高的,但是从今以后我更喜欢BNDM。
其实,自己对BM、Horspool和Sunday算法并没有什么太多好感。如果唯一觉得好的,估计就是他们让大家的思维产生了跳跃,这个实际上是BM的功劳,但不得不说后两个对BM的简化,让这个跳跃思维更加有魅力。
在BM中,它利用了两个启发性规则:好后缀规则和坏字符规则。这个过程其实很繁琐,这不要紧,关键是作者将好后缀和坏字符进行了拆分(其实KMP中也是拆分了),根据这两个个体分别建立规则,然后会发现在利用两个规则的时候总觉得不伦不类,缺少整体性,让人觉得不爽。
Horspool和Sunday其实摒弃了两规则,但是他们采用的规则和坏字符规则类似,实则对字符的随机性进行了利用,当匹配失败的时候用最后一个字符或者最后一个字符的下一个字符进行匹配,但是这个对比较过的好后缀和坏字符并没有加以利用,其实是难以加以利用。
如果说Shfit-And/Or是对“位并行”的首次展示就让人惊讶,那么BNDM则利用“位并行”大放异彩令人叹服。
下面做一个简单回顾:
字符串匹配的时候,是在目标串中寻找是否包含模式串的过程。
BF算法:最容易想到
查找的过程:指针i和j首先分别指向了目标串和模式串的首字符。当i和j分别指向了目标串和模式串的e与u的时候,发现不等,此时BF采取简单的策略是:i回溯指向了n,j指向了模式串的首字母i,再次从头开始匹配。这种算法思路最简单,效果当然也是很差,原因在于并没有好好利用已经匹配的结果。
KMP实现了指针不回溯前进。
当目标串指针i指向y(此时i=8),模式串指针j指向d的时候(此时j=8),发现不等;KMP算法并没有采取BF的策略只是简单的把i设为1,j设为0,从头开始比较,而是移动了5步,i=8(不变),j=3,使得模式串的abc对准了目标串的abc,如上图。因为BF比较的时候中间4步是没必要的。实际上KMP利用了已经比较的字符abcttabc的特性:abc既是前缀又是后缀。效率得到改善。这样指针i就不用回溯了,算法效率是o(n)。KMP只是利用了已经匹配成功(abcttabc)的结果,并没有关心匹配失败的y和d。
Shift-And/Or:利用神器“位并行”改善KMP。
http://wlh0706-163-com.iteye.com/blog/1845919
BM:首次实现指针跳跃前进
BM采取从后向前比较,
第一次F和T比较,不等;F称为坏字符,检查模式串中发现没有F,移动7
第二次-和T比较,不等;-称为坏字符,检查模式串中发现有-,移动4,对齐。
第三次当比较到L和A的时候,L是坏字符,由于模式串中没有L,移动6;T是已经匹配的好后缀,根据好后缀需要移动3;取两者中大的6.
第四次当比较-和H的时候,根据坏字符-需要移动2步才能对齐;根据好后缀AT需要移动5才能将模式串中AT和目标串的AT对齐。
BM就是这样比较了14次就成功匹配了。
BM利用了已经匹配的结果(好后缀)和没有匹配成功的(坏字符),但是分开利用的。
Horspool和Sunday将指针跳跃前进的效率大大提高。下面以Horspool为例
此时并没像BM一样,而是直接就根据最后一个字符n来匹配,将模式串中的字符和n对齐,相当于移动了7步。
Horspool实际只关心是否匹配成功,只要没有成功则按照最后一个字符移动。但是他的效率真的很高,主要是利用了单词中的字符的很随机的性质。
其实,最一般的想法是最好能够同时利用已经成功匹配(好后缀)和没有成功匹配的(坏字符)字符做些事情,当然BM中已经这样做了,但是他是分开利用的,总觉的不是很舒服。
BDM(不是BNDM)的出现则很好的解决了这个问题:基于子串进行匹配,它把好后缀和坏字符当成一个整体来利用。
BNDM则是利用了位并行提高了BDM的效率,就像Shift-And提高了KMP算法的效率一样,只是BNDM是基于后缀匹配,Shift—And基于前缀。
想要了解Shift-And/Or,请参看http://wlh0706-163-com.iteye.com/blog/1845919
算法介绍
BNDM算法维护一个容器,里面记录的是已经成功匹配的所有字符用u表示在模式串中出现位置,这个容器同样是用一个位向量D=dmdm-1…d1来表示。
当读入u的第一个字符u1时,模式串中第2位,第6位(从左到右数,下标从0开始)含有u1,则容器的第2,6位相应设为1;当读入第二个字符u2的时候,如果第1位,第5位让就是u2,则此时设第1位和第5位为1,如果第1位不是u2,则此时只有第5位是1.(可以先看例子,明白的快些)
构建辅助表B
同样,和Shift-And算法一样需要先构建一个辅助表B,B用位掩码记录了某个字符在模式串中出现的位置。
结果:
容器创建和更新
创建:
容器默认值是1m(m个1,m表示的是模式串的字符的个数)
更新:
第1步:查询辅助表B,得到新字符tj的掩码B[tj]
第2步:左移1位
过程展示:
伪代码:
第一次:
第二次:
第三次:
当读取了8个字符后,发现D的值仍旧不是0,表明模式串中存在这由njection这8个字符组成的子串,此时last=j=1。在读取下一个字符n前,D在更新操作:左移1位后,发现D变成了000000000 这表明匹配失败,模式串向后移动last位,即1位。
第四次:
其实,对于last的值,从本案例第三次匹配的时候用到了一次,
由于D是100000000,这个的意思实际上就是KMP中既是前缀又是后缀的字符的判断。已经匹配的字符”injection”其实是目标串的后缀同时又是模式串的前缀,判断后last被赋值为j即1.下一次移动不再是9步而是1步。
附上另外2个案例:第一个是作者论文中的案例
案例1:
目标串Target:abbabaabbaab
模式串Pattern:aabbaab
案例2:
同样运用“位并行”的算法Shift-And/or的出现是在1992年,它的出现将基于前缀匹配的KMP算法的效率大大提高,。但是和BNDM算法相比,不论是效率上还是优美程度上都不可相提并论。当然,Shift-And/or算法一样,这种基于位并行算法会和机器有一定联系(字长),还会有各种各样的算法来解决字长限制的问题,有兴趣可以自己研究BOM算法。
相关推荐
### Surfer8.0制作断层的方法详解 #### 一、引言 在地质学、地理信息系统(GIS)以及地球科学领域中,断层的研究对于理解地壳结构、地震活动和地形演化至关重要。Surfer8.0是一款强大的科学绘图与数据分析软件,...
本主题聚焦于“断层识别”,这是一个在地质学和医学图像处理中至关重要的任务,通过对断层的准确识别,可以揭示地壳结构、矿产分布或者疾病的诊断。在这个项目中,我们利用了一种广泛使用的深度学习模型——卷积神经...
传统的断层描述手段,如平面图、剖面图、岩性编录表格、钻孔柱状图等,通常局限于二维或一维的表达方式,难以直观地展现断层的复杂性。随着三维地质建模技术的发展,三维可视化手段可以更真实地展现复杂断层的空间展...
断层等值线绘制则是针对具有断层结构的数据进行的特殊处理,目的是更准确地展示断层区域的数据特征。下面我们将深入探讨这一主题。 首先,我们需要理解什么是断层。在地质学中,断层是指地壳中的岩石因受到强大压力...
为了防止断层底板水突出,需保留合适宽度的断层防水煤柱。以弱导水性F29断层为例,用已有的断层防水煤柱留设的计算方法及原则,计算出F29断层防水煤柱留设宽度。根据公式的来源与断层突水机理,讨论原计算公式的不合理性...
基于MAPGIS的断层分形研究,是一种将先进的信息技术与地质学紧密结合的创新研究方法,旨在深入探索断层系统的复杂性和规律性。断层,作为地球表面和地壳内部广泛存在的地质构造,其形态和分布呈现出高度的复杂性和不...
在探讨煤矿平面位移断层分析研究中,首先需要对平面位移断层的概念和特性有所了解。平面位移断层,又称平移断层,是指在地壳运动过程中,地层沿某一平面发生相对水平移动的一种断层。这种断层的特征在于断层面相对...
Excel断层图表是一种独特且富有视觉冲击力的数据可视化工具,尤其适用于展示数据在不同类别间的跳跃或断层。这种图表可以清晰地突出显示数据中的差异和变化,使得数据分析更为直观。接下来,我们将深入探讨如何使用...
在实际操作中,工程师需要结合具体的地质资料、设备条件和生产目标,综合分析后才能确定最适合的过断层方法。通过合理规划和精心施工,可以最大限度地减少断层对煤矿生产的影响,提高煤矿的经济效益。
断层模拟程序是一种在地质学、地球物理学以及结构工程领域广泛应用的工具,它主要用于研究地壳内部断层的运动机制、地震的发生机理以及断层对岩土体稳定性的影响等。给定的文件描述了一个简单的断层模拟程序,旨在...
查明不同倾角正断层附近应力分布规律对瓦斯分布规律预测、煤与瓦斯突出预测具有重要的参考价值。以鹤壁四矿31052采煤工作面内不同倾角正断层参数为基础,结合实验室岩石力学测试,构建了正断层地质模型;借助ANSYS有限...
根据贵州某矿111013回采工作面的地质条件制作相似试验模型,模拟回采工作面从靠近到远离顶板断层过程。研究结果表明:随着回采工作面靠近断层,顶板断层附近煤岩体稳定性变差,周期来压步距变小;工作面距离顶板断层10 m...
煤矿井下过断层技术浅析涉及的主要知识点包括煤矿井下断层的成因、断层的影响、断层的识别方法以及煤矿井下采掘工作面过断层的技术方法和巷道支护方式。 首先,煤矿井下断层的成因是由于地质构造应力的作用,在地下...
钱营孜煤矿F22断层是井田内最大的正断层,为西二、西三采区边界断层。断层断距20~350 m,区内延伸长度6.50 km以上。根据钱营孜煤矿采区接替要求,接替的西三采区集中石门势必要穿越F22正断层。该断层落差大,延伸长,断层...