add by zhj: 在学习Lucene的存储结构时,看到其使用了FST,这篇文章写的不错。
trie,FSA,FST都是用来解决有限状态机的存储,trie是树,它进一步演化为FSA和FST,这两者是图
该文的原标题是“使用自动机来索引1,600,000,000个键”,我改了一下,原标题其实是
说这三类数据结构的使用场景。
有限状态机(FSM, finite state machine)可以用来紧密地存储有序集合和有序键值对,并且可以实现快速搜索。本文中,我会表明怎样用FSM来作为数据结构存储这样的数据。
FSM作为数据结构
FSM是一个状态的集合和状态转移的集合。一个起始状态,0个或多个结束状态。一个FSM在同一时间只有一个状态。
FSM非常常见,并且可以用来描述一系列过程。比如我家猫咪Cauchy一天的日常生活:
里面有一些”asleep”或者”eating”的状态,一些转移”food is served”, “something moved”。这里没有结束状态,如果结束了,那真是太恐怖了!
FSM近似的表达了现实中的情况。Cauchy不可能同时吃饭和睡觉,这跟FSM中同一时刻只有一个状态是一样的。并且,从一个状态转移到另一个状态需要外部环境的一个输出。需要睡觉,可能是因为”吃饱了”, “累了”等等。不管他睡得多死,”听到外面的声音”,它总会醒过来。
有序集合
有序集合里的键按照字典序排序。典型的应用是二叉查找树和B树。无序集合,典型应用就是哈希表。这里,我们先描述一个确定无环有限状态接收器(deterministic acyclic finite state acceptor),即FSA。
一个FSA需要满足以下条件:
确定性的。给定已给输入,最多只能转移到一个状态。
无环的。不能反序遍历。
接收器。FSA可以接收一系列特定的输入。
那么,怎么用这些特性来表示一个集合呢。诀窍在于,key作为FSA的状态转移。这样,给定一个输入key,我们可以知道这个key这个key是否在FSA中。
假设一个集合,只有一个key”jul”。FSA就像下面这样:</