TireTree前缀树
前缀树(Trie),也叫单词查找树
典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
它的基本性质如下:
根节点不包含字符,除根节点外每一个节点都只包含一个字符。
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
每个节点的所有子节点包含的字符都不相同。
前缀树常用的有如下4个操作:
1.插入字符串: void insert(string str)
遍历字符串,沿途经过的pass++,如果出现某个字符从未出现时则新建一个。遍历到最后一个字符时,其结点的end++;
2.删除字符串: void delete(string str)
遍历字符串,每个字符串的pass–,如果遍历到最后一个,end也–;如果沿途发现某个结点的pass(自减之前)值为1,则直接删除该结点。
3.在前缀树中查询字符串出现的次数: int search(string str)
遍历字符串,返回最后一个字符对应结点的end值。
4.在前缀树中查询以str字符串为前缀的个数: int SubString(string str)
遍历字符串,返回最后一个字符对应的结点的pass值。
(pass为经过该结点的次数,end为以该结点结尾的次数)
代码
#include <iostream>
using namespace std;class NODE
{public:int end;int path;NODE **pNext;NODE():end(0), path(0){pNext = new NODE*[26]();}
};class TireTree
{public:TireTree():root(new NODE){}void Insert(const char *pStr){if(NULL == pStr)return;NODE *pTemp = root;for(; '\0' != *pStr; pStr++){int Index = (*pStr) - 'a';//如果不存在当前这条路if(NULL == pTemp->pNext[Index]){pTemp->pNext[Index] = new NODE;}pTemp = pTemp->pNext[Index];//经过的字符串的前缀++pTemp->path++;}//pStr这个字符串++pTemp->end++;}void Delete(const char *pStr){if(NULL == pStr)return ;if(0 == Find(pStr))//字符串不存在{return ;}NODE *pTemp = root;for(; '\0' != *pStr; pStr++){int Index = (*pStr) - 'a';//以经过字符串为前缀的已经的个数是0了 if(0 == --pTemp->pNext[Index]->path){NODE *pNext = pTemp->pNext[Index];pTemp->pNext[Index] = NULL;pStr++;//防止内存泄漏for(; '\0' != *pStr; pStr++){Index = (*pStr) - 'a';pTemp = pNext;pNext = pNext->pNext[Index];delete pTemp;}return ;}pTemp = pTemp->pNext[Index];}pTemp->end--;}int SubString(const char *pStr){if(NULL == pStr)return 0;NODE *pTemp = root;for(; '\0' != *pStr; pStr++){int Index = (*pStr) - 'a';if(NULL == pTemp->pNext[Index]){return 0;}pTemp = pTemp->pNext[Index];}return pTemp->path; }int Find(const char *pStr){if(NULL == pStr)return 0;NODE *pTemp = root;for(; '\0' != *pStr; pStr++){int Index = (*pStr) - 'a';if(NULL == pTemp->pNext[Index]){return 0;}pTemp = pTemp->pNext[Index];}return pTemp->end;}struct NODE *root;
};
TireTree前缀树相关推荐
- 数据库索引数据结构总结——ART树就是前缀树
数据库索引数据结构总结 from:https://zhewuzhou.github.io/2018/10/18/Database-Indexes/ 摘要 数据库索引是数据库中最重要的组成部分,而索引的 ...
- Trie(前缀树/字典树)及其应用
from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...
- 有关完全二叉树求节点数和前缀树求字符串是否重复的两道算法题
1.给定一棵完全二叉树的头节点head,求其中的节点个数 递归的方法,时间复杂度为O((logN)²) 首先递归出头节点的左子树的最大深度H,之后再递归头节点的右子树的深度是否等于H,若相等则表示,头 ...
- 字典数(前缀树)的实现
[题目] 字典树又称为前缀树或者Trie树,是处理字符串常用的数据结构.假设组成所有单词的字符仅是'a'-'z',请实现字典树的结构,并包含以下四个主要的功能. void insert(String ...
- AC解 - Phone List(HDOJ#1671) 前缀树的一个应用
原题:http://acm.hdu.edu.cn/showproblem.php?pid=1671 Time Limit: 3000/1000 MS (Java/Others) Memory L ...
- 算法练习day13——190401(前缀树、贪心策略拼接字符串使字典序最小)
1.前缀树(Trie Tree) 1.1 字符串生成前缀树的过程 字母是填在路上的,不是填在节点上的. 首先是一个空的头结点: 加入"abc"到这棵树中: 头结点有到a的路吗?没有 ...
- Seq2Seq+前缀树:检索任务新范式(以KgCLUE为例)
©PaperWeekly 原创 · 作者 |苏剑林 单位 |追一科技 研究方向 |NLP.神经网络 两年前,在<万能的seq2seq:基于seq2seq的阅读理解问答>和<" ...
- Java 实现 Trie (前缀树)
LeetCode:https://leetcode-cn.com/problems/implement-trie-prefix-tree/ 什么是前缀树 Trie(发音类似 "try&quo ...
- LeetCode 208. 实现 Trie (前缀树) —— 提供一套前缀树模板
208. 实现 Trie (前缀树) Ideas 前缀树嘛,直接套模板咯,把之前写的拿过来抄一遍. 提供一下我的模板. Code Python class TrieNode:def __init__( ...
- leetcode 676. Implement Magic Dictionary | 676. 实现一个魔法字典(DFS+Trie 前缀树)
题目 https://leetcode.com/problems/implement-magic-dictionary/description/ 题解 题意理解 前缀树问题,大意是是让你在字典中找到是 ...
最新文章
- 《Cacti实战》——导读
- 降噪自动编码器:DAEs
- python arduino i2c1602_Arduino通过I2C(PCF8574T)驱动1602LCD
- css3的自定义字体
- 绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
- 520 钻石争霸赛 题解
- 猛将赵云java,这五位三国猛将临危救主,赵云只能排第二位,第一位大家都服...
- Python实现抓取CSDN博客首页文章列表
- 很火的深度学习框架PyTorch怎么用?手把手带你安装配置
- O036、Snapshot Instance 操作详解
- 中国水平电泳系统市场趋势报告、技术动态创新及市场预测
- matlab读取adtx文件,求大家帮我看看下面中matlab中的程序问题出在哪里? - 计算模拟 - 小木虫 - 学术 科研 互动社区...
- dw cs 5 安装失败解决方案
- 【谷月老师讲WPS】用 Windows 11 的 WSL 安装 WPS for Linux
- 判断ipad横竖屏的两个方法
- 为什么视频云服务会被各行业广泛看好?
- 苹果IOS模拟器电脑版用哪个好 逍遥模拟器玩部分苹果账号互通
- MaskRNN Instance Level Video Object Segmentation 论文翻译
- iOS 非越狱下的代码注入
- mysql unix_timestamp now() dfdfd f_数据库函数lpad的搜索结果-阿里云开发者社区