java字典树(前缀树) - Kaiqisan

2023-11-14

大家好,都吃晚饭了吗?我是Kaiqisan,是一个已经走出社恐的一般生徒,这一篇文章咱来讲讲字典树把,之前在给别人代答辩数据结构的时候初次了解到这个概念,今天在刷算法课的时候右看到了,所以就有了这个视频

首先还是明确一个概念,什么是字典树?

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
------------------------------- 以上内容来自百度百科 https://baike.baidu.com/item/%E5%AD%97%E5%85%B8%E6%A0%91/9825209?fr=aladdin
在这里插入图片描述
以上图文来自网络

查找树最大的功能如其名,可以查找一个单词是否存在以及其出现的频次,比如一个单词zen,就使用上面的树来查找,就一个一个单词的去比对,从根节点出发查看所有的子节点,康康有没有第一个字符的节点,如果没有,就没找到,如果找到了就到这个子节点的子节点,接着匹配第二个字符。

在这里插入图片描述

接下来,我们就来用代码实现它的增删改查吧!

这个字典序只是考虑了所有小写的字符

class dictionaryTree {
    public int path;
    public int end;
    public dictionaryTree[] nexts;

    public dictionaryTree() {
        path = 0;
        end = 0;
        nexts = new dictionaryTree[26];
        // 在生成一个节点的时候再生成其26个字母的指针,一开始因为什么都没有,就全部指向null
        Arrays.fill(nexts, null);
    }

	// 录入单词
    public void insert(String word) {
        if (word == null) {
            return;
        }
        char[] arr = word.toCharArray();
        dictionaryTree node = this; // this表示根节点

        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            index = arr[i] - 'a'; // 找到和字母a的ascii编码的偏差
            if (node.nexts[index] == null) {
                node.nexts[index] = new dictionaryTree(); // 给个指针
            }
            node = node.nexts[index];
            node.path++;
        }
        node.end++;
    }

	// 查找单词
    public boolean search(String word) {
        if (word == null) {
            return false;
        }
        char[] arr = word.toCharArray();
        int index = 0;
        dictionaryTree node = this;
        for (int i = 0; i < arr.length; i++) {
            index = arr[i] - 'a';
            if (node.nexts[index] == null) { // 走到思路,找不到了
                return false;
            }
            node = node.nexts[index];
        }
        // 如果到底了,判断end是否为0,如果为0,这个单词不存在,反之就是存在
        return node.end > 0;
    }
	
	// 删除单词
    public boolean delete(String word) {
    	// 删除一个单词的前提是这个单词存在
        if (search(word)) {
            char[] arr = word.toCharArray();
            dictionaryTree node = this;
            int index = 0;

            for (int i = 0; i < arr.length; i++) {
                index = arr[i] - 'a';
                if (--node.nexts[index].path == 0) {
                	// 如果path为0了表示这个节点没用了,需要抛弃
                    node.nexts[index] = null;
                    return true;
                }
                node = node.nexts[index];
            }
            node.end--;
            return true;
        } else {
            return false;
        }
    }
}

属性讲解:end表示有多少单词在此处结尾 path表示有多少单词在拼写的过程中经过这里,可以把它们当做停靠站和终点站。

end是防止在找单词的时候出现错找,如果没有end的话,我们遍历树的时候只能通过有没有走到死路(指针指向null)来判断。假如我们往字典树录入一个单词apple,然后找单词app照理来说它不会被找到,但如果我们通过上面的方法的话,树遍历没有走死胡同,就会被误判为可以找到,就会返回错误的结果,

如果我们使用end来判断一个单词的结尾,假如我们录入单词apple,我们只有最后一个单词e所在节点的end值为1,所以我们再一次搜索单词app,在最后一个单词p所在的节点的end属性为0,所以没有单词app

path用处比end小,起到一个辅助的作用,一个用处是用来统计有多少单词是以xxx开头的,另一个左右是用来节省空间的,在删除节点的时候,如果某个节点的path值变为0了,就表示有0个单词以xxx开头了,所以这个节点是没用的,就让其父节点放开这个孩子,从而被垃圾回收。

剩下的其他细节看注释

总结

如果您的单词包含除了小写字符意外的字符的话建议把上面的数组的length扩张到256,涵盖所有的字符。或者您也可以自己编写ArrayList来更加灵活地增删节点!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java字典树(前缀树) - Kaiqisan 的相关文章

随机推荐

  • 前端系列之jQuery(jQuery选择的艺术)

    一 jQuery是什么 是一款JavaScript库 方便地处理HTML 事件 动画等 html 处理HTML文档中的DOM节点 如添加 删除等 事件 通过jQuery对页面上的事件进行处理 动画 通过jQuery实现淡入 淡出 滑动等动画
  • node中文件的上传与下载

    一 node基于Express项目实现文件的上传 1 FormData对象 以对象的方式来表示页面中的表单 又称为表单对象 以key value的方式来保存数据 XMLHttpRequest对象可以轻松的表单对象发送的服务器端 1 使用构造
  • HJ9 提取不重复的整数

    描述 输入一个 int 型整数 按照从右向左的阅读顺序 返回一个不含重复数字的新的整数 保证输入的整数最后一位不是 0 数据范围 1 n 10 8 输入描述 输入一个int型整数 输出描述 按照从右向左的阅读顺序 返回一个不含重复数字的新的
  • 理解virt res shr之间的关系 - linux

    转自 https www orchome com 298 想必在linux上写过程序的同学都有分析进程占用多少内存的经历 或者被问到这样的问题 你的程序在运行时占用了多少内存 物理内存 通常我们可以通过top命令查看进程占用了多少内存 这里
  • Kafka权威指南

    第一章 初识Kafka kafka是一款发布订阅的消息系统 具体结构从大向下可以列举为 1个Kafka集群种有N个broker 一个broker有N个主题分区 broker指的是一个独立的Kafka服务器 主题指的是消息的分类 为什么要选用
  • SQLI-Labs(18-22关)请求头注入

    十八关 这里这个提示就是一些浏览器会记录我们的IP信息 那么记录了就会被存储到数据库中就有可能存在SQL注入 这里需要引入几个数据头信息 User agent 浏览器的身份识别字符串 简单来说就是根据这个字段来判断是通过PC端还是手机端访问
  • CentOS一键配置rsync服务器脚本

    1 保存下面的代码为一个文件 上传到服务器端 名称为rsync sh bin bash rsync Written by zhumaohai For more information please visit http www centos
  • JavaSE的复习:Java基本语法

    1 变量 变量的分类 按数据类型 对于每一种数据都定义了明确的具体数据类型 强类型语言 在内存中分配了不同大小的内存空间 弱类型语言则不用明确指明数据类型 例如js var 变量的分类 按声明的位置的不同 在方法体外 类体内声明的变量称为成
  • Oracle安装 在注册表中没有找到指定的主目录名 的解决方案

    在安装数据库的时候 报了个错 在注册表中没有找到指定的主目录名 解决方案就是 忽略 此错误并不影响Oracle的正常使用 亲测可行 也不排除不可用的情况 如果谁遇到了请告知 我将继续补充
  • vue-cli3配置proxy解决前后端域名/端口不一致引起的跨域问题

    错误代码 前端 import axios from axios import VueAxios from vue axios Vue use VueAxios axios this axios post http localhost 808
  • (一)JMeter性能测试,完整入门篇:性能测试操作步骤

    原文转自 https blog csdn net lovesoo article details 78579547 1 Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件 相比Loadrunn
  • sentinel

    文章目录 1 sentinel简介 1 1 sentinel解决的问题 1 2 服务保护技术对比 2 微服务整合sentinel 2 1 引入sentinel依赖 2 2 配置控制台地址 3 限流规则 3 1 流控模式 3 2 流控效果 4
  • 华为路由交换学习篇-ACL

    目录 ACL访问控制列表 基本ACL 高级ACL 实验一 ACL访问控制列表 ACL的分类 按照功能来分 可以分为基本ACL 高级ACL 基于接口的ACL 二层ACL 自定义的ACL 基于MPLS的ACL 基本ACL6 高级ACL6 基本A
  • 考研:研究生考试(十五天学完)之研究生学霸重点知识点总结之考研必知(考研时间/科目/必备物件)、【考研政治】/【考研英语】/【考研数学】经验总结(历年规律分析、技巧总结、经验分享)

    考研 研究生考试 十五天学完 之研究生学霸重点知识点总结之考研必知 考研时间 科目 必备物件 考研政治 考研英语 考研数学 经验总结 历年规律分析 技巧总结 经验分享 文章转自 考研 研究生考试 十五天学完 之研究生学霸重点知识点总结之考研
  • Guava学习笔记之Maps(1):Maps.uniqueIndex(Iterable, Function)

    Guava官方文档 https github com google guava wiki CollectionUtilitiesExplained 官方文档这样描述 Maps uniqueIndex Iterable Function ht
  • 【JavaWeb】四个Scope

    英文科普 scope 范围 域 1 page里的变量没法从index jsp传递到test jsp 只要页面跳转了 它们就不见了 以页面为单位 2 request里的变量可以跨越forward前后的两页 但是只要刷新页面 它们就重新计算了
  • Java中对象的比较

    目录 一 基本数据类型的比较 二 引用数据类型比较 1 equals 方法 1 实现Comparable接口 2 传比较器 一 基本数据类型的比较 我们在比较基本类型的数据时 通常用 来判断 也比较简单 int a 3 int b 5 Sy
  • 谈谈我对服务熔断、服务降级的理解

    伴随着微服务架构被宣传得如火如荼 一些概念也被推到了我们面前 管你接受不接受 其实大多数概念以前就有 但很少被提的这么频繁 现在好像不提及都不好意思交流了 想起有人总结的一句话 微服务架构的特点就是 一解释就懂 一问就不知 一讨论就吵架 其
  • 机器学习 数据的采集和清洗

    本人找到了一条路 不知道对错的路 采集训练的 数据和清理数据 第一步 采集 涉及到如何利用爬虫采集网页csv文件 数据是在UCI 上的 UCI官网如下http archive ics uci edu ml index php 就拿里面最热门
  • java字典树(前缀树) - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 这一篇文章咱来讲讲字典树把 之前在给别人代答辩数据结构的时候初次了解到这个概念 今天在刷算法课的时候右看到了 所以就有了这个视频 首先还是明确一个概念 什么是字典树