前缀树

简介: 前缀树是一个非常好用的数据结构,特别是针对求相同前缀字符串有多少个的时候。如图前缀树.jpg下面是前缀树的一些代码操作。public class TrieTree { //内部类 private class Tri...

前缀树是一个非常好用的数据结构,特别是针对求相同前缀字符串有多少个的时候。如图


img_4edbfe49cea3735b1e566ee16201bc84.jpe
前缀树.jpg

下面是前缀树的一些代码操作。

public class TrieTree {

    //内部类
    private class TrieNode{
        public int path;
        public int end;
        public TrieNode nexts[];

        public TrieNode(){
            this.path = 0;
            this.end = 0;
            this.nexts = new TrieNode[26];//这里假设是26个字母,如果有其他的情况,参照ascii表
        }
    }

    private TrieNode root;

    public TrieTree(){
        this.root = new TrieNode();
    }

    //插入操作
    public void insert(String word){
        if(word == null || word.length() == 0)
            return;
        char[] chs = word.toCharArray();
        TrieNode node = this.root;
        int index = 0;
        for(int i = 0; i < chs.length; i++){
            index = chs[i] - 'a';
            if(node.nexts[index] == null){
                node.nexts[index] = new TrieNode();
            }
            node = node.nexts[index];
            node.path++;
        }
        node.end++;
    }

    //查找操作
    public int search(String word){
        if(word == null || word.length() == 0)
            return 0;
        char[] chs = word.toCharArray();
        TrieNode node = this.root;
        int index = 0;
        for(int i = 0; i < chs.length; i++){
            index = chs[i] - 'a';
            if(node.nexts[index] == null){
                return 0;
            }
            node = node.nexts[index];
        }
        return node.end;
    }

    //删除操作
    public void delete(String word){
        if(search(word) != 0){
            char[] chs = word.toCharArray();
            TrieNode node = this.root;
            int index = 0;
            for(int i = 0; i < chs.length; i++){
                index = chs[i] - 'a';
                if(--node.nexts[index].path == 0){
                    node.nexts[index] = null;
                    return;
                }
                node = node.nexts[index];
            }
            node.end--;
        }
    }

    //判断前缀相同的字符串个数
    public int prefix(String prefix){
        if(prefix == null)
            return 0;
        char[] chs = prefix.toCharArray();
        TrieNode node = root;
        int index = 0;
        for(int i = 0; i < chs.length; i++){
            index = chs[i] - 'a';
            if(node.nexts[index] == null)
                return 0;
            node = node.nexts[index];
        }
        return node.path;
    }

    public static void main(String[] args) {
        TrieTree root = new TrieTree();
        root.insert("abc");
        root.insert("bdc");
        root.insert("abe");
        root.insert("abfg");
        System.out.println(root.prefix("ab"));
        root.delete("abe");
        System.out.println(root.prefix("ab"));
    }
}

目录
相关文章
|
6月前
|
搜索推荐
前缀树Trie
前缀树Trie
|
6月前
|
存储 C++
leetcode-208:实现 Trie (前缀树/字典树)
leetcode-208:实现 Trie (前缀树/字典树)
51 0
理解前缀树
理解前缀树
62 0
|
存储 机器学习/深度学习 算法
|
存储
前缀树
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
76 0
前缀树
|
机器学习/深度学习 存储 自然语言处理
Trie树
Trie树
106 0
|
存储 算法 Linux
秒懂算法 | 字典树
字典树是一种基础方法,请掌握字典树的静态数组存储方法,它在后缀树、回文树、AC自动机、后缀自动机中都要用到。
156 0
|
存储 自然语言处理 算法
字典树详解
字典树,顾名思义,是关于“字典”的一棵树。即:它是对于字典的一种存储方式(所以是一种数据结构而不是算法)。
169 0
字典树详解
|
Java C++
字典树(前缀树)
字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。
110 0
|
存储
【22. Trie树】
**用途** - 高效地存储和查找字符串集合的数据结构 **主要思想:** - 利用字符串的公共前缀来节约存储空间。很好地利用了串的公共前缀,节约了存储空间。字典树主要包含两种操作,插入和查找。
108 0
【22. Trie树】