文本词频统计的利器 Trie树

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

字典树简介

Trie树

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

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

性质

它有3个基本性质:

(1)根节点不包含字符,除根节点外每一个节点都只包含一个字符;

(2)从根节点到某节点,路径上经过的字符连接起来,为该节点对应的字符串;

(3)每个节点的所有子节点包含的字符都不相同。

基本操作

                   其基本操作有:查找、插入和删除,当然删除操作比较少见。

实现方法

搜索字典项目的方法为:

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

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

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

(4) 迭代过程……

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

其他操作类似处理

应用举例

串的快速检索

给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。

在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。

“串”排序

给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出

用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。

最长公共前缀

对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为当时公共祖先问题。


列如 :我们有and,as,at,cn,com这些关键词,将如下建树

网络异常,图片无法展示
|

代码实现:

    trie[root][id]=tot;  root 为 根节点(父节点),id 为子节点或字符的映射,tot 为节点的编号 或者标记

(1)插入操作:

voidinsert(char*s){//插入单词inti,id,len,root=0; len=strlen(s);
for(i=0;i<len;i++){ 
id=s[i]-'a';//按ASCII编号映射(子节点)if(!trie[root][id])trie[root][id]=++tot;没存在字典树中加入编号(标记)root=trie[root][id]; //跟着树分支走    }
}

(2)查询操作:

intsearch(char*s){//查询单词inti,len,id,root=0;len=strlen(s);
for(i=0;i<len;i++){
id=s[i]-'a';//按ASCII 映射 (子节点)if(!trie[root][id])return0;
root=trie[root][id];
    }
return1;
}

(3)删除操作:

      此方法适用标记型插入方法

voiddelete(char*s){//假定s一定存在inti,len,id,root=0;len=strlen(s);
for(i=0;i<len;i++){
id=s[i]-'a';
root=trie[root][id];
    }
trie[root][id]=0;
}
目录
相关文章
|
NoSQL Ubuntu 测试技术
GRPC C++开发环境搭建
GRPC C++开发环境搭建
882 1
|
前端开发
十分钟封装一个好用的axios,省时又省力他不香吗
十分钟封装一个好用的axios,省时又省力他不香吗
191 1
|
机器学习/深度学习 搜索推荐 算法
优秀的推荐系统架构与应用:从YouTube到Pinterest、Flink和阿里巴巴
优秀的推荐系统架构与应用:从YouTube到Pinterest、Flink和阿里巴巴
433 0
|
SQL Oracle 关系型数据库
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
【MySQL异常】1093 - You can‘t specify target table ‘daily_job‘ for update in FROM clause
462 0
|
7月前
|
监控 安全 Cloud Native
企业网络架构安全持续增强框架
企业网络架构安全评估与防护体系构建需采用分层防御、动态适应、主动治理的方法。通过系统化的实施框架,涵盖分层安全架构(核心、基础、边界、终端、治理层)和动态安全能力集成(持续监控、自动化响应、自适应防护)。关键步骤包括系统性风险评估、零信任网络重构、纵深防御技术选型及云原生安全集成。最终形成韧性安全架构,实现从被动防御到主动免疫的转变,确保安全投入与业务创新的平衡。
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
475 13
|
XML Java 数据格式
Java一分钟之-JAXB:Java对象到XML绑定
【6月更文挑战第1天】Java Architecture for XML Binding (JAXB) 是Java平台标准,用于自动转换Java对象和XML。它通过注解实现声明式映射,简化XML处理。本文介绍了JAXB的基本使用、常见问题和最佳实践,包括对象到XML(Marshalling)和XML到对象(Unmarshalling)过程,并通过示例展示如何在Java类和XML之间进行转换。注意类型匹配、注解冲突和JAXB上下文创建等问题,以及如何优化性能和避免循环引用。
788 3
|
自然语言处理 前端开发 数据可视化
Quarto ppt模板制作与Rstudio git连接
本文介绍了当前PPT演示中流行的Quarto文档使用情况,以及如何在Rstudio中连接Git进行版本控制。重点讲解了Quarto的ppt模板制作流程,包括安装、创建演示文稿及自定义样式等步骤,并提供了相关资源链接。
316 0
Quarto ppt模板制作与Rstudio git连接
|
机器学习/深度学习 存储 自然语言处理
使用Python实现深度学习模型:语言翻译与多语种处理
【7月更文挑战第21天】 使用Python实现深度学习模型:语言翻译与多语种处理
538 0
|
设计模式 Java
Java设计模式之桥接模式详解
Java设计模式之桥接模式详解