字典树入门及实现(JAVA)

2024-09-03 13:38
文章标签 java 实现 入门 字典

本文主要是介绍字典树入门及实现(JAVA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。 典型应用是用于统计和排序大量的字符串(但不仅限于字符串), 所以经常被搜索引擎系统用于文本词频统计。

它的优点是:
  利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。

  比如说我们想储存3个单词,sky、skyline、skymoon。如果只是单纯的按照以前的字符数组存储的思路来存储的话,那么我们需要定义三个字符串数组。但是如果我们用字典树的话,只需要定义一个树就可以了。在这里我们就可以看到字典树的优势了。

它有三个基本性质:
(1)根节点不包含字符;
(2) 除根节点外每一个节点都只包含一个字符:
(3) 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。



字典树的插入,删除和查找都非常简单,用一个一重循环即可。
1. 从根节点开始一次搜索
2. 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索
3. 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索
4. 迭代过程...
5. 在某个节点处,关键词的所有字母已被取出,则读取附在该节点上的信息,即完成查找

例:
   Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

Input
  输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束.

Output
对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input
banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output
2
3
1
0

代码: (字典树模板)

import java.util.LinkedList;  
public class Trie {     private int SIZE = 26;private TrieNode root;  //字典树的根Trie() {  //初始化字典树root = new TrieNode();  }  private class TrieNode {  //字典树节点private int num;//有多少单词通过这个节点,即节点字符出现的次数 private TrieNode[] son;// 所有的儿子节点private boolean isEnd;//是不是最后一个节点private char val;// 节点的值 TrieNode() {  num = 1; son = new TrieNode[SIZE];  isEnd = false;  }  }  //建立字典树public void insert(String str) {  //在字典树中插入一个单词if (str == null || str.length() == 0) {  return;}  TrieNode node = root;  char[] letters=str.toCharArray();  for (int i = 0, len = str.length(); i < len; i++) {  int pos = letters[i] - 'a';  if (node.son[pos] == null) {  node.son[pos] = new TrieNode();  node.son[pos].val = letters[i];  } else {  node.son[pos].num++; }  node = node.son[pos];  }  node.isEnd = true;  }  public int countPrefix(String prefix){  //计算单词前缀的数量if(prefix==null||prefix.length()==0){  return -1;  }  TrieNode node=root;  char[] letters=prefix.toCharArray();  for(int i=0,len=prefix.length();i< len;i++){  int pos=letters[i]-'a';  if(node.son[pos]==null){  return 0;  }else{  node=node.son[pos];  }  }  return node.num;  }  // 在字典树中查找一个完全匹配的单词.  public boolean has(String str) {  if (str == null || str.length() == 0) {  return false;  }  TrieNode node = root;  char[] letters=str.toCharArray();  for (int i = 0, len = str.length(); i < len; i++) {  int pos = letters[i] - 'a';  if (node.son[pos] != null) {  node = node.son[pos];  } else {  return false;  }  }  return node.isEnd;  }  //前序遍历字典树.  public void preTraverse(TrieNode node){  if(node!=null){  System.out.print(node.val+"-");  for(TrieNode child: node.son){  preTraverse(child);  }  }  }  public TrieNode getRoot(){  return this.root;  }  public static void main(String[] args) {  Trie tree = new Trie();  String[] strs={  "banana","band","bee","absolute","acm",};String[] prefix={"ba","b","band","abc",};for(String str : strs){  tree.insert(str);}  System.out.println(tree.has("abc"));  tree.preTraverse(tree.getRoot());  System.out.println();  //tree.printAllWords();  for(String pre : prefix){  int num=tree.countPrefix(pre);  System.out.println(pre+" "+num);  }  }  
}  
运行:


________________________________________________________________________________________________________________________________

转载出处http://www.java3z.com/cwbwebhome/article/article8/83591.html?id=4750

这篇关于字典树入门及实现(JAVA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133113

相关文章

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4