平衡搜索三叉树

三叉树,这种数据结构在上世界60年代就有,但没有二叉树那样广为人知。
   
三叉树的结构(左子树,中子树,右子树,索引,元素)
   
三叉树主要应用于字符串,数据串作为索引来查找,N年前Jon L. Bentley,Robert Sedgewick发表了篇名叫Fast Algorithms for Sorting and Searching Strings的论文,讲述三叉树的应用。

哥看了后发现论文提到的三叉树,相当trie树更加剩空间,而且搜索时间可观,而且不限于任何字符编码,如果trie树的话中文就蛋疼死了。这篇论文及其测试源代码在OPENPROJECT上有下载。

使用三叉树的好处在于,可以快速搜索,在没有对应元素的时候能快速退出,并且能很好的实现字符串纠错,补全等功能。

相信很多人都懒的看英文的论文。哥就简单说下三叉树的生成规则。

三叉树生成规则:

以字符串为例,三叉树会以单个字符为节点进行插入,同一字符串的字符节点会挂载中间节点(必须),字符插入按二叉树的插入规则

例子:索引字符串有ABCDE,ABEDC,BCD,生成三叉树如下

ABEDC与ABCDE有相同的字符AB,所以前面一直都是走中间路线,到了C后根据二叉树的插入规则插入,后面的节点继续按中间路线走。

        A
        |  \
        B     B
        |      |
        C     C
        | \    |
        D  E D
        |  |
        E  D
           |
           C

搜索复杂度在论文上有论述,在没做平衡处理的情况下,搜索复杂度受插入字符串顺序应用大,在最坏的情况下是  M' * N, M'是平均字符串长度,N是字符串集合大小。

所以平衡处理三叉树是必须的,平衡方式很简单,下面用AVL树与三叉树合体的例子说明下,AVL树只用三叉树的左右节点进行高度计算。中间节点不影响高度变化,由于三叉树的节点含有数据空间位置的信息,所以在翻转过程中,一般除了翻转子树的根节点,其他节点不会对三叉树节点的中间节点进行修改。

经过平衡处理后三叉树最坏情况下的搜索复杂度是 lg2(k)*m,最好的情况下是m,k是字符集大小,m是字符串长度。

ALV二叉树与三叉树合体的平衡三叉树代码参见啄木鸟图形框架的数据结构模板库。

 http://www.oschina.net/code/snippet_253717_14018 

转载于:https://my.oschina.net/u/253717/blog/79881

你可能感兴趣的:(平衡搜索三叉树)