FST结构 (解决Trie前缀树 后边不能复用的问题)

能力有限看图理解把。以下的图值得反复琢磨

常用的字典的数据结构

hashmap    skip list      Trie前缀树    FST

Trie前缀树

Trie:相邻有序的term更又可能具有相同的前缀值,那么通过前缀存储就可以节省存储空间

FST结构 (解决Trie前缀树 后边不能复用的问题)_第1张图片

但是你会发现后缀也重复,但是前缀树无法满足后缀也复用

FST 有限状态转换器  (编译原理学过的)

FSM(Finite State Machines)有限状态机: 表示有限个状态集合以及这些状态之间转移和动作的数学模型。其中一个状态被标记为开始状态,0个或更多的状态被标记为final状态

FSA:有限状态接收机

这样输入最后一个就变成了这样

FST结构 (解决Trie前缀树 后边不能复用的问题)_第2张图片
确定性:在任何给定状态下,对于任何输入,最多只能遍历一个transtion
非循环:不可能重复遍历同一个状态
Final唯一性:当且仅当有限状态机在输入序列的末尾处于最终状态时,才接受特定的输入序列
以上例子,如果输入‘wl’会怎样?其实就是可以搜索到的了。因为l指向的节点3已经是final节点了。为解决这样的问题,引出FST

FST简述及它的查询过程

FST:有限状态转化机


FST最重要的功能是可以实现key到value的映射,相当于HashMap。FST的查询速度比hashMap慢一点,但是内存消耗比hashMap小很多。FST在lucene大量使用:倒排索引的存储,同义词词典的存储,搜索关键字建议等等。
对于es来说,它是基于lucence开发,底层的数据结构使用的就是fst,它的主要优点:

    查询快
    极致压缩空间占用
    特性:
    确定性:在任何给定状态下,对于任何输入,最多只能遍历一个transtion
    非循环:不可能重复遍历同一个状态
    transducer: 转化器有相关的值(payload),final节点会输出一个值
    比起前面的前缀树以及FSA,在存储的时候多了一个value值。
    考虑以下输入字符:
 

FST结构 (解决Trie前缀树 后边不能复用的问题)_第3张图片

后边那个其实就是他的出度。

FST结构 (解决Trie前缀树 后边不能复用的问题)_第4张图片

FST结构 (解决Trie前缀树 后边不能复用的问题)_第5张图片

 看上边那个过程 ,当你的出度满足你所需的出度的时候才算匹配成功。就比如wi去匹配的时候就匹配不到了。 我们加了一个value 和Finaloutput

能力有限看图理解把。以上的图值得反复琢磨

你可能感兴趣的:(es,java,开发语言)