前缀树

是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

字典树又称为前缀树或Trie树,是处理字符串常见的数据结构。假设组成所有单词的字符仅是“a”~"z",请实现字典树结构,并包含以下四个主要功能:

void insert(String word):添加word,可重复添加。
void delete(String word):删除word,如果word添加过多次,仅删除一次。
boolean search(String word):查询word是否在字典树中。
int prefixNumber(String pre):返回以字符串pre为前缀的单词数量。
思考:

字典树的介绍。字典树是一种树形结构,优点是利用字符串的公共前缀来节约存储空间。

 

基本性质:

字典树的基本性质如下:

  • 根节点没有字符路径。除根节点外,每一个节点都被一个字符路径找到。
  • 从根节点到某一节点,将路径上经过的字符连接起来,为扫过的对应字符串。
  • 每个节点向下所有的字符路径上的字符都不同。

也不需要记,看了实现,很自然的性质就理解了。

每个结点内有一个指针数组,里面有二十六个指针,分别指向二十六个字母。

如果指向某个字母的指针为空,那就是以前没有遇到过这个前缀。

 

搜索的方法为:

(1) 从根结点开始一次搜索;

(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。

(4) 迭代过程……

(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

其他操作类似处理

插入也一样,只是转到某个子树时,没有子树,那就创建一个新节点,然后对应指针指向新节点即可。

我们给出定义就更清楚了:

public static class TrieNode {public int path; //表示由多少个字符串共用这个节点public int end;//表示有多少个字符串是以这个节点结尾的public TrieNode[] map;//哈希表结构,key代表该节点的一条字符路径,value表示字符路径指向的节点public TrieNode() {path = 0;end = 0;map = new TrieNode[26];}
}

path和end都是有用的,接下来会说明

insert:

	    public static class Trie {private TrieNode root;//头public Trie() {root = new TrieNode();}public void insert(String word) {if (word == null) {return;}//空串char[] chs = word.toCharArray();TrieNode node = root;int index = 0; //哪条路for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a'; //0~25if (node.map[index] == null) {node.map[index] = new TrieNode();}//创建,继续node = node.map[index];//指向子树node.path++;//经过加1}node.end++;//本单词个数加1}
	        public boolean search(String word) {if (word == null) {return false;}char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.map[index] == null) {return false;//找不到}node = node.map[index];}return node.end != 0;//end标记有没有以这个字符为结尾的字符串}

delete: 

	        public void delete(String word) {//如果有if (search(word)) {char[] chs = word.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.map[index].path-- == 1) {//path减完之后为0node.map[index] = null;return;}node = node.map[index];//去子树}node.end--;//次数减1}}

prefixNumber:

 public int prefixNumber(String pre) {if (pre == null) {return 0;}char[] chs = pre.toCharArray();TrieNode node = root;int index = 0;for (int i = 0; i < chs.length; i++) {index = chs[i] - 'a';if (node.map[index] == null) {return 0;//找不到}node = node.map[index];}return node.path;//返回经过的次数即可}

好处:

1.利用字符串的公共前缀来节约存储空间。

2.最大限度地减少无谓的字符串比较,查询效率比较高。例如:若要查找的字符长度是5,而总共有单词的数目是26^5=11881376,利用trie树,利用5次比较可以从11881376个可能的关键字中检索出指定的关键字,而利用二叉查找树时间复杂度是O( log2n ),所以至少要进行log211881376=23.5次比较。可以看出来利用字典树进行查找速度是比较快的。

 

应用:

<1.字符串的快速检索

<2.字符串排序

<3.最长公共前缀:abdh和abdi的最长公共前缀是abd,遍历字典树到字母d时,此时这些单词的公共前缀是abd。

<4.自动匹配前缀显示后缀

我们使用辞典或者是搜索引擎的时候,输入appl,后面会自动显示一堆前缀是appl的东东吧。

那么有可能是通过字典树实现的,前面也说了字典树可以找到公共前缀,我们只需要把剩余的后缀遍历显示出来即可。

 

相关题目:

一个字符串类型的数组arr1,另一个字符串类型的数组arr2。

arr2中有哪些字符,是arr1中出现的?请打印。

arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印。

arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印arr2中出现次数最大的前缀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习4层板设计

今天是第一天尝试设计四层PCB板&#xff0c;以前只画过双层板&#xff0c;所以今天花了好多时间来熟悉多层板的设计方法&#xff0c;现在做一下整理&#xff0c;也方便其他同胞少走弯路~~~我用的软件是Altium Designer 6&#xff08;AD6&#xff09;步骤如下&#xff1a; 1、随…

PCB设计的基本步骤

一.方案的设计 1.与客户沟通&#xff0c;确定电路的功能和相关设计指标&#xff08;如&#xff1a;电源&#xff0c;功耗等&#xff09;。 2.画出项目的硬件功能框图。 3.设计出多种方案&#xff0c;并对多种方案进行对比&#xff0c;最终选出最合适的方案。 4.根据上述所…

堆应用例题三连

一个数据流中&#xff0c;随时可以取得中位数。 题目描述&#xff1a;有一个源源不断地吐出整数的数据流&#xff0c;假设你有足够的空间来保存吐出的数。请设计一个名叫MedianHolder的结构&#xff0c;MedianHolder可以随时取得之前吐出所有树的中位数。 要求&#xff1a; 1…

HistCite 的使用方法

摘要 读文献自然要读精品&#xff0c;在面对一个陌生领域&#xff0c;如何才能以最快速度定位精品文献呢&#xff1f;本文将详细介绍 HistCite 的使用方法&#xff0c;结合 Web of Science 和 Endnote &#xff0c;演示如何在几个小时之内&#xff0c;对某个陌生领域的文献进行…

数组基操三连(2)

转圈打印矩阵 题目&#xff1a; 给定一个整型矩阵matrix&#xff0c;请按照转圈的方式打印它。例如&#xff1a;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,打印结果为&#xff1a;1,2,3,4,5,12,16,15,14,13,9,5,6,7,11,10 要求&#xff1a; 额外空间复杂度为O&#xff08;1&a…

数据结构课上笔记7

介绍栈和队列基本概念和用法。 设输入序列1、2、3、4&#xff0c;则下述序列中&#xff08; &#xff09;不可能是出栈序列。【中科院中国科技大学2005】 A. 1、2、3、4 B. 4、 3、2、1 C. 1、3、4、2 D.&#xff14;、1、2、3 选…

ROC曲线与AUC值

ROC曲线与AUC值 1.概述AUC&#xff08;Area Under roc Curve&#xff09;是一种用来度量分类模型好坏的一个标准。这样的标准其实有很多&#xff0c;例如&#xff1a;大约10年前在machine learning文献中一统天下的标准&#xff1a;分类精度&#xff1b;在信息检索(IR)领域中常…

设置SSH免密码自动登录(使用别名)

每次登录服务器都要写一大串的用户名&#xff08;username服务器地址&#xff09;和登录密码十分的繁琐&#xff0c;所以本文就告诉大家如何通过修改配置文件&#xff0c;达到只需要输入&#xff1a;ssh jack(你起的别名)就可以一键登录到服务器中。 1.创建公钥&#xff08;相当…

串的定长表示

思想和代码都不难&#xff0c;和线性表也差不多&#xff0c;串本来就是数据受限的线性表。 串连接&#xff1a; #include <stdio.h> #include <string.h> //串的定长顺序存储表示 #define MAXSTRLEN 255 //用户可在255以内定义最大串长 typedef unsigned cha…

周志华《Machine Learning》 学习笔记系列(1)--绪论

机器学习致力于研究如何通过计算手段&#xff0c;利用经验来改善系统本身的性能&#xff0c;在计算机系统中&#xff0c;“经验”通常是以“数据”形式存在的&#xff0c;所以&#xff0c;机器学习的主要内容是关于在计算机上从数据中产生“模型”的算法&#xff0c;即学习算法…

轻松理解牛顿迭代法且用其求平方根

牛顿迭代法概述 牛顿迭代法&#xff08;Newton’s method&#xff09;又称为牛顿-拉弗森方法&#xff08;Newton-Raphson method&#xff09;&#xff0c;它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。 牛顿迭代公式 设rrr是f(x)0f(x)0f(x)0的根&#…

map+DP leetcode446

如果数字序列由至少三个元素组成并且任何两个连续元素之间的差异相同&#xff0c;则称为算术序列。 例如&#xff0c;这些是算术序列&#xff1a; 1&#xff0c;3&#xff0c;5&#xff0c;7&#xff0c;9 7&#xff0c;7,7&#xff0c;7 3&#xff0c;-1&#xff0c;-5&am…

如何使用cookie信息,完成自动登录

在做爬虫任务的时候&#xff0c;我们常常会遇到很多网页必须登录后&#xff0c;才可以开放某些页面。所以登录是爬取网页的第一步。但是&#xff0c;通过post表单&#xff08;包含用户名和密码&#xff09;的方法&#xff0c;对于那些不需要输入比较复杂的验证码的网页&#xf…

Spring Cloud 学习笔记(1 / 3)

Spring Cloud 学习笔记&#xff08;2 / 3&#xff09; Spring Cloud 学习笔记&#xff08;3 / 3&#xff09; ---01_前言闲聊和课程说明02_零基础微服务架构理论入门03_第二季Boot和Cloud版本选型04_Cloud组件停更说明05_父工程Project空间新建06_父工程pom文件07_复习Depend…

后缀树/后缀数组

字典树&#xff1a;https://blog.csdn.net/hebtu666/article/details/83141560 后缀树&#xff1a;后缀树&#xff0c;就是把一串字符的所有后缀保存并且压缩的字典树。 相对于字典树来说&#xff0c;后缀树并不是针对大量字符串的&#xff0c;而是针对一个或几个字符串来解决…

kaggle(02)-房价预测案例(基础版)

房价预测案例 Step 1: 检视源数据集 import numpy as np import pandas as pd读入数据 一般来说源数据的index那一栏没什么用&#xff0c;我们可以用来作为我们pandas dataframe的index。这样之后要是检索起来也省事儿。 有人的地方就有鄙视链。跟知乎一样。Kaggle的也是个处…

为什么Python中整型不会溢出

前言 本次分析基于 CPython 解释器&#xff0c;python3.x版本 在python2时代&#xff0c;整型有 int 类型和 long 长整型&#xff0c;长整型不存在溢出问题&#xff0c;即可以存放任意大小的整数。在python3后&#xff0c;统一使用了长整型。这也是吸引科研人员的一部分了&am…

如何使用github中的pull request功能?

* pull request是社会化编程的象征&#xff0c;通过这个功能&#xff0c;你可以参与到别人开发的项目中&#xff0c;并做出自己的贡献。pull request是自己修改源代码后&#xff0c;请求对方仓库采纳的一种行为*–《github入门与实践》 下面具体说一下github中使用pull reque…

「假装努力」

有多少人在「假装努力」&#xff1f; 又有多少人在「真正成长」&#xff1f; 再努力努力 回想起当年毕业后&#xff0c;在北京和室友合租的日子。 那时&#xff0c;我在工作&#xff0c;室友在培训。 一天&#xff0c;我下班回来&#xff0c;听见他在电话里和家人争吵&…

如何阅读论文?

本文主要讲述了如何才能高效的阅读一篇论文&#xff01;&#xff01;