首页 > 编程语言 >Java-前缀树

Java-前缀树

时间:2025-01-11 19:01:30浏览次数:3  
标签:Java 前缀 TrieNode 节点 Trie 字符串 public

        前缀树,也叫Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较。

        Trie树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

        Trie树也有它的缺点,Trie树的内存消耗非常大。

        性质:不同字符串的相同前缀只保存一份。

        操作:查找,插入,删除,查找前缀。

  前缀树的4个基本性质:

  1. 根节点不包含字符,除根节点外每一个节点都只对应一个字符。

  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

  3. 每个节点的所有子节点包含的字符都不相同。

  4. 每条边对应一个字母。每个节点对应一项前缀。叶节点对应最长前缀,即单词本身

        下面我们来看下前缀树结构如何定义,以及四种基本操作。首先需要明确,前缀树的节点上是不存储字符的信息的,字符信息存储在路径上。

//前缀树节点定义
public class TrieNode{
    //节点被经过几次
    public int pass;
    //节点是结尾节点次数
    public int end;
    //节点的下面节点,如果下面节点的数量范围确定,就用数组,不确定可以用其他集合比如Set
    public TrieNode[] nexts;

    public TrieNode(){
        pass=0;
        end=0;
        //假设存26个小写字母a-z 所以申请长度26的空间就够了
        nexts=new TrieNode[26];
    }
}


//前缀树结构
public class Trie{
    //根节点
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    //新增操作
    public void insert(String word){
        char[] ch=word.toCharArray();
        root.pass++;
        TrieNode cur=root;
        for(int i=0;i<ch.length;i++){
            int index=ch[i]-'a';
            if(cur.nexts[index]==null){
                //说明没有ch[i]这条路经 那就新建
                cur.nexts[index]=new TrieNode();
            }
            cur=cur.nexts[index];
            cur.pass++;
        }
        //循环结束 cur指向最后一个节点 所以其end++
        cur.end++;
    }
    
    //查找加入了几个word
    public int searchNum(String word){
        char[] ch=word.toCharArray();
        TrieNode cur=root;
        for(int i=0;i<ch.length;i++){
            int index=ch[i]-'a';
            if(cur.nexts[index]==null){
                //说明没有ch[i]这条路经 即不存在这个word
                return 0;
            }
            cur=cur.nexts[index];
        }
        return cur.end;
    }

    //删除word
    public void delete(String word){
        //先查询word是否存在
        if(search(word)==0){
            return;
        }
        char[] ch=word.toCharArray();
        TrieNode cur=root;
        for(int i=0;i<ch.length;i++){
            int index=ch[i]-'a';
            cur=cur.nexts[index];
            cur.pass--;
        }
        cur.end--;
    }

    //查找以pre为前缀的字符串有几个
    public int  searchPrefixNum(String pre){
        char[] ch=pre.toCharArray();
        TrieNode cur=root;
        for(int i=0;i<ch.length;i++){
            int index=ch[i]-'a';
            if(cur.nexts[index]==null){
                //说明没有ch[i]这条路经说明没有这个前缀
                return 0;
            }
            cur=cur.nexts[index];
        }
        return cur.pass;
    }
}

        测试结果如下

        我们举例看下前缀树长啥样。假设有b,abc,abd,bcd,abcd,efg,hii 这7个单词,那我们就会得到如下图所示的前缀树。

             ​​​​​​​        ​​​​​​​​​​​​​​、

        从图中可以清晰的看到字符串存储的情况,可以通过直接看图得出存储了哪些字符串,也可以很容易得到各种前缀字符的信息。

标签:Java,前缀,TrieNode,节点,Trie,字符串,public
From: https://blog.csdn.net/weixin_56812051/article/details/145024830

相关文章

  • java图片素材管理库的设计与实现论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今数字化的时代,图片素材在众多领域如教育、设计、传媒等发挥着至关重要的作用。随着互联网的发展,图片素材的数量呈爆炸式增长,来源也日益多样......
  • java超市仓库出入库管理系统论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着零售业的不断发展,超市的规模和业务量日益增长。在超市运营中,仓库出入库管理是至关重要的环节。传统的人工管理方式难以满足日益复杂的业务需......
  • java员工管理系统论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今企业的运营管理中,员工管理的重要性日益凸显。随着企业规模的不断扩大和业务复杂度的增加,传统的员工管理方式面临着诸多挑战。以往依靠纸质......
  • java宠物救助网站的设计与实现论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展和人们生活水平的提高,宠物在人们生活中的地位日益重要,成为许多家庭不可或缺的成员。然而,宠物数量的快速增长也带来了一系列严峻的......
  • Java面向对象1-类与对象
    一.类的定义class类名【类是一种引用类型所以其定义和使用可借鉴基本数据类型,类名一般采用大驼峰】,一个Java文件一般只有一个类。每个文件中只有一个public修饰类且类名必须与文件名相同。二.类的使用类中包含成员变量和成员方法,可在类中定义成员方法或变量1.类的实例化......
  • Java基于SpringBoot+Vue的口腔诊所系统的设计与实现(源码+文档+运行视频+讲解视频)
    所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍Java基于SpringBoot+Vue的口腔诊所系统的设计与实现(源码+文档+运行视频+讲解视频)系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据库:my......
  • Java基于SpringBoot+Vue的城市公交/地铁/交通查询系统(源码+文档+运行视频+讲解视频)
    所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍Java基于SpringBoot+Vue的城市公交/地铁/交通查询系统(源码+文档+运行视频+讲解视频)系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据库:m......
  • 9.java中String,StringBuilder,StringBuffer 什么区别
    在Java中,String、StringBuilder和StringBuffer都是用来处理字符串的类,但它们之间有一些关键的区别,主要体现在可变性和线程安全性上。以下是它们的详细比较:1.String不可变性:String是不可变的类,也就是说,一旦创建了一个String对象,它的内容就不能再被修改。每......
  • SpringBoot基于java的畅销图书推荐系统的设计与实现
    1.引言在当今的软件开发领域,企业级应用的开发和部署速度直接影响着业务的竞争力。SpringBoot以其轻量级、快速启动和强大的集成能力,成为构建现代企业级应用的首选框架。本文将带您深入了解SpringBoot框架的核心特性,并展示如何利用它构建一个高效、可扩展的系统。2.开发......
  • SpringBoot基于Javaweb的二手儿童绘本交易系统的设计与实现
    1.引言在当今的软件开发领域,企业级应用的开发和部署速度直接影响着业务的竞争力。SpringBoot以其轻量级、快速启动和强大的集成能力,成为构建现代企业级应用的首选框架。本文将带您深入了解SpringBoot框架的核心特性,并展示如何利用它构建一个高效、可扩展的系统。2.开发......