在字符串中搜索关键字:关于“失败函数”的问题

时间:2009-04-27 09:15:34

标签: parsing compiler-construction

我对“编译器:原理,技术和工具”(即DragonBook)中的失败功能描述有疑问

首先,引用:

  

为了快速处理文本字符串并在字符串中搜索关键字,   为关键字b 1 b 2 ... b n 定义,并在该关键字中定位s,失败函数, f(s)......    目标是b 1 b 2 .. - b f(s)是最长的正确前缀   b 1 ... b s ,也是b 1 ... b s 的后缀。 f(s)重要的原因是   如果我们试图匹配b l b 2 .. b n 的文本字符串,我们已匹配   第一个位置,但我们失败(即文本字符串的下一个位置   不能保持b s + l ),那么f(s)是b 1 ... b n 中最长的前缀   匹配文本字符串直到我们所处的位置。当然,下一个字符   文本字符串必须是b f(s)+1 ,否则我们仍然有问题,必须考虑   一个更短的前缀,它将是b f(f(s))

所以,问题:
1.如果我们将s位置与文本匹配,为什么f(s)是b 1 最长前缀.. b n 匹配字符串?我认为s - 是最长的前缀 2.文本字符串的下一个字符必须是b f(s)+1 ,为什么?我们在这个位置上存在不匹配的问题,这根本不重要吗?

1 个答案:

答案 0 :(得分:2)

f(s)是该位置的最长前缀,可能与整个关键字匹配。我们的想法不是尝试将关键字与开头的文本进行匹配,而是要找到关键字出现的位置。

考虑在“aaaabaa”文本中搜索“aaaba”一词。在三个第一个a之后匹配失败,但是没有必要从第二个'a'重试,因为我们知道如果下一个字母是'b'(它是),我们可能在那里匹配。