字符串搜索之BMH 算法(伪代码)

  天哪,算法复杂度越来越低了,连线性的都不用了!!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

你可能感兴趣的:(搜索,字符串处理)