BM演算法(筆記)

2021-10-23 11:19:05 字數 809 閱讀 7654

利用多位移動減少不必要的匹配。

兩條字串:主串,匹配串(主串不動,匹配串去匹配)

(以下是匹配串針對主串而言)

初始位置:最左對齊

匹配方向:從右向左(即初始位置對齊後,從匹配串最後乙個字元開始匹配)

移動方向:從左向右

從右向左匹配時,出現不匹配的字元稱為「壞字元」,壞字元有兩種情形,分別是「匹配串存在該壞字元」和「匹配串不存在該壞字元」。

從右向左匹配時,出現連續匹配字元的情況(直至出現壞字元),該連續匹配的字串稱為「好字尾」,且該字尾的字尾也屬於好字尾,例如有「abc」,即「bc」和「c」也屬於好字尾。

好字尾 > 壞字元

主串:abdcbcdabcad

匹配串:abc

第一步:

解析:出現壞字元d,匹配串後移3位(網上有通過算式計算出這個移動位數)。至於為什麼是後移3位,是因為d不屬於匹配串,計算一位一位地移動也無法正確匹配,所以直接跳過d。

第二步:

解析:出現好字尾bc(c也屬於好字尾)。以「c」為例(如果是bc,就把bc看成乙個整體),除了被匹配的c以外,尋找c在匹配串的最右位置,可以發現abc只有被匹配的c,不存在最右位置的c,所以右移動3位,直接跳過c。(如果存在最右位置的c,例如匹配串假如是acbc,那麼倒數第2個c就是除了被匹配的c之外的最右c位置,把這個c與主串的被匹配的c對齊。)

第三步:

解析:分析參考1、2步,b對齊。

第四步:

解析:得到匹配串。

匹配串移動時,無非兩種情況:

1:跳過主串不存在的匹配字元;

2:把最右位置的x字元對齊主串上的x匹配字元。

演算法 BM演算法

如果要判定長度為n nn兩個字串相等,比較中要進行n nn比較,但是如果要判定兩個字串不相等,只需要找出乙個不相等的位置,因此可以得到如下結論 結論1 判定字串相等和判定字串不相等的代價不同,判定不相等的代價更小 在kmp演算法中,每發生一次失配時,演算法總是嘗試根據已經獲得的匹配成功的資訊來確定乙...

BM演算法詳解

bm演算法 字尾匹配,是指模式串的比較從右到左,模式串的移動也是從左到右的匹配過程,經典的bm演算法其實是對字尾蠻力匹配演算法的改進。為了實現更快移動模式串,bm演算法定義了兩個規則,好字尾規則和壞字元規則,如下圖可以清晰的看出他們的含義。利用好字尾和壞字元可以大大加快模式串的移動距離,不是簡單的 ...

BM演算法總結

bm演算法,可以求乙個數列的最短遞推式。採用增量法,依次考慮每個數 若在這個位置上正確,則忽略 否則,類似拉格朗日插值法,找乙個滿足在前面位置都為0,這個位置上不為0的遞推式,進行修補。每當我們遇到乙個這樣的位置時,我們都可以得到乙個這樣的遞推式 用目前的遞推式,在0位置 即這個位置上 增加乙個 1...