C++ 实现前缀树

news2024/12/23 7:36:40

一 、前缀树是什么

  • 前缀树是一种查找结构,常用于指定字符串或是数组、线性表等连续信息的存储和查找。
  • 他的作用类似于哈希表,但是它相对于哈希表来说,限制更多,通用性较差,但是它的功能更加强大,可定制性也更强。

二、简单前缀树的结构分析

如需理解以下内容,首先你需要了解树的结构;

  1. 比如二叉树,父节点之下包含两个节点,分别为左右子节点,分别开辟空间,进行数据存储。
  2. 前缀树的结构也是类似的,它的每个节点包含两个部分: 值部分指针部分
  3. 它的存储方式为:在一棵树上,从根到子节点,分别存储所有目标数据的每一个下标位置上的数据
  4. 值部分主要又包含两个数据: 路过该节点的数量为pass以该节点为结尾的数量为end
  5. 指针部分主要包含它的所有子节点,记为next
  • 以存储26个小写英文字母为例,现在需要存储英文单词"ass",则存储路径如下:
    字符串"ass"的存储路径
  • 上图中,每经过一个节点,将该节点的pass值加一,将末尾节点的end值加一。通过这种操作记录所有经过的数据记录。
  • 同时在树中,需要一个根节点来管理所有子节点,根节点中不存数据(除非是空字符串)
  • 接下来就只需要用代码将所有方法实现即可

下面给出实现,一共四个接口:

  1. insert插入字符串,给前缀树添加一组数据
  2. find查找已存入的字符串个数
  3. findContain 输入前缀查找已存在的前缀相同的字符串个数
  4. erase 从前缀树中擦除一个字符串及其所存在数据
  • 其中insert方法需要注意pass的数据增加
  • erase方法需要注意的是:
    需要先检查字符串是否存在;
    当一个节点的经过数量等于0时,即pass == 0 时,代表其下没有任何可能存在的字符串,所以直接将整棵树删除即可;
    移除节点时,需要提前写好析构函数,将其所有子节点的内存全部释放,以免出现内存泄漏

代码:

#include <iostream>
using namespace std;
//26 个小写英文字母
#define NUMBER 26

// 节点的结构
class TrieNode
{
public:
	int pass;
	int end;
	TrieNode* nexts[NUMBER];
	TrieNode()
	{
		pass = 0;
		end = 0;
		for (int i = 0; i < NUMBER; i++)
		{
			nexts[i] = nullptr;
		}
	}
	~TrieNode()
	{
		for (int i = 0; i < NUMBER; i++)
		{
			if (nexts[i]) delete nexts[i];
		}
	}
};

// 所调用的树结构
class TrieTree
{
	TrieNode* root = nullptr;
public:
	TrieTree()
	{
		root = new TrieNode();
	}
	// 插入
	void insert(string word)
	{
		TrieNode* cur = root;
		cout << word;
		for (int i = 0; i < word.size(); i++)
		{
			
			int num = word[i] - 'a';
			if (cur->nexts[num] == nullptr)
			{
				cur->nexts[num] = new TrieNode();
			}
			cur = cur->nexts[num];
			cur->pass++;
		}
		cur->end++;
	}
	//查找字符串数量
	int find(string word)
	{
		TrieNode* cur = root;
		for (int i = 0; i < word.size(); i++)
		{
			int num = word[i] - 'a';
			if (cur->nexts[num] == nullptr) return 0;

			cur = cur->nexts[num];
		}
		return cur->end;
	}
	//查找前缀数量
	int findContain(string word)
	{
		TrieNode* cur = root;
		for (int i = 0; i < word.size(); i++)
		{
			int num = word[i] - 'a';
			if (cur->nexts[num] == nullptr) return 0;

			cur = cur->nexts[num];
		}
		return cur->pass;
	}
	//删除
	bool erase(string word)
	{
		if (find(word) == 0) return false;
		TrieNode* cur = root;
		for (int i = 0; i < word.size(); i++)
		{
			int num = word[i] - 'a';

			if (cur->nexts[num]->pass <= 1)
			{
				delete cur->nexts[num];
				cur->nexts[num] = nullptr;
				return true;
			}
			cur = cur->nexts[num];
			cur->pass--;
		}
		cur->end--;
		return true;
	}
};


  • 最后想说的是:这个树结构可以根据需求来进行多样式的处理;
  • 上述方法是使用下标作为数据进行处理,如果需要实现大量不同的数据处理的话,可以考虑使用哈希表或其他结构,如set容器,map容器等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#入门-字段类型访问权限低于字段本身

字段类型访问权限低于字段本身 现在假设你有一个小兵类&#xff0c;他的访问权限是仅限当前程序集。 internal class 小兵 {public int hp 12;public int atk 10;public int def 5; }然后声明一个兵营&#xff0c;用来创造小兵 public class 兵营 {public 小兵 模板;publ…

深度学习课件-实验1_PyTorch基本操作实验

文章目录一、Pytorch基本操作考察1.11.21.3二、动手实现 logistic 回归2.12.2三、动手实现softmax回归3.13.2一、Pytorch基本操作考察 使用 &#x1d413;&#x1d41e;&#x1d427;&#x1d42c;&#x1d428;&#x1d42b; 初始化一个 &#x1d7cf;&#x1d7d1; 的矩阵 &a…

第五、六章

第五章程序控制结构 5.1switch分支结构 每一个分支结构最后要记得加break;表示退出。 import java.util.Scanner; public class Switch01 { //编写一个 main 方法 public static void main(String[] args) { /* 请编写一个程序&#xff0c;该程序可以接收一个字符&#xff0…

我逛遍各大论坛,分享这份大厂招聘总结:涵盖Java岗位95%+真题

我们程序员这一群体&#xff0c;大家都知道最好的涨薪方法是通过跳槽&#xff0c;在你把一个公司的精华都吸收完之后&#xff0c;有追求的肯定会跳去更好的公司发展自己&#xff0c;特别在金三银四&#xff0c;金九银十这样的招聘旺季里 &#xff0c;会有很多需要准备的面试会有…

Snort入侵检测系统使用示例

1998年&#xff0c;Martin Roesch用C语言开发了开源的入侵检测系统Snort。现如今Snort已发展成为一个具有多平台、实时流量分析、网络IP数据包记录等特性的强大的网络入侵检测/防御系统&#xff0c;是世界最顶尖的开源入侵检测系统。Snort IDS利用一系列的规则去定义恶意网络活…

Qt-数据库开发-QDataWidgetMapper(5)

Qt-数据库开发-使用QDataWidgetMapper将数据库数据映射到小部件 文章目录Qt-数据库开发-使用QDataWidgetMapper将数据库数据映射到小部件1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;数据库开发 &#x1…

MYSQL数据库-复合查询

MYSQL数据库-复合查询零、前言一、基本查询二、多表查询三、自连接四、子查询1、单行子查询2、多行子查询3、多列子查询3、在from子句中使用子查询五、合并查询1、union2、union all零、前言 本章主要讲解学习MYSQL数据库中的复合查询&#xff0c;前面我们讲解的mysql表的查询都…

嵌入式分享合集119

一、传感器的数据处理算法 在传感器使用中&#xff0c;我们常常需要对传感器数据进行各种整理&#xff0c;让应用获得更好的效果&#xff0c;以下介绍几种常用的简单处理方法&#xff1a; 加权平滑&#xff1a;平滑和均衡传感器数据&#xff0c;减小偶然数据突变的影响。 抽取…

502问题怎么排查?

刚工作那会&#xff0c;有一次&#xff0c;上游调用我服务的老哥说&#xff0c;你的服务报"502错误了&#xff0c;快去看看是为什么吧"。 当时那个服务里正好有个调用日志&#xff0c;平时会记录各种200,4xx状态码的信息。于是我跑到服务日志里去搜索了一下502这个数…

【负荷预测】基于贝叶斯网络的考虑不确定性的短期电能负荷预测(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

408 考研《操作系统》第二章第四节:进程同步和进程互斥

文章目录教程1. 进程同步2. 进程互斥3. 总结4. 进程互斥的软件实现方法4.1 单标志法4.2 双标志先检查法4.3 双标志后检查法4.4 Peterson算法4.5 总结5. 进程互斥的硬件实现方法5.1 中断屏蔽方法5.2 TestAndSet指令5.3 Swap指令5.4 总结教程 进程同步和进程互斥 https://www.bi…

【OpenCV学习】第11课:图像金字塔 - 上采样与降采样(高斯金字塔,放大与缩小图像)

仅自学做笔记用,后续有错误会更改 理论 参考文章链接:https://blog.csdn.net/qq_54185421/article/details/124350723 图像金字塔的概念&#xff1a; 从上往下&#xff08;采样点越来越多&#xff09;&#xff1a;上采样 从下往上&#xff08;采样点越来越少&#xff09;&a…

代码随想录刷题|LeetCode 503.下一个更大元素II 42. 接雨水 84.柱状图中最大的矩形

目录 503.下一个更大元素II 思路 下一个更大元素|| 42. 接雨水 思路 双指针法 动态规划 单调栈 接雨水 双指针法 动态规划 单调栈 84.柱状图中最大的矩形 思路 柱状图最大的矩形 动态规划 单调栈 503.下一个更大元素II 题目链接&#xff1a;力扣 思路 与 739. 每日温度 基本相…

STM32 | hex文件、bin文件、axf文件的区别?

已剪辑自: https://mp.weixin.qq.com/s/1EQRooYYpDeKvHpqguik6w 在STM32开发中&#xff0c;经常会碰到hex文件、bin文件与axf文件&#xff0c;这些都是可以烧写到板子里运行的文件。这三个文件有什么区别呢&#xff1f;在这之前&#xff0c;先来一起回顾一下C语言编译的过程&a…

详解c++---模板(初阶)

这里写目录标题为什么会有模板函数模板如何解决类型不同而导致模板无法实例化的问题类的模板为什么会有模板 c语言在面对同一个功能不同的类型的数据时得创建出来多个不同名的函数来依次达到目的&#xff0c;比如说我们下面的代码&#xff1a; #include<stdio.h> int a…

计算机毕业设计ssm+vue基本微信小程序的手机预约维修系统

项目介绍 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势&#xff1a;对于电脑维修预约当然也不能排除在外,随着网络技术的不断成熟,带动了电脑维修预约,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活…

通俗理解数据治理之主数据

1. 定义 1&#xff09;国家标准GB/T 36073-2018 《数据管理能力成熟度评估模型》中对主数据的定义&#xff1a;主数据是组织中需 要跨系统、跨部门进行共享的核心业务实体数据。 2&#xff09;IBM 公司在其有关主 数据管理的红皮书《Master Data Manangement:Rapid Deploymen…

软件测试web自动化测试

今天目标 1、自动化相关概念 2、自动化相关环境搭建 3、元素定位 课程大纲 1.核心重点&#xff08;第二章&#xff09; 2,提高代码质量&#xff0c;自动化水平(第三、四、五、六章) 3.项目实战&#xff08;第七章&#xff09; 4.理论及环境与定位&#xff08;第一章&am…

Linux服务器读写python环境变量

在公司项目开发过程中&#xff0c;代码都是放在服务器中进行运行的&#xff0c;使用本地的idea工具连接到服务器。 如python开发中&#xff0c;将使用pycharm工具连接服务器&#xff0c;如下图所示&#xff1a; 在项目中有线上正式环境、测试环境等&#xff0c;都是用不同环境变…

[附源码]计算机毕业设计计算机相关专业考研资料管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…