最近看到 mysql 文档说他字符串搜索用不用索引的问题
"select * where id like abc%"
如果是开头不为通配符并且查询这一段有索引的则大部分情况下会走索引进行查询,找出在 abc < x < abd 区间的内容
"select * where id like %abc%"
如果是 开头为通配符的则会用 Boyer-Moore 算法去进行搜索
回想之前在不同地方读过的字符串搜索算法,在这里做一个记录总结
# 我们以目标文本:
text = "xabcxabzabcxabc"
# 被搜索的文本:
target = "abcxabc"
# 为例
逐字匹配
对于每个在 text 里的文本,往后检索看 “abc” 是否匹配,比如:
def match(text, target):
for index in range(len(text)):
matched = False
for target_index in range(len(target)):
if target[target_index] != text[index + target_index]:
# 往后搜索到其中一个字符不等于目标字符,结束,index 后移
matched = True
break
if matched:
# 每一个 target_index 都与 index+target_index 对应,搜索到了结果
return index
return -1
算法的时间复杂度是 O(len(text) * len(target))
KMP
我理解的 KMP 算法就是当每次匹配失败时,找出最近一个和当前的后缀相同的地方,从那个位置开始匹配,而不是从头匹配
我们用 | 表示当前字符串的光标位置
# 开始搜索
i: |
xabcxabzabcxabc
j: |
abcxabc
# x 和 a