正统介绍请移步百度或其他博客。都比我讨论的好。
Trie和Double Array Trie(DAT)的比较。
Trie有两种数据结构:
1.数组或hash链式:
介绍:兄弟节点使用数组或者hash存储,儿子节点使用指针存储。
优点:1. 便于查找,能快速定位兄弟节点中是否有该值,然后跳到该值的儿子hash或者数组中查找。
2. 插入快速。
缺点:空表中仅插入aa时,就要创建一个26+26的数组或者两个hash表。
2. 链式trie树:
介绍:儿子节点和父亲节点的关系用链表维护,兄弟节点也用链表维护。
优点:1. 便于插入。
缺点:1. 兄弟节点不好找。汉字的话可能会遍历3w多个汉字。
2. 大数据情况下,会保存多个指针域,浪费空间。
DAT:
数据结构:采用base和check两个数组来保存。base保存是否成词(-base),是否是叶子节点(-i),是否是普通非叶子节点和位置(普通数值)。check数组表示该词的上一个词是否正确。
数据结构要点:该结构主要使用base[i] + next.acsii = base[next], then check[next] ?= base[i];两步,第一步算下一个节点的位置。第二部check下一个节点是不是由上一个节点推出来的。
注意:每一层的节点必须按从小到大的顺序排列。
双数组数据结构比trie数据结构主要节省空间在1的hash上或者是2的指针域上两点。很稳定。DAT很可能也有空隙,但应该比hash的空隙要小。
注:仅分析,未时间。如有不明了或者写错之处。请大家务必提出!