美文网首页
2019-03-31字典树Tire

2019-03-31字典树Tire

作者: Aluha_f289 | 来源:发表于2019-03-31 22:24 被阅读0次

    字典树图示

    Snipaste_2019-03-31_14-09-29.png

    字典树案例

    package trie;
    
    import java.util.TreeMap;
    
    /**
     * 字典树
     * 典型应用是用于统计,排序和保存大量的字符串(不仅限于字符串),经常被搜索引擎系统用于文本词频统计。
     * 基本性质1、根节点不包含字符,除根节点外的每一个子节点都包含一个字符
     * 2、从根节点到某一节点。路径上经过的字符连接起来,就是该节点对应的字符串
     * 3、每个节点的所有子节点包含的字符都不相同
     * 优点
     * 利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较,查询效率比哈希树高。
     */
    public class Trie {
        private class Node{
            public boolean isWord;
            public TreeMap<Character, Node> next;
    
            public Node(boolean isWord){
                this.isWord = isWord;
                next = new TreeMap<>();
            }
    
            public Node(){
                this(false);
            }
    
        }
    
        private Node root;
        private int size;
    
        public Trie(){
            root = new Node();
            size = 0;
        }
    
        // 获得Trie中存储的单词数量
        public int getSize(){
            return size;
        }
    
        // 向Trie中添加一个新的单词word
        public void add(String word){
    
            Node cur = root;
            for(int i = 0 ; i < word.length() ; i ++){
                char c = word.charAt(i);
                if(cur.next.get(c) == null)
                    cur.next.put(c, new Node());
                cur = cur.next.get(c);
            }
    
            if(!cur.isWord){
                cur.isWord = true;
                size ++;
            }
    
        }
    
        // 查询单词word是否在Trie中
        public boolean contains(String word){
    
            Node cur = root;
    
            for(int i = 0 ; i < word.length() ; i ++){
                char c = word.charAt(i);
                if(cur.next.get(c) == null)
                    return false;
                cur = cur.next.get(c);
            }
            return cur.isWord;
    
        }
    
        // 查询是否在Trie中有单词以prefix为前缀
        public boolean isPrefix(String prefix){
    
            Node cur = root;
            for (int i = 0; i < prefix.length(); i++){
                char c = prefix.charAt(i);
                if (cur.next.get(c) == null)
                    return false;
                cur = cur.next.get(c);
            }
            return true;
        }
    
        public static void main(String[] args) {
            Trie t = new Trie();
            t.add("pan");
            t.add("panda");
    
            boolean a = t.contains("pane");
    
            System.out.println(a);
        }
    
    
    }
    
    

    相关文章

      网友评论

          本文标题:2019-03-31字典树Tire

          本文链接:https://www.haomeiwen.com/subject/vudpbqtx.html