「エントリから高度なデータ構造に楽しい」タイヤトライ

この記事では、ビデオチュートリアル「高度なデータ構造へのエントリから楽しい」のliuyuboboboから来ています

図は、トライトライです

1、辞書ツリーは、複数の木であります

図2に示すように、辞書トライノード構造ストレージ関係と子ノードを使用してノードが(Javaはマップと呼ばれます)。

3、経路探索に沿ってルート・ノードは、格納された単語トライ{「猫」、「犬」、「鹿」、「パナーダ」}これらの単語に見出すことができます。そしてインサートは、効率のクエリ文字列は、文字列のみの長さに関係しています。

問題は、図2に、もちろんあります。、の図を参照してください。

トライ実装コード

// 字典树
public class Trie {

    // 字典树中的节点
    private class Node{
        // 判断当前节点是否为字符串最后一个字符
        public boolean isWord;
        // 使用TreeMap存储当前节点与子节点的关系
        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;
    }

    public int getSize(){
        return size;
    }

    // 查找操作
    public boolean contains(String word){
        Node cur = root;
        // 循环字符串,将字符添加到字典树中
        for (int i=0; i<word.length(); i++){
            char c = word.charAt(i);
            // 未找到字符串中的某字符,返回false
            if (cur.next.get(c) == null)
                return false;
            cur = cur.next.get(c);
        }

        /**
         * 在字典树中存在查找的字符串word,查找到最后一个字符
         * 若此节点字符结束标识是true,则字典树包含此字符串,返回true,否则返回false
         */
        return cur.isWord;
    }

    // 添加操作
    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);
        }

        // 新增的字符串在树中不存在,设置当前node为字符串word的最后一个字符节点
        // 树的size加1
        if (!cur.isWord){
            cur.isWord = true;
            size++;
        }
    }

    // 前缀搜索
    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) {
        ArrayList<String> wordList = new ArrayList<>();
        wordList.add("first");
        wordList.add("second");
        wordList.add("third");
        wordList.add("different");
        wordList.add("words");

        Trie trie = new Trie();
        for (String word: wordList){
            trie.add(word);
        }
        for (String word: wordList){
            System.out.println(trie.contains(word));
        }
        System.out.println(trie.contains("no-in"));
    }

}

 

 

公開された51元の記事 ウォン称賛14 ビュー40000 +

おすすめ

転載: blog.csdn.net/u010606397/article/details/99301950