字符串匹配算法基礎版

最近小譚又被問了一個問題,編程語言中的字符串匹配函數是怎麼實現的,是啥原理。算法

看來大貓又要展現他靠才華吃麪的大招了。編程

小譚一邊內心犯嘀咕,這還能有啥原理,直接用不就好了,管那麼多幹啥,一邊對大貓說,今天又想要吃啥面了。編程語言

大貓就是這樣,常常問你一個問題,你要不會,而後讓你請他吃碗麪,他給你講清楚。函數

大貓靦腆一笑表示今天吃一碗拉麪就行,估計是今天這個大招的技術含量不夠高吧,一碗拉麪就給應付了。學習

果真,大貓僅用 5 個字就形容了他的大招,暴力匹配法,小譚一聽暴力法,眉頭一皺,貌似也想到了答案,大貓趕忙繼續補充。優化

暴力匹配就是用最原始、最笨的方法去匹配,把兩個字符串分別稱做目標字符串和模式字符串,而後要判斷在目標字符串中可否匹配到模式字符串。設計

小譚靈光一閃,火燒眉毛的說出了本身的思路,這個簡單啊,不就是從目標串第一個字符和模式串的第一個字符開始比較,若是兩個字符相同,則繼續比較二者後面的字符,不然,將模式串移動到目標串的第二個字符從新開始比較3d

大貓有點着急了,眼看本身的大招已然被識破,趕忙順勢總結了一番。orm

是噠,這就是最常規的思路,也是最簡單的算法,這個暴力匹配算法被稱做 BF (bure force) 算法。cdn

小譚依然追問到,這個算法沒啥技術含量,就是用的笨方法,還有沒有更好一點的,否則都不值這碗拉麪。

有,還真有比這更好一點的,不過要加個滷蛋才能夠。看樣子大貓早就準備好的了,滿滿的套路。

咱們可使用哈希算法來優化 BF 算法,大貓看起來很得意的樣子。

爲啥要用哈希呢,怎麼用,小譚有點不太明白。

你看在 BF 算法中,每次都是拿目標字符串和模式串一個字符一個字符的比較,這樣很耗時間。

若是目標串的長度爲 a,模式串的長度爲 b,那麼目標串其實就能夠拆成 (a-b+1) 個子串…

等等,爲啥是 (a-b+1) 呢,小譚有點疑惑。

我給你畫張圖你就明白了,大貓邊說邊開始在手機上畫起了圖。

目標串長度爲6,模式串長度爲3,因此目標串一共有4個子串

接下來其實就是把這 (a-b+1) 個子串和模式串挨個比較便可。

那這裏也沒有特別的啊,也沒用到哈希函數啊,小譚緊接着問大貓。

別急啊,關鍵就在下面的哈希函數了,咱們把目標字符串中的每一個子串和模式串都使用一個哈希函數來得到哈希值,而後咱們就能夠直接比較其對應的哈希值就能夠了,因爲哈希值是一個數字,數字之間的比較是很快的。所以,判斷模式串是否在目標串中,只須要比較二者是否有相等的哈希值就行了。

這個思路有點巧妙啊,小譚有點茅塞頓開的感受了。

這其實只是一個思路,核心在於這個哈希函數的設計,好比若是存在哈希衝突怎麼處理,怎麼只遍歷一次目標串便可算出全部子串的哈希值,這些都是這個哈希函數要解決的問題,另外這種算法叫作 RK 算法,是兩位外國人名字的首字母組合而成。

這碗拉麪總算是值了,不過最後這個哈希函數的具體設計下回還得繼續講清楚啊。。。

沒問題啊,不過我也還得回去再查查資料從新學習下,爭取下回給你講明白,今天給你講的就是個主要的思路。。。

相關文章
相關標籤/搜索