天哪,算法复杂度越来越低了,连线性的都不用了!!O(n-m)!!从后往前扫的功效!!(要匹配的字符)
逆简单算法
• 如果从P的后面开始搜索?
– Boyer and Moore
Reverse-Naive-Search(T,P)
01 for s <- 0 to n – m
02 j <- m – 1 // start from the end
03 // check if T[s..s+m–1] = P[0..m–1]
04 while T[s+j] = P[j] do
05 j <- j - 1
06 if j < 0 return s
07 return –1
运行时间和简单算法相同
偏移表
• 在预处理中, 计算大小为|S|的偏移表.
• 例: P = “kettle”
– shift[e] =4, shift[l] =1, shift[t] =2, shift[k] =5
• 例: P = “pappar”
– 其偏移表是什么?
Boyer-Moore-Horspool 算法
BMH-Search(T,P)
01 // compute the shift table for P
01 for c <- 0 to |S|- 1
02 shift[c] = m // default values
03 for k <- 0 to m - 2
04 shift[P[k]] = m – 1 - k
05 // search
06 s <- 0
07 while s <- n – m do
08 j <- m – 1 // start from the end
09 // check if T[s..s+m–1] = P[0..m–1]
10 while T[s+j] = P[j] do
11 j <- j - 1
12 if j < 0 return s
13 s <- s + shift[T[s + m–1]] // shift by last letter
14 return –1