trie(字典树)原理及C++代码实现
字典树,又称前缀树,是用于存储大量字符串或类似数据的数据结构。
它的原理是利用相同前缀来减少查询字符串的时间。
不同于BST把关键字保存在本结点中,TRIE可以想象成把关键字和下一个结点的指针绑定,事实上我也是用map来实现的,所以不熟悉map的提前熟悉map的操作。
Tire的逻辑比较抽象,所以如果是第一次见到这种组织方式的建议先熟悉熟悉这种逻辑再开始写代码,这样会比较顺畅。
代码如下:(仅供参考)
struct Node {
public :
bool isWord;
unordered_map<char, Node*> next;
public :
Node(bool Isword = false) : isWord(Isword) {}
};
class Trie {
Node root;
int size;
public :
Trie() : size() {}
int getSize() {return size;}
void add(string word); //添加一个新单词
bool contains(string word); //查询是否有该单词
bool isPrefix(string prefix); //查询是否有单词以该prefix为前缀
void del(string word); //删除一个单词
};
void Trie::add(string word) {
Node *curr = &root;
for (int i = ; i < word.length(); ++i) {
Node* ptr = nullptr;
auto ret = curr->next.insert({word[i], ptr});
if (ret.second)
ret.first->second = new Node();
curr = ret.first->second;
}
if (!curr->isWord) {
curr->isWord = true;
++size;
}
}
bool Trie::contains(string word) {
const Node *curr = &root;
for (int i = ; i < word.length(); ++i) {
auto ret = curr->next.find(word[i]);
if (ret == curr->next.end()) {
return false;
}
curr = ret->second;
}
return curr->isWord;
}
bool Trie::isPrefix(string prefix) {
const Node *curr = &root;
for (int i = ; i < prefix.length(); ++i) {
auto ret = curr->next.find(prefix[i]);
if (ret == curr->next.end()) {
return false;
}
curr = ret->second;
}
return true;
}
void Trie::del(string word) {
if (!contains(word))
return ;
vector<Node*> preNode;
Node *curr = &root;
for (int i = ; i < word.length(); ++i) {
preNode.push_back(curr);
curr = curr->next.find(word[i])->second;
}
if (curr->next.size() == ) {
for (int i = word.length() - ; i >= ; --i) {
Node *pre = preNode.back();
preNode.pop_back();
if ((i != word.length() - ) && (curr->isWord || curr->next.size() != ))
break;
delete curr;
pre->next.erase(word[i]);
curr = pre;
}
} else {
curr->isWord = false;
}
--size;
}
trie(字典树)原理及C++代码实现的更多相关文章
- 标准Trie字典树学习二:Java实现方式之一
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- 数据结构 -- Trie字典树
简介 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 性质: 1. 根节 ...
- 踹树(Trie 字典树)
Trie 字典树 ~~ 比 KMP 简单多了,无脑子选手学不会KMP,不会结论题~~ 自己懒得造图了OI WIKI 真棒 字典树大概长这么个亚子 呕吼真棒 就是将读进去的字符串根据当前的字符是什么和所 ...
- Trie字典树 动态内存
Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...
- 算法导论:Trie字典树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- 817E. Choosing The Commander trie字典树
LINK 题意:现有3种操作 加入一个值,删除一个值,询问pi^x<k的个数 思路:很像以前lightoj上写过的01异或的字典树,用字典树维护数求异或值即可 /** @Date : 2017- ...
- 标准Trie字典树学习一:原理解析
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 字典树Trie学习一:原理解析 2.字典树Tr ...
- Trie(字典树)解析及其在编程竞赛中的典型应用举例
摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...
随机推荐
- react-native-tab-view 导航栏切换插件讲解
首先引入插件 yarn add react-native-tab-view 如果用的原生环境要安装另外几个插件 yarn add react-native-reanimated react-nativ ...
- selumium 中 xpath获取文本、属性正确写法
报错“The result of the xpath expression is: [object Attr]. It should be an element” yutube爬虫动态加载,需要用到s ...
- SAP_SD常用事务代码
1.创建/修改/显示销售订单:VA01/VA02/VA03 2.根据销售订单创建交货单:VL01N 3.修改/显示交货单:VL02N/VL03N 4.交货单发货过账:VL02N 5.发货过账冲销:VL ...
- 洛谷 P5662 纪念品
题目传送门 解题思路: 一道DP,完全背包,不过有点不同于模板.因为本题的每件物品可自由在不同的时间买卖,且不同时间价格不同. 这道题的关键在于要明白一个非常傻逼的性质,就是我在某天买了第i个物品,然 ...
- pycharm 的 使用 设置智能目录 Pycharm 断点跳转及 Step Over/Step Into/Step Out 等的区别
pycharm 右键点击文件夹 有个mark directiory as 根据需要给目录进行设置 Pycharm调试程序时,有时需要直接从第一个断点跳转至第二个断点,如果还是用单步调试的话就非常 ...
- 桥接 brctl
把eth0和wlan0桥接在一起 作用:测试wlan0网卡的并发性能 两个网卡桥接后把linux主机模拟成一个“无线路由交换机” Vi br0.sh #!/bin/bash ifconfig ...
- org.springframework.dao.CannotAcquireLockException异常分析
错误信息如下: 2017-09-27 16:27:16.153 - [com.ldyun.base.service.impl.BaseRetailOrderServiceImpl] - 新增零售商品订 ...
- 操作实践:Java桌面程序实现日志级别热修改
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 定位问题的时候往往需要动态修改日志级别并且不能影响业务的正常运行,也就是不能重启应用,此时就要使用到动态日 ...
- one_day_one_linuxCmd---netstat命令
<坚持每天学习一个 linux 命令,今天我们来学习 netstat 命令> 前言:netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态等,还可以很方便查看本地机器上 ...
- Python创建命令行应用的工具 tools for command line application in python
工具1:Docopt 地址:http://docopt.org/ 这个工具是根据模块的文档注释来确定参数的.注释分为两部分:Usage, option. \``` Usage: naval_fate ...