字符串匹配算法基礎版

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

小譚靈光一閃,迫不及待的說出了自己的思路,這個簡單啊,不就是從目標串第一個字符和模式串的第一個字符開始比較,如果兩個字符相同,則繼續比較兩者後面的字符,否則,將模式串移動到目標串的第二個字符重新開始比較

 

 

大貓有點着急了,眼看自己的大招已然被識破,趕緊順勢總結了一番。

 

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

 

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

 

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

 

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

 

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

 

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

 

如果目標串的長度爲 a,模式串的長度爲 b,那麼目標串其實就可以拆成  (a-b+1) 個子串…

 

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

 

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

 

 

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

 

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

 

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

 

別急啊,關鍵就在下面的哈希函數了,我們把目標字符串中的每個子串和模式串都使用一個哈希函數來獲得哈希值,然後我們就可以直接比較其對應的哈希值就可以了,由於哈希值是一個數字,數字之間的比較是很快的。因此,判斷模式串是否在目標串中,只需要比較兩者是否有相等的哈希值就好了。

 

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

 

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

 

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

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章