spider monkey 中 BMH的使用

2021-04-13 04:26:20 字數 856 閱讀 7788

因為專案中嵌入了spider monkey,需要做剪裁和擴充套件,因此對原始碼做了點研究。

在讀string的實現的時候,發現str_indexof使用的字串匹配演算法就是著名的bmh演算法,從實際效率考慮,並不是所有情況下都使用bmh演算法,而是在如下情況下 if ((jsuint)(patlen - 2) <= bmh_patlen_max - 2 && textlen >= 512) 才使用,其餘情況下則使用普通的遍歷方法查詢字串。

patlen是匹配串長度,textlen是被匹配文字長度。bmh_patlen_max為255,是skip element的size,(uint8)。

前乙個條件(jsuint)(patlen - 2) <= bmh_patlen_max - 2很好理解,patlen == 1的時候當然沒必要使用bmh了,patlen > bmh_patlen_max 的時候 skip陣列的元素長度不夠。第2個條件textlen >= 512 似乎只能用實際的測試資料來說話了,簡單的從複雜度來判斷似乎說明不了什麼。等有空找到典型的測試資料再補上來。

附上bmh演算法,思想很簡單,自己看**就很容易理解了。

jsint

js_boyermoorehorspool(const jschar *text, jsint textlen,

const jschar *pat, jsint patlen,

jsint start)

for (k = start + m;

k < textlen;

k += ((c = text[k]) >= bmh_charset_size) ? patlen : skip[c])

} return -1;

}

BM演算法詳解

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

演算法 BM演算法

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

BM線性遞推

如果乙個數列 其能夠通過線性遞推而來 例如使用矩陣快速冪優化的 dp 大概都可以丟進去 則使用 bm 即可得到任意 n 項的數列元素 模板 include include include include include include include include include includeu...