sunday演算法核心思想:啟發式移動搜尋步長!
sunday 演算法描述:
字串查詢演算法中,最著名的兩個是kmp演算法(knuth-morris-pratt)和bm演算法(boyer-moore)。這裡介紹一種比bm演算法更快一些的sunday查詢演算法。
例如我們要在"substring searching algorithm"查詢"search",剛開始時,把子串與文字左邊對齊:
substring searching algorithm
search
^結果在第二個字元處發現不匹配,於是要把子串往後移動。但是該移動多少呢?這就是各種演算法各顯神通的地方了,最簡單的做法是移動乙個字元位 置;kmp是利用已經匹配部分的資訊來移動;bm演算法是做反向比較,並根據已經匹配的部分來確定移動量。這裡要介紹的方法是看緊跟在當前子串之後的那個字 符(上圖中的 'i')。
顯然,不管移動多少,這個字元是肯定要參加下一步的比較的,也就是說,如果下一步匹配到了,這個字元必須在子串內。所以,可以移動子串,使子串中的 最右邊的這個字元與它對齊。現在子串'search'中並不存在'i',則說明可以直接跳過一大片,從'i'之後的那個字元開始作下一步的比較,如下圖:
substring searching algorithm
search
^比較的結果,第乙個字元就不匹配,再看子串後面的那個字元,是'r',它在子串中出現在倒數第三位,於是把子串向前移動三位,使兩個'r'對齊,如下:
substring searching algorithm
search
^哈!這次匹配成功了!回顧整個過程,我們只移動了兩次子串就找到了匹配位置,是不是很神啊?!可以證明,用這個演算法,每一步的移動量都比bm演算法要大,所以肯定比bm演算法更快。
因此,對於leetcode上的解題:
implement strstr().returns the index of the first occurrence of needle
in haystack, or -1 if needle is
not part of haystack.
完整的python**如下:
classsolution(object):
defstrstr(self, haystack, needle):
""":type haystack: str
:type needle: str
:rtype: int
refer:
"""char_pos =dict()
for i, ch in
enumerate(needle):
char_pos[ch] =i
i =0
len1 =len(haystack)
len2 =len(needle)
while i <= len1 -len2:
found =true
for j, ch in
enumerate(needle):
if haystack[i+j] !=ch:
found =false
if (i+len2) if haystack[i+len2] not
inchar_pos:
i += (len2+1)
else
: i += (len2-char_pos[haystack[i+len2]])
else
:
return -1
break
iffound:
return
i
return -1
參考:
字串匹配 sunday演算法
原題 lintcode題目 字串查詢 又稱查詢子字串 是字串操作中乙個很有用的函式。你的任務是實現這個函式。對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。字串匹配最常見的就是km...
字串匹配sunday演算法
在網上看到了一種比kmp和bm演算法還快字串匹配演算法,就看了一下,並且發現一些部落格上寫的 是錯誤的,於是我也寫了乙個,leetcode上測試通過。首先對sunday演算法進行一下講解 從別的地方複製過來的,講的確實不錯 好了,sunday演算法還真的很好理解,用下面的例子來說明吧 j k t h...
字串匹配 Sunday演算法
字串匹配演算法中最先學的演算法是暴力演算法,緊接著是kmp演算法,到現在依舊沒有理解next到底是怎麼求的 尋找到了一種新的演算法 sunday演算法,比kmp演算法更快 匹配時關注匹配主串中參與匹配的最後一位字元的下一位字元。參考 include includeusing namespace st...