读 双数组Trie树算法优化

以前,做过一个翻译的程序,处理的只是英文字符,当时做的,构造了一个26叉树(26个英文字母,每一个字母对应一个树结果),当时也不知道这对应的数据结构术语是什么? 后来一个巧合的机会知道了Trie树数据结构,发现我以前做的那个26叉树不就是一个Trie树吗?其实对英文字符来说,构造一个26叉树也行,占用的空间也不是很大。但是针对汉语词典(6763个常用汉字),这个就有问题了,需要一个好的对Trie树的实现方式。这样,双数组Trie树就随之产生了,这个实现方式,构造两个数组,base[], check[]数组。base数组的每个元素对应一个Trie树的节点,他的值作为状态转移的基值,check数组记录校验值,检验状态的存在性。汉字的编码如GB2312编码,采用区位码,两个字节。汉字的偏移序列码可以采用这个汉字在GB2312编码表中汉字的序列号。

整个算法过程,分两步:(1)构造base,check数组;(2)搜索。

具体情况可以参考中科院张华平的《双数组Trie树算法优化及其应用研究》,里面关于base,check数组构造说的很清楚,这个得好好看看,那个搜索环节很简单。我的一个疑惑:算法里面没有提及好的解决冲突方法,算法的言下之意就是经过优化后,冲突似乎可以避免了? 这个不切实际吧! 当数据量很少的时候,他这个算法的确能做到,但是一旦数据量很大的话,他如何保证,当前节点的所有子节点都能在base中找到空位置? 即使能找到,设定这个当前节点的base值也得花很长时间。

个人觉得,还个算法还是有不足的地方,需要完善,比如冲突如何解决?

 

    原文作者:Trie树
    原文地址: https://blog.csdn.net/hero_fantao/article/details/7576123
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注