主页 > 程序人生 > 用三叉树实现高效字符查找

用三叉树实现高效字符查找

终于把java的三叉树写出来了~激动!!!热泪~
虽然没有实现自平衡的三叉树,这个是按字母序列存储的,也算是三叉树里面最差的一种吧。。。
上代码~欢迎各位朋友指教~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package com.zerob13.TernaryTree;
/**
 *
 * @author yanglingfeng
 */
public class TernaryTree {
    private class Node {
        char m_char;
        Node left, right, middle;
        boolean end;
        public Node(char ch, boolean e) {
            m_char = ch;
            end = e;
        }
        public Node(char ch, boolean e, Node leftc, Node rightc, Node middlec) {
            m_char = ch;
            end = e;
            left = leftc;
            right = rightc;
            middle = middlec;
        }
    }
    private Node root;
    private int count;
    /**
     * 初始化三叉树
     */
    public TernaryTree() {
        clear();
    }
    /**
     * 清除三叉树
     */
    public final void clear() {
        root = null;
        count = 0;
    }
    /**
     * 插入一个字符串
     * @param s
     */
    public void insert(String s) {
        root = insert(root, s, 0);
    }
    /**
     * 返回三叉树大小
     * @return
     */
    public int size() {
        return count;
    }
    /**
     * 返回是否能够找到字符串s
     * @param s
     * @return boolean
     */
    public boolean contains(String s) {
        return search(root, s, 0) != null;
    }
    private Node search(Node ref, String s, int pos) {
        if (ref == null) {
            return null;
        } else {
            int cmp = s.charAt(pos) - ref.m_char;
            if (cmp < 0) {
                return search(ref.left, s, pos);
            } else if (cmp > 0) {
                return search(ref.right, s, pos);
            } else {
                if (1 + pos == s.length()) {
                    if (ref.end) {
                        return ref;
                    } else {
                        return null;
                    }
                }
                return search(ref.middle, s, pos + 1);
            }
        }
    }
    private Node insert(Node ref, String s, int i) {
        if (ref == null) {
            count++;
            ref = new Node(s.charAt(i), false);
        }
        int cmp = s.charAt(i) - ref.m_char;
        if (cmp < 0) {
            ref.left = insert(ref.left, s, i);
        } else if (cmp > 0) {
            ref.right = insert(ref.right, s, i);
        } else {
            if (i + 1 == s.length()) {
                ref.end = true;
            } else {
                ref.middle = insert(ref.middle, s, i + 1);
            }
        }
        return ref;
    }
}

相关日志

, , , , ,

评论:0

参与评论

发表评论

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

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:2

下面所列的是引用到本博客的链接
用三叉树实现高效字符查找 来自 混沌的云
pingback 来自 混沌的云 » Blog Archive » 对三叉搜索树的理解 2009/11/08

[...] 对于字符串的高效处理一般都是用字典树——Trie,或者ac自动机的。但是字典树对于大量数据的空间的开销相当大,特别我们的字典中不仅仅是26个字母组成的字符串时空间的损耗就会巨大无比。。。 三叉搜索树就是一种比较好的解决方法,我第一次看到的时候时在最近的《程序员》杂志上的一篇文章——《用三叉搜索树实现高效率的“自动完成”》,是一个.net大牛写的~于是我便对这个产生了兴趣,在折腾几天后,终于用java也写了一个很挫的三叉搜索树(见用三叉搜索树实现高效字符查找)。 其实所谓的三叉树就是舍去了Trie的多余的指针,而是把一个个树套在一起,每个节点压缩成三个方向。如果匹配的话就走中间方向的指针,如果不匹配,那么就走左或者右指针。选左选右则是这个数据结构优化的一个好地方,我用了字母顺序,文章作者说这个是最挫的方法。。。窘一个。。。好方法我还没有想到,因为不会写自平衡的树。。。杯具一个。。。 这里有一个例子,假如我们存入”AB”,”ABBA”.”ABCD”.”BCD”,这几个单词,那么三叉树就会出现如下的储存方式。。。 [...]

pingback 来自 The understanding of the search tree of trigeminal 2011/10/09

[...] a few days later, finally use Java also wrote a very amid the trigeminal search (see the treeWith trigeminal search tree efficient character search)。In fact the so-called trigeminal tree is abandoned Trie’s excess pointer, but one of the [...]

顶部