算法-前缀树(单词查找树)
package code; /** * 前缀树(单词查找树) * 是一种树形结构; 用于保存大量的字符串。 * 优点:利用字符串的公共前缀来节约存储空间。 * 字母放在路径上,节点上存储到该节点的字符数pass以及以该节点为终点的字符数end * * @Author jiucaiyuan 2022/4/15 23:30 * @mail services@jiucaiyuan.net */ public class TrieTree { public static class TrieNode { /** * 到该路径的次数 */ public int pass; /** * 以该路径为结尾的次数 */ public int end; /** * 当前节点到字符x的路径是否有 * 如果有,则路径是nexts['x'-'a'] != null,具体次数是nexts['x'-'a'].pass,作为结果的次数为nexts['x'-'a'].end * 如果没有,则路径是nexts['x'-'a'] == null * 【注意】 * 1.如果字符不只是a~z,特别多,可以用 `HashMap<Char,Node> nexts` 类型来表示 * 2.如果需要下游路是有序组织的,可以使用`TreeMap<Char,Node> nexts`有序表来表示 */ public TrieNode[] nexts; public TrieNode() { pass = 0; end = 0; //nexts[0] == null,表示没有走向`a`的路 //nexts[0] != null,表示有走向`a`的路 //... //nexts[25] != null,表示有走向`z`的路 nexts = new TrieNode[26]; } } public static class Trie { /** * root.pass 表示加入前缀树树中单词(字符串)个数 * root.end 表示加入前缀树中空字符串的个数 * node.pass 表示加入到前缀树中以root到当前字符的字符串为前缀的字符串个数 * node.end 表示加入到前缀树中以root到当前字符的字符串的个数 */ private TrieNode root; public Trie() { root = new TrieNode(); } /** * 向前缀树中加入单词 (实现只支持小写字母a~z组成的单词) * * @param word */ public void insert(String word) { if (word == null) { return; } char[] chs = word.toCharArray(); TrieNode node = root; node.pass++; 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(); } //经过某条路时,边的to节点node记录经过信息 node = node.nexts[index]; node.pass++; } //加完该字符串后,结尾数累加1 node.end++; } /** * 删除前缀树中某个字符串 * * @param word */ public void delete(String word) { if (search(word) == 0) { //确定在树中,再进行删除操作 return; } char[] chs = word.toCharArray(); TrieNode node = root; node.pass--; int index = 0; for (int i = 0; i < chs.length; i++) { index = chs[i] - 'a'; if (--node.nexts[index].pass == 0) { node.nexts[index] = null; //如果删除此字符串后,没有通过了,设置为null return; } node = node.nexts[index]; } node.end--; } /** * 搜索字符串,返回该字符串之前加入过几次 * * @param word * @return */ 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; } /** * 加入的字符串当中,有几个是以prefix字符串为前缀的 * * @param prefix * @return */ public int prefixNumber(String prefix) { if (prefix == null) { return 0; } char[] chs = prefix.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.pass; } } }
日历
个人资料
diaba 寻求合作请留言或联系mail: services@jiucaiyuan.net
链接
最新文章
存档
- 2024年10月(1)
- 2024年8月(2)
- 2024年6月(4)
- 2024年5月(1)
- 2023年7月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(11)
- 2022年5月(6)
- 2022年4月(33)
- 2022年3月(26)
- 2021年3月(1)
- 2020年9月(2)
- 2018年8月(1)
- 2018年3月(1)
- 2017年3月(3)
- 2017年2月(6)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(1)
- 2016年9月(3)
- 2016年8月(4)
- 2016年7月(3)
- 2016年6月(4)
- 2016年5月(7)
- 2016年4月(9)
- 2016年3月(4)
- 2016年2月(5)
- 2016年1月(17)
- 2015年12月(15)
- 2015年11月(12)
- 2015年10月(6)
- 2015年9月(11)
- 2015年8月(8)
分类
热门文章
- SpringMVC:Null ModelAndView returned to DispatcherServlet with name 'applicationContext': assuming HandlerAdapter completed request handling
- Mac-删除卸载GlobalProtect
- java.lang.SecurityException: JCE cannot authenticate the provider BC
- MyBatis-Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Idea之支持lombok编译
标签
最新评论
- logisqykyk
Javassist分析、编辑和创建jav... - xxedgtb
Redis—常见参数配置 - 韭菜园 ... - wdgpjxydo
SpringMVC:Null Model... - rllzzwocp
Mysql存储引擎MyISAM和Inno... - dpkgmbfjh
SpringMVC:Null Model... - tzklbzpj
SpringMVC:Null Model... - bqwrhszmo
MyBatis-Improper inl... - 乐谱吧
good非常好 - diaba
@diaba:应该说是“时间的度量依据”... - diaba
如果速度增加接近光速、等于光速、甚至大于...
最新微语
- 从今天起,做一个幸福的人。喂马,砍柴,(思想)周游世界
2022-03-21 23:31
- 2022.03.02 23:37:59
2022-03-02 23:38
- 几近崩溃后,找到解决方法,总是那么豁然开朗!所以遇到问题要坚持!
2018-07-18 10:49
- 2018年关键字“走心”
2018-03-19 16:07
- 保护好自己最大的方法是让自己更强大,不要柔弱的像一只绵羊一样,得谁巴拉,就谁巴拉!
2017-12-20 10:24
发表评论: