模拟Trie树结构

简介: 模拟Trie树结构

Trie树的概念


Trie树是数据结构比较简单的一种。Trie 树的基本用法是高效的存储和查找字符串集合的数据结构。Trie树也叫做字典树,它是一个树形结构。是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串。Trie树本质,利用字符串之间的公共前缀,将重复的前缀合并在一起。


例如:


插入


abcdef


abdef


aced


bcdf


bcff


cdaa


bcdc


abc


1.首先插入abcdef


先判断根节点有没有a这个点作为子节点,没有就创建出来,以此类推,再从a往下走,判断a有没有b这个子节点,没有就创建出来,以此类推,把剩下的插入进来,(存的时候会在结尾的单词后面打上一个标记,表示在这个字母结尾是有一个的单词的)如图:



2.依次插入其他


最终结果


模板:


    static int N=100010;
    static int [][]son=new int[N][26];  //son[][]存储树中每个节点的子节点
    static int []cnt=new int[N];        //记录以每个结点结尾的单词数量
    static int idx;         //当前用的的哪个下标,下标0:既是根节点又是空节点
    //插入操作
    public static void insert(char []str){
        int p=0;//根节点
        for (int i = 0; i < str.length; i++) {//从根节点开始依次遍历
            int x=str[i]-'a';//把当前这个节点的下标取出来
            //如果当前这个点上不存在对应的字母的话,创建出来
            if(son[p][x]==0){
              son[p][x]=++idx;
            }
            //走到下一个点,p可以理解为父节点
            p=son[p][x];
        }
        cnt[p]++; //记录下这个单词出现次数
    }
    //查询操作
   public static int query(char []str){
       int p=0;
       for (int i = 0; i < str.length; i++) {
           int x=str[i]-'a';
           //如果不存在这个子节点的话,说明集合中不存在这个单词
           if(son[p][x]==0) return 0;
           p=son[p][x];
       }
       return cnt[p];
   }


相关文章
|
3月前
|
存储 JavaScript 算法
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
42 0
|
10月前
|
存储 测试技术
模拟实现链式二叉树及其结构学习——【数据结构】
模拟实现链式二叉树及其结构学习——【数据结构】
35 0
|
2月前
|
算法 搜索推荐
数据结构和算法——表排序(算法概述、物理排序、复杂度分析,包含详细清晰图示过程)
数据结构和算法——表排序(算法概述、物理排序、复杂度分析,包含详细清晰图示过程)
22 0
|
3月前
|
JSON 前端开发 Java
|
3月前
|
算法 Java
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!
1567 0
|
存储 算法
【数据结构和算法】图的各类概念与图的存储结构(还有十字链表与邻接多重表的介绍)
【数据结构和算法】图的各类概念与图的存储结构(还有十字链表与邻接多重表的介绍)
214 0
【数据结构和算法】图的各类概念与图的存储结构(还有十字链表与邻接多重表的介绍)
|
存储 算法 数据可视化
关于B+树的介绍、用途和c++代码实现
关于B+树的介绍、用途和c++代码实现
|
存储 算法
【数据结构oj】树的度(树和二叉树的相互转化)
【数据结构oj】树的度(树和二叉树的相互转化)
49 0
|
存储
【数据结构】从零开始逐步实现带哨兵位循环双向链表 | 学会用 “思路草图“ 将思路转变成代码
本章节将继续讲解链表,在上一章节中我们学习了单链表,本章将对其他的链表进行简要介绍,旨在让读者理解单链表和双链表各自存在的意义。将着重讲解带哨兵位双向循环链表,对常用的接口函数进行逐个讲解,本章开始引入可以将思路轻松转换成代码的 &quot;思路草图&quot; 方法。站在初学者的角度上进行讲解和分析。通过本章的学习,还能够帮助大家理解解 &quot;代码复用&quot; 的意义。
119 0
【数据结构】从零开始逐步实现带哨兵位循环双向链表 | 学会用 “思路草图“ 将思路转变成代码
|
存储 Java Linux
C++ 第八节&数据结构 第七节 ——二叉搜索树 AVL树 红黑树(底层原理图+模拟实现)
每一个关键码key,都有与之对应的值Value,即&lt;Key, Value&gt;的键值对。该种方式在现实生活中非常常见:比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文&lt;word, chinese&gt;就构成一种键值对;
212 0
C++ 第八节&数据结构 第七节 ——二叉搜索树 AVL树 红黑树(底层原理图+模拟实现)