An Efficient Digital Search Algorithm by Using a Double-Array Structure笔记
2014-01-20 19:15
351 查看
双数组trie树实现的第一篇论文,日本人JUN-ICHI AOE 1989年撰写的.
大概看完,简单记录下,可能有不准确的地方.
trie树有静态和动态两种,静态的直接就是一个DFA,没什么好说的,使用内存什么都比较确定而且最少.动态的可以支持删除和插入,双数组做法就是一种实现.
为了保证字典中所有词都不是其他词的前缀,在每个词后面加上#标识.双数组是指base和check这两个数组,base数组和check数组,一个状态用一个数字表示(这个数字是从1开始数),一个状态转移s->t(边为'a'),表示为:
base[s] + 'a' = t check[t] = s
base[s] = 0 && check[s] = 0则表示状态s不存在.
这样看起来这两个数组中很可能存在大量的空洞,但是这里做了一个优化,对于可以通过前缀判断是哪个词的那个状态,base数组保存的是一个负数值,这个负值的相反数是一个tail数组的索引,这个数组该索引出保存尾部这些字符串(所以实际上加上这个tail数组还是三个数组了),减少了状态数,也就减少了对base和check数组的占用,插入新词时如果按照base + char有冲突,则根据分支数量选取分支数量较少的那个节点做修改,这个状态是从之前空的状态去找空位,因此空洞并不是无限增加的.删除时直接设置那个状态的base和check为0,可供下次插入出现冲突时使用.
大概看完,简单记录下,可能有不准确的地方.
trie树有静态和动态两种,静态的直接就是一个DFA,没什么好说的,使用内存什么都比较确定而且最少.动态的可以支持删除和插入,双数组做法就是一种实现.
为了保证字典中所有词都不是其他词的前缀,在每个词后面加上#标识.双数组是指base和check这两个数组,base数组和check数组,一个状态用一个数字表示(这个数字是从1开始数),一个状态转移s->t(边为'a'),表示为:
base[s] + 'a' = t check[t] = s
base[s] = 0 && check[s] = 0则表示状态s不存在.
这样看起来这两个数组中很可能存在大量的空洞,但是这里做了一个优化,对于可以通过前缀判断是哪个词的那个状态,base数组保存的是一个负数值,这个负值的相反数是一个tail数组的索引,这个数组该索引出保存尾部这些字符串(所以实际上加上这个tail数组还是三个数组了),减少了状态数,也就减少了对base和check数组的占用,插入新词时如果按照base + char有冲突,则根据分支数量选取分支数量较少的那个节点做修改,这个状态是从之前空的状态去找空位,因此空洞并不是无限增加的.删除时直接设置那个状态的base和check为0,可供下次插入出现冲突时使用.
相关文章推荐
- Search a 2D Matrix IIWrite an efficient algorithm that searches for a value in an m x n matrix. This
- Algorithm: efficient way to remove duplicate integers from an array
- How to transfer data to an Excel workbook by using Visual C# 2005 or Visual C# .NET
- In Search of an Understandable Consensus Algorithm(翻译)
- [论文笔记] SHARK10: Using Rationale to Support Pattern-Based Architectural Design –by- Wei Wang, Janet E. Burge
- An efficient augmented Lagrangian method with applications to total variation minimization论文阅读笔记
- [论文笔记]An adaptive algorithm for failure recovery during dynamic service composition (PReMI@LNCS, 2007)
- A 2007 Office system application does not load an add-in that is developed by using VSTO
- xjc-beyond sliding windows-Object Localization by Efficient Subwindow Search
- How to write to an event log by using Visual C#
- iOS9-by-Tutorials-学习笔记二:App-Search
- Efficient Video Segmentation using Parametric Graph Partitioning阅读笔记(1)
- Paper Reading - In Search of an Understandable Consensus Algorithm(Raft)
- [论文笔记]Learning Deep Structured Semantic Models for Web Search using Clickthrough Data
- COM笔记 (1)SAMPLE: MFCAxs.exe Implements an Active Script Host Using MFC 用MFC实现script引擎host
- xjc-beyond sliding windows-Object Localization by Efficient Subwindow Search 论文的算法和知识点
- Beam Search Algorithm (Draft by Andrew Jungwirth)
- RBM-An approach for text summarization using deep learning algorithm
- Best-First Search Algorithm (Draft by Andrew Jungwirth)
- 《In Search of an Understandable Consensus Algorithm》翻译