✅什么是前缀树,有什么作用?

✅什么是前缀树,有什么作用?

典型回答

前缀树(Trie,又称字典树或键树)是一种树形结构,它是一种用于快速检索字符串集合中字符串的高效数据结构。前缀树的每个节点代表一个字符串(或字符串的一部分),从根节点到某一节点的路径上经过的字符连接起来,就是该节点对应的字符串。

前缀树的特点

  • 根节点不包含字符,除根节点外的每个节点都只包含一个字符。
  • 从根节点到某一节点的路径上经过的字符连接起来,为该节点对应的字符串。
  • 每个节点的所有子节点包含的字符都不相同。

举个例子:有以下字符串:

abc,bac,bbc,ca,

通过字典树形成的结构如下所示:

从上图我们可以看出,通过字典树,在查询的时候,原来的时间复杂度是O(n*m),优化后的时间复杂度就会变成O(m)。同时,如果有很多字符串,字典树还可以大大减少存储的空间。

字典树的java实现如下所示:

class Trie {

    private Trie[] children;

    private boolean isWord;

    public Trie() {
        this.isWord = false;
        this.children = new Trie[26];
    }
    
    public void insert(String word) {
        Trie next = this;
        for(char c : word.toCharArray()) {
            if(next.children[c - 'a'] == null) {
                next.children[c - 'a'] = new Trie();
            }
            next = next.children[c - 'a'];
        }
        next.isWord = true;
    }
    
    public boolean search(String word) {
        Trie next = this;
        for(char c : word.toCharArray()) {
            if(next.children[c - 'a'] == null) {
                return false;
            }
            next = next.children[c - 'a'];
        }
        return next.isWord;
    }
    
    public boolean startsWith(String prefix) {
        Trie next = this;
        for(char c : prefix.toCharArray()) {
            if(next.children[c - 'a'] == null) {
                return false;
            }
            next = next.children[c - 'a'];
        }
        return true;
    }
}

知识扩展

前缀树有哪些应用?

字符串检索

给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。

字符串最长公共前缀

给出N 个小写英文字母串,以及Q 个询问,即询问某两个串的最长公共前缀的长度是多少?

排序

Trie树是一棵多叉树,只要先序遍历整棵树,输出相应的字符串便是按字典序排序的结果。比如给你N 个互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出。

作为其他数据结构和算法的辅助结构

如后缀树,AC自动机等

词频统计

trie树在这里的应用类似哈夫曼树,比如词频统计使用哈希表或者堆都可以,但是如果内存有限,就可以用trie树来压缩空间,因为trie树的公共前缀都是用一个节点保存的。

字符串搜索的前缀匹配

trie树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。