谁能用简单的话解释一下 levenshtein 自动机的想法和基本功能?
确定性有限自动机 (DFA) 是
- 一个字母表(一组可能的输入字符)
- 一组状态(只是没有特殊属性的抽象对象)
- 一个转换函数(给定任何状态和一个输入字符,它会返回一个唯一的状态)
- 杰出的开始状态
- 一组接受状态。
您可以像论文中的那样将 DFA 绘制为图表。按照惯例,圆形节点是状态。每个标记有一个字符的有向边是过渡。接受状态被标记为双线圆圈。起始状态有一个向内指向的箭头,其尾部没有任何内容。
当且仅当您可以将标记从起始状态沿着连接标签等于 W 的转换移动到接受状态时,DFA 才接受单词 W。也就是说,如果 T 是转移函数,并且 W = "cat",那么 T(T(T(Start, 'c'), 'a'), 't') 必须是接受状态。转换函数中的循环允许 DFA 接受任意长度的字符串,即使 DFA 是有限的。
在软件中,DFA 是一个简单的循环和一个实现转换函数的表 T(state, char)。
current_state = START
while not end-of-input
c = get character from input
current_state = T(current_state, c)
end
if current_state is an accepting state return ACCEPT, else REJECT
The Wikipedia page on DFAs还不错。
DFA 具有很好的特性。接受/拒绝长度为 N 的输入需要 O(N) 时间(只要转换函数在恒定时间内运行)。每个 DFA 都有一个唯一的最小版本(在所有接受同一组词的人中)和一个找到该最小 DFA 的有效算法。很容易比较 DFA 在 DFA 大小上的时间线性相等性。
A Levenshtein Automaton L(W, d) for word W and Levenshtein distance d 只是一个 DFA,它接受 所有 与 W 之间的 Levenshtein 距离最多为 d 的单词。也就是说,自动机接受 W再加上一堆其他的 W 词,在通常意义上的 Levenshtein 距离中,“错误”不超过 d。
这篇论文的贡献是一种用于计算 Levenshtein DFA 的快速算法,然后是一种更高级的算法,它可以在不显式计算 DFA 的情况下完成同样的事情。