【数据结构】--- 字典树

本文深入探讨了字典树(Trie树)这一数据结构,详细解释了其定义、工作原理及优缺点。通过实例展示了如何用Java实现字典树,并分析了查找操作的时间复杂度。此外,还提到了字典树在中日韩文等场景下的局限性以及解决方案——双数组Trie树。
摘要由CSDN通过智能技术生成


💖前言

上一篇文章:【数据结构】–二叉树,红黑树


🎄字典树

🏆定义

字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),查找搜索引擎中用于分词,词频分析,自动补全机制…

查找效率高:核心是利用公共前缀减少查询时间
在这里插入图片描述

在这里插入图片描述

☀️图例介绍

上面这棵Trie树包含的字符串集合是{in, inn, int, tea, ten, to}。树中的每一条边上都标识有一个字符。这些字符可以是任意一个字符集中的字符。比如对于都是小写字母的字符串,字符集就是’a’-‘z’;对于都是数字的字符串,字符集就是’0’-‘9’;对于二进制字符串,字符集就是0和1。

在这里插入图片描述

  • 比如上图中框住节点的路径字符串是inn,

在这里插入图片描述

  • 上图中框住节点的路径字符串是ten。
    终结点与集合中的字符串是一一对应的。

⭐️代码实现字典树

/**
 * @author: guochao.bj@fang.com
 * @createDate: 2022/2/5 18:03
 */
class TreeNode{

    char data;      //当前节点的字母
    boolean isEnd=false;         //是否为叶子节点
    TreeNode[] childs;  //子节点

    public TreeNode(){
        childs=new TreeNode[26];
        isEnd=false;
    }
}
public class Test {
    /**
     * 创建字典树
     * @param node
     * @param str
     * @return void
     * @author guochao.bj@fang.com
     * @date 2022/2/5
     */
    public static void creatTireTree(TreeNode node,String str){    //单词小写
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            int i1 = chars[i] - 'a'; //字符转0~25的数字 使用ascII 值

            if (node.childs[i1]==null){
                node.childs[i1]= new TreeNode();
                node.childs[i1].data=chars[i];
            }
            node=node.childs[i1];   //切换跟节点

        }
        node.isEnd=true;
    }

    /**
     * 字典树查找
     * @param str
     * @param node
     * @return boolean
     * @author guochao.bj@fang.com
     * @date 2022/2/5
     */
    public static boolean find(String str,TreeNode node){
        char[] chars = str.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            int i1 = chars[i] - 'a'; //字符转0~25的数字 使用ascII 值
            if (node.childs[i1]!=null){
                node=node.childs[i1];   //切换节点
            }else {
                return false;
            }
        }
        return node.isEnd;
    }

    public static void main(String[] args) {
        String[] aa={"java","sql","php","ps","js"};
        TreeNode root = new TreeNode();
        for (String s : aa) {
            creatTireTree(root,s);
        }
        System.out.println("创建完成");
        System.out.println(find("java",root));
        System.out.println(find("jav",root));

    }

}

🔥字典树分析

查找时间复杂度为:O(N)

内存分析:内存消耗大,26的次方;

纯字典树不适合中日韩文,不适合IK分词。如果要使用需要使用字典树变种:双数组Tire树;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abner G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值