简介
双数组字典树由日本人Jun-Ichi Aoe在1989年提出,它由base和check两个数组组成,状态转移的复杂度为常数。这两个数组里面存在的内容为链接数组的下标,但是为了节约空间,在数据定义以及存储上各有千秋,除非看最原始的实现方式,否则各个博客中或者教程中的版本各有那么一点的不同,而本节就是其中的一种方式。
双数组的定义
原始的双数组定义如下:
p = base[b] + c
check[p] = base[b]
需要注意的是,这两个步骤都是赋值操作,里面涉及到的参数为b、c和base[b]的取值(这两步式子可以合为check[ base[b] + c ] = base[b]。其次,c通常也是定的,一般用符对应这的hash码。所以这里面的变量只有base[b]和b的值待定,这也就成了构建双数组数的关键。
那么问题来了,这两个值是随便定义的吗,这个~,应该说视情况而定比较合适,不同的思路执行方式不同。在我们这里,base[b]的值分两种情况,如果是字符串结尾,则设定,如果不是字符串结尾,则自己指定(但要满足一定的条件)。b的值由check数组产生。这个地方比较难描述,如果看到这一段如果比较懵,先看一下下一节 双数组树的构建
双数组树的构建
这里借鉴hanlp的双数组树的构建方法,其主体流程为:
- 定义根节点。
为根节点分配下标0,初始化 base[0]=1; check[0]=0; 这俩个可以随便定义,看个人喜好。以根节点为最初的父节点开始深度优先遍历,每一层的兄弟节点按照字符的散列值升序排列。
比如:“lie”、“人民”、“浙江”、“民生”,“like”