壞字串規則
問題:si - xi可能是負數,示例如下:0 - 3
解決方案:好字尾規則
好字尾規則
字首子串:類似字尾子串
規則選取 實現
//主串a, 模式串b
function
bm(a,b)
for(
let i=
0;i)let suffix =
let prefix =
generategs
(b, suffix, prefix)
let i =
0while
(i <= al-bl)
if(j <0)
return i
let x = j -
getxi
(a[i+j]
)let y =0if
(j < bl -1)
i += math.
max(x,y)
}return-1
function
getxi
(v)//j表示壞字串對應的模式串中字元下標
function
movebygs
(j)}
return bl }}
function
generategs
(b,suffix,prefix)
//遍歷b,取每項值b[j],與最後一項b[m-1]比較
for(
let i =
0; i < m-
1; i++)if
(j ==-1
) prefix[k]
=true
//字尾子串匹配到了字首子串}}
//測試bm(
'cabcabd'
,'cabd'
)//3bm(
'acabcbcbacabc'
,'cbacabc'
)//6bm(
'2111'
,'1111'
)//-1
字串匹配 BM演算法
bm演算法 1 三個shift函式 d1,d2,d3,函式的作用是決定當匹配不成功時視窗的移動位數。1 d1 字尾u在模式串p中的另乙個位置是最右出現位置是j 不包括在模式串尾的出現 文字串的視窗安全移動方法是將視窗移動m j字元,使文字中的u與模式串中最右邊的u的出現位置相對齊。對模式中的每個字尾...
BM演算法 字串匹配演算法
思想 使用啟發式規則,通過每次的失敗的匹配嘗試,演算法都能根據這些資訊來排除盡可能多的無法匹配的位置 為什麼說是每次呢,因為每次的情況可能不一樣,通過資訊來跳過啟發式規則的得到的步數 目的 利用啟發式規則,盡可能多跳過無法匹配的位置,從而達到更高的效率 方法 壞字元規則和好字尾規則,取其中移動步數較...
字串匹配演算法(2)BM
2017 02 24 本篇針對bm演算法 字串匹配 進行講解。這個演算法也是看了很久,看到這裡也感覺很力不從心,看來需要我把前面兩篇演算法實踐下了,不然總覺得空空的。概述 1 對於原有的都是從左往右進行匹配的模式進行修改,改為 從右往左 也就是先匹配最後面的字元。從這裡可以引出從右往左的bf演算法,...