字典树入门及实现(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中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与