中文trie树

这几天被汉字trie树小折腾了一下。

开始的时候想直接将单字节作为字典树的节点建树,虽然各个树的节点可能只是多字节字符的一部分,但是基本功能也能够支持。后来发现似乎有些问题,比如在做前向最大匹配分词的时候,对于未登录词无法确定当前字符是单字节还是多字节,如果通过编码规则进行判定的话倒也可以,但是跟建树过程南辕北辙。

然后想到了utf16字符编码对所有字符统一采用16位定长处理,这样的话只要对待处理字符串每两字节进行一次截取就能得到完整字符,当然树的节点也是这样有意义的完整字符。可是问题依然存在,fgets() 这种函数肯定用不了,因为utf16中充斥这各种值为0和a的字节,对于fgets()来说a就是行尾。linux中对宽字节字符处理函数经常莫名其妙罢工,例如fgetws()读取文件的时候总是直接返回NULL,各种不给力。。。

最后还是回到utf8,通过对utf8编码方式分析,utf8是一种变长编码方式,通过首字节即可判断出当前字符字节数。这样在建树时候就可以以字符作为节点,无论是单字节字符(ASCII)还是三字节字符(绝大多数汉字)都可以存入trie树中,在对字符串分析时同样可以轻松确定字符长度

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