前缀树(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前缀树相关推荐

  1. 数据库索引数据结构总结——ART树就是前缀树

    数据库索引数据结构总结 from:https://zhewuzhou.github.io/2018/10/18/Database-Indexes/ 摘要 数据库索引是数据库中最重要的组成部分,而索引的 ...

  2. Trie(前缀树/字典树)及其应用

    from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...

  3. 有关完全二叉树求节点数和前缀树求字符串是否重复的两道算法题

    1.给定一棵完全二叉树的头节点head,求其中的节点个数 递归的方法,时间复杂度为O((logN)²) 首先递归出头节点的左子树的最大深度H,之后再递归头节点的右子树的深度是否等于H,若相等则表示,头 ...

  4. 字典数(前缀树)的实现

    [题目] 字典树又称为前缀树或者Trie树,是处理字符串常用的数据结构.假设组成所有单词的字符仅是'a'-'z',请实现字典树的结构,并包含以下四个主要的功能. void insert(String ...

  5. AC解 - Phone List(HDOJ#1671) 前缀树的一个应用

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=1671 Time Limit: 3000/1000 MS (Java/Others)    Memory L ...

  6. 算法练习day13——190401(前缀树、贪心策略拼接字符串使字典序最小)

    1.前缀树(Trie Tree) 1.1 字符串生成前缀树的过程 字母是填在路上的,不是填在节点上的. 首先是一个空的头结点: 加入"abc"到这棵树中: 头结点有到a的路吗?没有 ...

  7. Seq2Seq+前缀树:检索任务新范式(以KgCLUE为例)

    ©PaperWeekly 原创 · 作者 |苏剑林 单位 |追一科技 研究方向 |NLP.神经网络 两年前,在<万能的seq2seq:基于seq2seq的阅读理解问答>和<" ...

  8. Java 实现 Trie (前缀树)

    LeetCode:https://leetcode-cn.com/problems/implement-trie-prefix-tree/ 什么是前缀树 Trie(发音类似 "try&quo ...

  9. LeetCode 208. 实现 Trie (前缀树) —— 提供一套前缀树模板

    208. 实现 Trie (前缀树) Ideas 前缀树嘛,直接套模板咯,把之前写的拿过来抄一遍. 提供一下我的模板. Code Python class TrieNode:def __init__( ...

  10. leetcode 676. Implement Magic Dictionary | 676. 实现一个魔法字典(DFS+Trie 前缀树)

    题目 https://leetcode.com/problems/implement-magic-dictionary/description/ 题解 题意理解 前缀树问题,大意是是让你在字典中找到是 ...

最新文章

  1. 《Cacti实战》——导读
  2. 降噪自动编码器:DAEs
  3. python arduino i2c1602_Arduino通过I2C(PCF8574T)驱动1602LCD
  4. css3的自定义字体
  5. 绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
  6. 520 钻石争霸赛 题解
  7. 猛将赵云java,这五位三国猛将临危救主,赵云只能排第二位,第一位大家都服...
  8. Python实现抓取CSDN博客首页文章列表
  9. 很火的深度学习框架PyTorch怎么用?手把手带你安装配置
  10. O036、Snapshot Instance 操作详解
  11. 中国水平电泳系统市场趋势报告、技术动态创新及市场预测
  12. matlab读取adtx文件,求大家帮我看看下面中matlab中的程序问题出在哪里? - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  13. dw cs 5 安装失败解决方案
  14. 【谷月老师讲WPS】用 Windows 11 的 WSL 安装 WPS for Linux
  15. 判断ipad横竖屏的两个方法
  16. 为什么视频云服务会被各行业广泛看好?
  17. 苹果IOS模拟器电脑版用哪个好 逍遥模拟器玩部分苹果账号互通
  18. MaskRNN Instance Level Video Object Segmentation 论文翻译
  19. iOS 非越狱下的代码注入
  20. mysql unix_timestamp now() dfdfd f_数据库函数lpad的搜索结果-阿里云开发者社区

热门文章

  1. Python3学习笔记-字符串和字符串操作
  2. ThinkSNS电商系统,带你玩转社群经济
  3. 《NX-OS与Cisco Nexus交换技术:下一代数据中心架构(第2版)》一2.9 本章小结...
  4. Gitlab的管理使用手册
  5. JS 表单submit() 提交无效的问题
  6. oracle 主要语句大荟萃
  7. Android自定义的属性使用双向绑定
  8. 程序员笔记 CherryTree 0.99.28 发布
  9. 微服务架构学习笔记(一):重新认识微服务
  10. vue 方法回调通知执行下一个方法