Sunday 算法思想
什么KMP什么BM都是垃圾,老子才是最速最强
KMP算法和BM算法在最坏情况下均具有线性的查找时间,但实际上,KMP算法并不比最简单的 C 库函数strcmp()快多少,而 BM 算法虽然通常比 KMP 算法快,但 BM 算法也还不是现有字符串查找算法中最快的算法,Sunday算法是比 BM 算法更快的查找算法。
Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似:
- Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。
- 如果该字符没有在模式串中出现则直接跳过该字符,即模式串移动位数 = 模式串长度 + 1;
- 否则,模式串移动的位数 = 模式串长度 - 该字符在模式串中最右端出现的位置
下面举个例子说明下Sunday算法。假定现在要在文本串 “HERE IS A SIMPLE EXAMPLE” 中查找模式串 “EXAMPLE”。
刚开始时,把模式串与文本串左边对齐:
第一个字符 H 和 E 不匹配,文本串参与匹配的最后一位字符是 IS 的 S,其后的字符空格在模式串中并未出现过,所以模式串向右移动的位数 = 模式串长度 + 1 = 8
此时 A 与 E 不匹配,文本串参与匹配的最后一个字符的下一位是 SIMPLE 中的 E,E在模式串中出现的位置是 6,所以模式串向右移动的位数 = 模式串长度 - E 在模式串中最右端出现的位置 = 7 -1 =1;
空格与 E 不匹配,文本串参与匹配的最后一个字符的下一位是 SIMPLE 中后的空格,空格在模式串中未出现过,所以模式串向右移动的位数 = 模式串长度 + 1 = 8
匹配成功。
模式串只移动了三次模式串就找到了匹配位置,缘于Sunday算法每一步的移动量都比较大,效率很高。
Sunday 算法思想