Trie:字典树

如何实现搜索引擎的搜索关键词提示功能?

Trie树,字典树。是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。

字典树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。

其中,根节点不包含任何信息。每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串

 

package day0623;
/**
 * 字典树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起
 * 如果要在一组字符串中,频繁地查询某些字符串,用Trie树会非常高效
 * 构建Trie树的过程,需要扫描所有的字符串,时间复杂度是O(n)
 * 查询时间复杂度O(k),k是要查找的字符串的长度*/
public class Trie {
    private TrieNode root = new TrieNode('/');
    // 根节点存储无意义字符

    // 往Trie树中插入一个字符串
    public void insert(char[] text) {
        TrieNode p = root;
        for (int i = 0; i < text.length; ++i) {
            int index = text[i] - 'a';
            if (p.children[index] == null) {
                TrieNode newNode = new TrieNode(text[i]);
                p.children[index] = newNode;
            }
            p = p.children[index];
        }
        p.isEndingChar = true;
    }

    // 在Trie树中查找一个字符串
    // 查找的时候可以通过字符的ASCII码减去‘a’的ASCII码,迅速找到匹配的子节点的指针
    public boolean find(char[] pattern) {
        TrieNode p = root;
        for (int i = 0; i < pattern.length; ++i) {
            int index = pattern[i] - 'a';
            if (p.children[index] == null) {
                return false; // 不存在pattern
            }
            p = p.children[index];
        }
        if (p.isEndingChar == false) return false; // 不能完全匹配,只是前缀
        else return true; // 找到pattern
    }

    //假设字符串中只有从a到z这26个小写字母,下标为0的位置存储指向子节点a的指针,依次类推
    public class TrieNode {
        public char data;
        public TrieNode[] children = new TrieNode[26];
        public boolean isEndingChar = false;
        public TrieNode(char data) {
            this.data = data;
        }
    }
}

 

你可能感兴趣的:(Trie:字典树)