当前位置: 首页 > news >正文

数据结构与算法-前缀树

数据结构与算法-前缀树详解

  • 1 何为前缀树
  • 2 前缀树的代码表示及相关操作

 

1 何为前缀树

 
前缀树 又称之为字典树,是一种多路查找树,多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。

性质:不同字符串的相同前缀只保存一份。

操作:查找,插入,删除

例如 字符数组
[“abc”,“bck”,“abd”,“ace”]
构建成一颗前缀树


 

2 前缀树的代码表示及相关操作

 

 

前缀树中的节点

 

coding

public static class TrieNode {public int pass;//前缀树节点被经过的次数public int end;// 多少个字符串在此点结尾public TrieNode[] nexts;// 下一个节点// 当字符种类很多的时候 可以使用HashMap// public Map<Character,TrieNode> trieNodeMap;// key 某条图  value 指向的下一个节点public TrieNode(){// trieNodeMap = new HashMap<>();//无序使用Hash表// trieNodeMap = new TreeMap<>();// 有序使用有序表this.pass = 0;this.end = 0;nexts = new TrieNode[26];}
}

 

前缀树代码表示及相关操作

 

public static class Trie {private TrieNode root;//头结点public Trie() {this.root = new TrieNode();}/*** 将字符串word加入到前缀树中** @param word*/public void insert(String word) {if (word == null) {return;}char[] chars = word.toCharArray();TrieNode node = root;node.pass++;int index = 0;// 从左往右遍历字符串for (int i = 0; i < chars.length; ++i) {// 由字符计算得出 该走哪条路index = chars[i] - 'a';//如果没有此字符的路 则新建if (node.nexts[index] == null) {node.nexts[index] = new TrieNode();}//来到下一个节点node = node.nexts[index];node.pass++;}node.end++;}/*** @param word* @return 字符串在前缀树中加入过几次*/public int search(String word) {if (word == null) {return 0;}// 临时前缀树节点 用于遍历前缀树TrieNode node = root;char[] chars = word.toCharArray();int index = 0;for (int i = 0; i < chars.length; ++i) {index = chars[i] - 'a';// 没有通往当前字符串的路 则说明没有加入过这个字符串 直接返回 0if (node.nexts[index] == null) {return 0;}// 下一个节点node = node.nexts[index];}// 所有字符的路都有  则返回最后一个节点的 end 值return node.end;}/*** @param pre* @return 有多少个字符串是以 pre开头的*/public int prefixNumber(String pre) {if (pre == null) {return 0;}TrieNode node = root;int index = 0;char[] chars = pre.toCharArray();for (int i = 0; i < chars.length; ++i) {index = chars[i] - 'a';if (node.nexts[index] == null) {return 0;}node = node.nexts[index];}return node.pass;}/*** 删除前缀树中的字符串word** @param word*/public void delete(String word) {if (search(word) != 0) { // 前缀树中存在字符串再删除char[] chars = word.toCharArray();TrieNode node = root;node.pass--;int index = 0;// 遍历每一个节点 将节点的pass值减 1for (int i = 0; i < chars.length; ++i) {index = chars[i] - 'a';if (--node.nexts[index].pass == 0) {node.nexts[index] = null;return;}node = node.nexts[index];}node.end--;}}
}
http://www.lryc.cn/news/184608.html

相关文章:

  • DirectX12_Windows_GameDevelop_3:Direct3D的初始化
  • 基于粒子群优化算法、鲸鱼算法、改进的淘沙骆驼模型算法(PSO/SSA/tGSSA)的微电网优化调度(Matlab代码实现)
  • 数据分析篇-数据认知分析
  • 【力扣-每日一题】714. 买卖股票的最佳时机含手续费
  • 【代码实践】HAT代码Window平台下运行实践记录
  • 机器学习-Pytorch基础
  • 金九银十,刷完这个笔记,17K不能再少了....
  • 精确到区县级街道乡镇行政边界geojson格式矢量数据的获取拼接实现Echarts数据可视化大屏地理坐标信息地图的解决方案
  • 【Python 千题 —— 基础篇】多行输出
  • AdaBoost(上):数据分析 | 数据挖掘 | 十大算法之一
  • Py之pygraphviz:pygraphviz的简介、安装、使用方法之详细攻略
  • acwing算法基础之基础算法--前缀和算法
  • 华为云云耀云服务器L实例评测|Ubuntu 22.04部署edusoho-ct企培版教程 | 支持华为云视频点播对接CDN加速
  • 土木硕设计院在职转码上岸
  • js查询月份开始和结束日期
  • mybatis开发部分核心代码
  • Springboot中查看gradle工程使用了哪些仓库
  • c#中的接口
  • 老卫带你学---leetcode刷题(76. 最小覆盖子串)
  • Maven-DskipTests和-Dmaven.test.skip=true的区别
  • conda中cuda、cuda-toolkit、cuda-nvcc、cuda-runtime的区别
  • 增强现实抬头显示AR-HUD
  • 力扣-367.有效的完全平方数
  • 小白必看!上位机控制单片机原理
  • 通过套接字手动写一个回显服务器吧
  • python读取CSV格式文件,遇到的问题20231007
  • 【面试题精讲】为什么重写equals时必须重写hashCode方法?
  • 一文搞懂pytorch hook机制
  • 文本挖掘入门
  • 【C++ techniques】Smart Pointers智能指针