字典树入门及实现(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实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2