繁体   English   中英

用Java压缩后缀数组

[英]Compressing Suffix Arrays in Java

我已经使用Princeton实现创建了一个后缀数组。 但是,我的基本文本文档非常非常大,因此,后缀数组的大小超过500mb。 有没有办法压缩后缀数组?

谢谢!

与前面的答案相反,您不仅可以压缩后缀数组,而且实际上压缩后缀通常是通过先使用后缀数组模拟树然后对其进行压缩来实现的。

我不知道后缀数组压缩的任何现成的Java实现 ,并且涉及各种现有算法,因此在此不进行详细描述。 Navarro和Mäkinen撰写了一篇论文 (DOI 10.1145 / 1216370.1216372),其中提供了详细的说明和比较。

但是从广义上讲,有两种通用方法

方法A:直接减小数组的大小 (请参见本文的7.1节)。 这涉及存储后缀数组的某些条目,并在需要时插补丢失的条目。 使用函数(在本文中称为ψ)进行插值,该函数本身以大数组(但不如原始后缀数组大)和索引位向量的形式存储。

方法B:FM方法 (请参阅本文第9节)。 在这里,后缀数组基本上由相对短的数组C代替,该数组C指示主要词典存储区(即以相同的初始字符开头的后缀组)的起始位置(在后缀数组中),并与另一个相对较大的数据结构Occ相结合启用所谓的向后搜索 具体地,给出的搜索模式p = C 1 ..c ,它使得有可能迭代地进一步缩小为串c M-1 C M更小的桶的桶为字符C M,然后在铲斗为C M -2 c m-1 c m依此类推,直到找到完整图案p的最终范围。 启用此功能的数据结构Occ很大,但可以使用各种技术(尤其是小波树)进行压缩。

对搜索效果的影响
上面引用的论文包含仔细的分析和比较。 但是从广义上讲,压缩后缀数组将导致搜索长度为m的模式(如果仔细实施,则可以在未压缩的后缀数组中为O(m))延迟一个因数(通常为对数)整个文本的长度 此外,任何利用小波树的方法都意味着对字母大小额外依赖

据我所知,您不能压缩后缀数组(也许我只是不知道),但是可以压缩后缀树。 因此,您可以考虑更改数据结构。 只是Google压缩后缀树。

由于它们可以存储大量数据,因此在遗传测序和常见的子字符串问题中大量使用。

可以在这里找到说明: http : //bioinformatics.oxfordjournals.org/content/23/5/629.abstract
如果您单击底部的链接,则会带您到此页面,您可以在此页面上下载压缩后缀树的代码: http : //www.cs.helsinki.fi/group/suds/cst/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM