数据结构与算法之前缀数
数据结构与算法之前缀数
目录
- 前缀数
1. 前缀数
(一)前缀数描述
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
它有3个基本性质:
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 每个节点的所有子节点包含的字符都不相同。
引自博客园:https://www.cnblogs.com/luosongchao/p/3239521.html
示意图:
(二)代码实现
(1)思路
insert操作
- 判断输入的字符串是否为null,null直接返回。
- 将字符串转化成char数组,创建TrieNode node指向root节点,并创建变量index用来记录从哪个桶找
- 遍历char数组,index = char[i]-‘a’ ,得到去哪个桶找
- 如果桶为null,则创建TrieNode,否则node指向下一个节点,path++(表示有多少个节点到达过)
- 退出for循环,end++(表示有多少个字符串以它结尾)
search操作
- 和insert操作相似,不同点在于如果桶第4步桶为null,返回0.
- 退出for循环后返回end即可。
delete操作
- 判断前缀树是否有要删除的word。
- 如同添加一样,index获取要删除单词的那个桶,沿途找下去–path,循环结束后end–。
(2)代码实现
public class Code_TrieTree {public static class TrieNode {public int path;public int end;public TrieNode[] nexts;public TrieNode() {path = 0;end = 0;nexts = new TrieNode[26];}}public static class Trie {private TrieNode root;public Trie() {root = new TrieNode();}public void insert(String word) {if (word == null) {return;}char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.nexts[index] == null) {node.nexts[index] = new TrieNode();}node = node.nexts[index];node.path++;}node.end++;}public void delete(String word) {if (search(word) != 0) {char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (--node.nexts[index].path == 0) {node.nexts[index] = null;return;}node = node.nexts[index];}node.end--;}}public int search(String word) {if (word == null) {return 0;}char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.nexts[index] == null) {return 0;}node = node.nexts[index];}return node.end;}public int prefixNumber(String pre) {if (pre == null) {return 0;}char[] chs = pre.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.nexts[index] == null) {return 0;}node = node.nexts[index];}return node.path;}}public static void main(String[] args) {Trie trie = new Trie();System.out.println(trie.search("zuo"));trie.insert("zuo");System.out.println(trie.search("zuo"));trie.delete("zuo");System.out.println(trie.search("zuo"));trie.insert("zuo");trie.insert("zuo");trie.delete("zuo");System.out.println(trie.search("zuo"));trie.delete("zuo");System.out.println(trie.search("zuo"));trie.insert("zuoa");trie.insert("zuoac");trie.insert("zuoab");trie.insert("zuoad");trie.delete("zuoa");System.out.println(trie.search("zuoa"));System.out.println(trie.prefixNumber("zuo"));}}
数据结构与算法之前缀数相关推荐
- 数据结构与算法之LeetCode-15-三数之和
数据结构与算法之二叉树遍历(JavaScript递归实现) 数据结构与算法之深度遍历与广度遍历(DFS&BFS) 数据结构与算法之LeetCode 844. 比较含退格的字符串 LeetCod ...
- python【数据结构与算法】选数问题(指定值求和——递归)
def rec_subset(arr, i, s):if s == 0:return Trueelif i == 0:return arr[0] == s
- python【数据结构与算法】选数问题(选不相连最大值——DP)
#要求数字不相连 def rec_opt(arr ,i):if i== 0:return arr[0]elif i == 1:return max(arr
- 树的高度从零还是一开始数_数据结构与算法之1——树与二叉树
数据结构一直是让人头疼,面试遇到手撕算法题时真是慌得不行,从啥也不会刷题刷到游刃有余,路漫漫其修远兮~~.本人还是个算法菜鸟,而且还是想转行互联网的半吊子(好想拿大厂offer啊,幻想中..),希望能 ...
- 输入一个数寻找丑数C语言,数据结构与算法试题80道.doc
数据结构与算法试题80道 由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到, ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- 数据结构与算法--丑数
找出排在第n位大的丑数 丑数:我们将只包含质因子 2,3,5的数称为丑数(ugly Number).求按从小到大的熟悉怒排列的低1500 个丑数.例如6,8 都是丑数,但是14 不是丑数,因为他包含质 ...
- 数据结构与算法--将数组排成最小的数
将数组排成最小的数 题目:输入一个正整数的数组,将数组中所有数字拼接在一起排列成一个新的数,打印能拼接出来的所有数字中最小的一个, 案例:输入数组{12,4,55},则能打印出最小的数组是:12455 ...
- 怎样将树的中序遍历的数输入到一个数组中_数据结构与算法-二叉查找树平衡(DSW)...
上一节探讨了二叉查找树的基本操作,二叉查找树的查找效率在理想状态下是O(lgn),使用该树进行查找总是比链表快得多.但是,该论点并不总是正确,因为查找效率和二叉树的形状息息相关.就像这样: 图1-1给 ...
最新文章
- PAT甲级1012 The Best Rank :[C++题解]4个成绩取排名最低:排序、二分(好题)
- 能从入门到精通的 Docker 学习指南
- word 分栏后转html,分栏怎么让两边一样 怎样让word文档分栏而顺序不变
- linux frame buffer 显示图片 没有颜色,新路程----linux framebuffer显示图片c程序
- mysql 编辑 条目,mysql函数:将旧条目旋转到归档表
- Python(七)Socket编程、IO多路复用、SocketServer
- Java-多线程第一篇多线程相关认识(1)
- 【4】基于深度神经网络的脑电睡眠分期方法研究(训练模型)
- 初学Python,需要装什么软件?
- 专家修炼-学习的方法
- 空间计量 python_空间计量经济学与Stata实现
- 艾司博讯:怎么增加拼多多访客数
- 以古为新 洒脱自然 ——魏沁的书法艺术
- 关于Clipper库使用小结
- 分享一下 各类学习网站
- maven打印依赖树到文件中
- 多家大企业受GoAnywhere 0day 漏洞攻击影响
- 例题8-13:环形跑道
- 讲解开模行程板要注意的事项
- 6531E平台HTTPS接口调试
热门文章
- 阿里数据库内核月报:2015年11月
- Windows环境下使用 Caffe在ImageNet上训练网络
- Cool!15个创意的 CSS3 文本效果【下篇】
- Releasing Contexts 释放上下文
- 2021牛客多校3 - Black and white(思维+最小生成树)
- Java GridBagConstraints的帮助类:GBC
- CodeForces - 1454F Array Partition(线段树+二分)
- 中石油训练赛 - Flow Finder(树上模拟)
- 牛客 - 配对(贪心+数学)
- java 异或_脚本语言系列之Java | Java中的运算符