博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双数组Trie树高效构建有向无环图
阅读量:7234 次
发布时间:2019-06-29

本文共 1341 字,大约阅读时间需要 4 分钟。

图是很常见的一种结构了,不管是数据结构算法中的各种图结构,还是机器学习中的概率图。图主要是由若干顶点及连接两顶点的边所构成的图形,通过它可以用来描述某些事物之间的某种特定关系。

有向无环图

有向无环图,即 Directed Acyclic Graph,属于有向图,图结构中不存在环,可用来表示事件之间依赖关系。

Trie树

Trie 是一种搜索树,它的 key 都为字符串,通过 key 可以找到 value。能做到高效查询和插入,时间复杂度为O(k),缺点是耗内存。它的核心思想就是减少没必要的字符比较,使查询高效率,即用空间换时间,再利用共同前缀来提高查询效率。

Trie 树的根节点不包含字符,根节点到某节点的路径连起来的字符串为该节点对应的字符串,每个节点只包含一个字符,此外,任意节点的所有子节点的字符都不相同。

比如如下,将五个词语添加到 Trie 树中,最后的结构如图所示。

TrieTree tree = new TrieTree();tree.put("美利坚");tree.put("美丽");tree.put("金币");tree.put("金子");tree.put("帝王");复制代码

双数组Trie

Trie 树的实现可以有多种方法,主要的差异是存储结构的不同,不同的存储结构将导致占用空间不同。常见有定长数组方式、变长列表等。

而其中有一种方式能让性能和占用空间都达到较好水平,这就是双数组方式,即双数组 Trie 树。双数组意思就是由两个数组来实现存储,分别为 base 和 check 数组,它们时两个互相平行的数组。

base 数组和 check 数组记录了所有转换状态,假如接收了一个字符 c ,要从状态 s 移动到 t 的转移,则对应在双数组中的条件是:

check[base[s] + c] = sbase[s] + c = t复制代码

根据现有词典将所有状态都建立起来后,后面查询时则直接根据字与字之间的状态转换并根据 check 数组的值即可以判断是否已经完成单词的搜索,其中 base 数组主要作用是可以用来判断是否存在某些字到字的状态转换,而 check 数组则主要用来判断是否是一个完整词语。

有向无环图作用

比如对于这么个任务:存在一个大词典,要根据该词典找出一段文章包含的所有可能的词,这样就能从头到尾构建若干条路径,而且每个词对应的边都可能有不同的权重值,而最终将该段文章怎样分词取决于哪个路径的值最小或者哪个路径走到终点的概率最大。

为了构建这个有向无环图,会涉及到遍历大量数据集的问题,这正是引入双数组 Trie 树的原因,将耗时的搜索交给双数组 Trie 树,只需要从头到尾暴力匹配即能完成有向无环图的创建了。

继续优化?

引入 AC 自动机应该还能继续优化。

github

https://github.com/sea-boat/TextAnalyzer/blob/master/src/main/java/com/seaboat/text/analyzer/data/structure/DAGModel.java

-------------推荐阅读------------


跟我交流,向我提问:

欢迎关注:

转载地址:http://gvlfm.baihongyu.com/

你可能感兴趣的文章
ajax的工作原理
查看>>
Android GIS开发系列-- 入门季(14)FeatureLayer之范围查询
查看>>
IIC接口下的24C02 驱动分析
查看>>
fragmentTabHost 使用示例
查看>>
oop思维意识,类 模块命名空间,类扩展之继承 、组合、mixin三种模式
查看>>
让gcc和gdb支持intel格式的汇编
查看>>
Shell脚本8种字符串截取方法总结
查看>>
SQLServer------远程调用失败
查看>>
Module ngx_http_v2_module
查看>>
使用fiddler模拟http get
查看>>
OSG开源教程(转)
查看>>
一个缓存实现平均分配队列的方案
查看>>
How do I extract a single column from a data.frame as a data.frame
查看>>
Js获取后台集合List的值和下标的方法
查看>>
Jenkins~powershell+cmd发布nuget包包
查看>>
网络上的等待事件 —— SQL*Net message from client/dblink
查看>>
Myeclipse、eclipse安装lombok
查看>>
C# AES要解密的数据的长度无效
查看>>
JS 推断URL中是否含有 http:// 假设没有则自己主动为URL加上
查看>>
基于ELK5.1(ElasticSearch, Logstash, Kibana)的一次整合
查看>>