12-Trie树

news2024/11/20 14:32:20

Trie树(又称字典树单词查找树)是一种树型的数据结构,常用于保存和查找字符串,是一种十分高效率的存储和检索方式。

Trie树原理

我们先假设有六个字符串需要存储:abc、abcd、abef、cfgh、bc、bcd。Trie树的存储原理是在存储时首先创建一个根节点,用于以后统一检索,然后再由这个根节点开始逐项创建子节点用以存储字符串中的每个元素,下面是存储字符串abc的过程:首先创建了根节点,然后创建节点存储字符a,再创建节点存储字符b,再创建节点存储字符c,最后会做一个标记表示从a-->c的节点集是一个字符串。

以此类推,我们可以逐项画出剩下五个字符串存储完后的Trie树结构,如果一些节点已有(两字符串前面部分相同)后续就不用再反复创建了。

Trie树存储

那么我们下面用代码来实现一下Trie树的存储,这里我们假定存储的字符串是只包含小写字母的字符串。首先照旧引入头文件,然后创建三个关键的变量:Node数组、cont数组和index变量。Node数组相当于Trie树里面的节点,它用来存储字符串里面的字母。cont数组用来记录以某个节点为结束的字符串的个数。而index则表示给每一个新的节点一个独一无二的标记,也是当前存储的下标,利用这个index可以定位到一个节点。这里N表示我们最多可以存储长度为N的字符串,也可以表示树最高的高度,M表示每一个节点最多可以向下扩展的枝的个数(这里设置为26的原因是最多就26个字母)。

#include<iostream>

using namespace std;
const int N = 100,M = 26;

int Node[N][M], cont[N], index;

之后我们就可以着手写存储的函数了,我们计划写一个Insert函数来存储,这里再定义一个p变量,它表示当前存储到哪个字母(注意第0个为根节点,不存储东西)。然后再写一个for循环,当这个字符串存储到最后一个字母(即str[i]为'\0'时就结束)后就结束。我们存储一个字母的方式是将其转换为对应的数字存储,这里我们可以直接通过字母减去字符‘a’得到它们对应的数字,例如a就是0,b就是1。之后我们需要做一个判断,判断当前字母的节点是否之前已经被创建(例如之前就有abc,那么我们存储abcd的话就只需要在abc字符串的基础上只存储一个d元素就行)。判断的方式也很简单,就判断那个节点有没有被标记(也就是有没有它的的index)。有的话直接跳过到下一个节点,没有的话就创建一个(先让index加加再赋值)。最后我们寻找该字符串的下一个字母即可,具体的操作是将p变量指向下一个位置p=Node[p][u](继续重复判断该位置有没有被创建节点等操作)。最后我们让记录字符串个数的cont数组的对应标志位加加即可。

void Insert(char str[])
{
	int p = 0;
	for (int i = 0; str[i]!='\0'; i++)
	{
		int u = str[i] - 'a';
		if (Node[p][u] == 0)
			Node[p][u] = ++index;
		p=Node[p][u];
	}
	cont[p]++;
}

Trie树搜索

搜索我们使用Query函数来实现,它的实现逻辑和Insert函数类似,都是在树中搜索,一旦我们需要搜索的那个字符串里一个字符没有在Trie树中搜到,那么我们就直接return0返回,以此判定没有该字符,有的话我们就返回在树中该字符串的个数。

int Query(char str[])
{
	int p = 0;
	for (int i = 0; str[i]; i++)
	{
		int u = str[i] - 'a';
		if (Node[p][u] == 0)
			return 0;
		p = Node[p][u];
	}
	return cont[p];
}

总体代码及例子

我们将上面的实验实现一下,首先准备好几个字符串:abc、abcd、abef、cfgh、bc、bcd。然后再将其插入到Trie树中,这里我直接放入字符串,所以后面我将形参换为一个常变量:

	Insert("abc");
	Insert("abcd");
	Insert("abef");
	Insert("cfgh");
	Insert("bc");
	Insert("bcd");

然后再将bc的数目读出来:

	cout << query("bc");

 

 总体代码如下:

#include<iostream>

using namespace std;
const int N = 100,M = 26;

int Node[N][M], cont[N], index;

void Insert(const char str[])
{
	int p = 0;
	for (int i = 0; str[i]!='\0'; i++)
	{
		int u = str[i] - 'a';
		if (Node[p][u] == 0)
			Node[p][u] = ++index;
		p=Node[p][u];
	}
	cont[p]++;
}

int query(const char str[])
{
	int p = 0;
	for (int i = 0; str[i]; i++)
	{
		int u = str[i] - 'a';
		if (Node[p][u] == 0)
			return 0;
		p = Node[p][u];
	}
	return cont[p];
}
int main()
{
	Insert("abc");
	Insert("abcd");
	Insert("abef");
	Insert("cfgh");
	Insert("bc");
	Insert("bcd");
	cout << query("bc");
	return 0;
}

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

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

相关文章

Scala04 方法与函数

Scala04 方法与函数 Scala 中的也有方法和函数的概念。 Scala中的 方法 是类的一部分。 Scala中的 函数 是一个对象&#xff0c;可以赋值给变量。 在类中定义的函数就是方法 4.1 方法 Scala 中方法 与 Java 中类似&#xff0c;是组成类的一部分 4.1.1 语法结构 格式&#x…

数据库“啃”不动?CnosDB带你轻松阅读十万行源码!

最近一直有社区的小伙伴问&#xff0c;我们很感兴趣CnosDB&#xff0c;但从何开始阅读CnosDB的代码呢&#xff0c;其实这个问题在之前的CnosDB HiTea直播时就有聊到&#xff0c;今天我们就再来回顾一下。CnosDB的源代码主要分为Query Engine和Storage Engine。Query Engine在qu…

JOSN数据转换和解析

文章目录JOSN数据转换和解析内容回顾Map 集合转成 JSON 字符串List 集合转换成 JSON 字符串Ajax 异步和同步异步概念同步概念异步和同步区别异步请求案例同步请求时间格式化旧时间 api 格式化格式化和解析的工具类JSTL 时间格式化JSTL 使用JOSN数据转换和解析 内容回顾 ajax …

指针的进阶续(笔试题强化练习)

写在前面&#xff1a;在上次我们学习了指针的相关类型的知识&#xff0c;对指针家族的成员基本有了了解&#xff0c;这次让我们跟着一些题目来练习和补充一些知识&#xff0c;这有助于我们强化理解这些知识。 话不多说&#xff0c;我们马上开始&#xff1a; 1.指针和数组的笔…

Vue基础学习 第一个Vue程序 el挂载点 v-指令(1)

Vue简介 Vue是一个Javascript框架Vue框架可以简化Dom操作响应式数据驱动 &#xff1a; 页面是由数据生成的&#xff0c;当数据出现改动&#xff0c;页面也会即时改变 第一个Vue程序 Vue中文文档官网&#xff1a;https://v2.cn.vuejs.org/v2/guide/ 根据官方文档的说法&#…

缓存与数据库的双写一致性

背景 在高并发的业务场景下&#xff0c;系统的性能瓶颈往往是出现在数据库上&#xff0c;用户并发访问过大&#xff0c;压力都打到数据库上。所以一般都会用redis做缓存层&#xff0c;起到一个缓冲作用&#xff0c;让请求先访问到缓存层&#xff0c;而不是直接去访问数据库&am…

Web3D发展趋势以及Web3D应用场景

1&#xff0c;Web3D发展趋势随着互联网的快速发展&#xff0c;Web3D技术也日渐成熟&#xff0c;未来发展趋势也值得关注。以下是Web3D未来发展趋势的七个方面&#xff1a;可视化和可交互性的增强&#xff1a;Web3D可以为三维数据提供可视化和可交互性的增强&#xff0c;将极大地…

CCNP350-401学习笔记(补充题目101-186)

101、 enable the https service 102、fabric edge node 103、 104、 105、 16113 106、filter access-group 10 107、 108、VETP 109、 110、 111、the server and the database can inititate communication 112、 113、 114、 115、 116、WAN edge&#xf…

【教程】去水印开源工具Lama Cleaner在Windows的安装和使用

一、Lama Cleaner是什么&#xff1f; Lama Cleaner是一款开源且免费的人工学习图片去水印程序&#xff08;个人主要学习用途&#xff09;&#xff0c;没有图片分辨率限制&#xff08;个人使用暂未发现&#xff09;&#xff0c;并且保存的图片质量很高&#xff08;个人觉得跟原…

MSTP多进程讲解与实验配置

目录 MSTP多进程 专业术语 MSTP多进程配置 在MSTP域配置 MSTP多进程 多进程的作用 将设备上的端口绑定到不同的进程中&#xff0c;以进程为单位进行MSTP计算&#xff0c;不在同一进程内的端口不参与此进程中的MSTP协议计算&#xff0c;实现各个进程之间的生成树计算相互独立…

【算法】DFS与BFS

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;题目的模拟很重要&#xff01;&#xff01;&#x1f43e; 文章目录1.区别2.DFS2.1 排列数字2.2 n-皇后问题3.BFS3.1走迷宫1.区别 搜索类型数据结构空间用途过程DFSstackO( n )不能用于最短路搜索到最深处&a…

leetcode打卡-深度优先遍历和广度优先遍历

200.岛屿数量 leetcode题目链接&#xff1a;https://leetcode.cn/problems/number-of-islands leetcode AC记录&#xff1a; 思路&#xff1a;深度优先遍历&#xff0c;从0&#xff0c;0开始遍历数组&#xff0c;使用boolean类型数组used记录是否被访问过&#xff0c;进行一…

28个案例问题分析---014课程推送页面逻辑整理--vue

一&#xff1a;背景介绍 项目开发过程中&#xff0c;前端出现以下几类问题&#xff1a; 代码结构混乱代码逻辑不清晰页面细节问题 二&#xff1a;问题分析 代码结构混乱问题 <template><top/><div style"position: absolute;top: 10px"><C…

SpringBoot监听机制-以及使用

11-SpringBoot事件监听 Java中的事件监听机制定义了以下几个角色&#xff1a; ①事件&#xff1a;Event&#xff0c;继承 java.util.EventObject 类的对象 ②事件源&#xff1a;Source &#xff0c;任意对象Object ③监听器&#xff1a;Listener&#xff0c;实现 java.util…

奇思妙想:超链接唤起本地应用

文章目录分析实现参考很多人的博客都有这样的小玩意&#xff0c;点击之后就可以直接与博主进行对话&#xff0c;而且无需添加好友。 先研究一下网页源代码&#xff1a; <a href"tencent://message/?uin88888888&Siteqq&Menuyes">联系我</a>很明…

Decoupled Knowledge Distillation(CVPR 2022)原理与代码解析

paper&#xff1a;Decoupled Knowledge Distillationcode&#xff1a;https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/DKD.py背景与基于响应logits-based的蒸馏方法相比&#xff0c;基于特征feature-based的蒸馏方法在各种任务上的表现更好…

【教学典型案例】14.课程推送页面整理-增加定时功能

目录一&#xff1a;背景介绍1、代码可读性差&#xff0c;结构混乱2、逻辑边界不清晰&#xff0c;封装意识缺乏![在这里插入图片描述](https://img-blog.csdnimg.cn/bbfc5f04902541db993944ced6b62793.png)3、展示效果不美观二&#xff1a;案例问题分析以及解决过程1、代码可读性…

现代操作系统——Linux架构与学习

小白的疑惑 在我决定从事嵌入式&#xff08;应用层&#xff09;方面的工作时&#xff0c;我查询了大量资料该如何学习&#xff0c;几乎所有观点不约而同的都指向了学习好Linux&#xff0c;大部分工作都是在Linux环境下来进行工作的。于是我雄心勃勃的去下载Linux&#xff0c;可…

GEE开发之降雨(CHIRPS)数据获取和分析

GEE开发之降雨CHIRPS数据获取和分析1.数据介绍2.初识CHIRPS2.1 代码一2.2 代码二3.逐日数据分析和获取4.逐月数据分析和获取4.1 代码一4.2 代码二(简洁)5.逐年数据分析和获取5.1 代码一5.2 代码二(简洁)前言&#xff1a;主要获取和分析UCSB-CHG/CHIRPS/DAILY的日数据、月数据和…

一文带你入门,领略angular风采(上)!!!

话不多说&#xff0c;上代码&#xff01;&#xff01;&#xff01; 一、脚手架创建项目 1.安装脚手架指令 npm install -g angular/cli 2.创建项目 ng new my-app(ng new 项目名) 3.功能选择 4.切换到创建好的项目上 cd my-app 5.安装依赖 npm install 6.运行项目 npm start或…