需要简要介绍数据简洁算法


14

(已经在主要网站上提出要求,但是在这里也要求获得更好的报道,抱歉)

由于我了解简洁的数据结构,因此迫切需要对这一领域的最新发展进行良好的概述。

我已经在Google上搜索并阅读了很多文章,这些文章是我在脑海中提出的,我可以在google搜索结果中看到的很多文章。我仍然怀疑我在这里错过了一些重要的事情。

以下是我特别感兴趣的主题:

  1. 二进制树的简洁编码,通过有效的操作来获取父树,左/右孩子,子树中的元素数量。

    这里的主要问题如下:我所知道的所有方法都假定树节点以呼吸优先顺序枚举(例如在该领域的先驱工作中,Jacobson,G. J(1988)。简洁的静态数据结构),该方法没有似乎适合我的任务。我处理的是深度优先布局中给出的巨大的二叉树,而深度优先节点索引是其他节点属性的关键,因此更改树布局对我来说有一些成本,我希望将其最小化。因此,有兴趣参考其他BF树布局来获得对作品的引用。

  2. 外部存储器中的大型可变长度项数组。数组是不可变的:我不需要添加/删除/编辑项目。唯一的要求是O(1)元素访问时间和尽可能低的开销,这比直接的偏移量和大小方法更好。这是一些我收集的有关典型数据的统计信息:

    典型的物品数量-数亿个,最高达数十毫巴;

    大约30%的项目的长度不超过1

    40%-60%的项目长度小于8位;

    只有百分之几的项目的长度在32到255位之间(限制为255位)

    平均项目长度〜4位+/- 1位。

    从理论上讲,商品长度的任何其他分布都是可能的,但所有实际有趣的情况下的统计数据都接近上述值。

链接到各种复杂性的文章,任何晦涩难懂的教程,或多或少有文献记载的C / C ++库,-在类似任务中对您有用的任何东西,或者您的有根据的猜测看起来像的东西-都应受到感激。

更新:我忘记添加问题1:我正在处理的二叉树是不可变的。我没有更改它们的要求,我只需要以各种方式遍历它们(总是从节点移动到子节点或到父节点),因此此类操作的平均成本为O(1)。

同样,典型的树有千千万万个节点,因此不应完全存储在RAM中。

Answers:


12

我假设您对在实践中高效的简洁外部存储器数据结构感兴趣。在这种情况下,您可以通过一些基本技术和一些工程来获得所需的东西。

对于树木,我将从阅读Arroyuelo等人:实践中的简洁树开始。本文讨论了主存储器中的树,但是大多数技术都可以在外部存储器中使用,并具有以下类似的选择。

至于第二个问题,最重要的选择是确定用于项目的编码。给定您描述的分布,我将首先尝试使用γ-代码δ-代码。选择编码后,下一步就是以大小为块的形式对数组进行编码,其中选择了块大小,以便随机读取磁盘大小为 在实践中非常有效。

为了快速找到正确的块,您需要一个位于主存储器中的等级字典。假设你有ñ 项目,您建立一个二进制序列 小号 长度 ñ,在哪里 小号[一世]=1个 iff项目 一世开始一个新的块。间隙编码可以很好地压缩序列。Gupta等人:压缩数据结构:字典和数据感知措施提供了这种索引的一个示例。如果您要查找项目Ĵ,那么您需要检索块 [R一种ñķĴ 并将其解码以获取物品。

如果要使等级索引保持较小,则必须使块大小很大(可能为千字节或数十千字节),从而使上述基本解决方案占用大量CPU。这可以通过在磁盘上存储的块上增加一些开销来解决。基本上,您递归地应用相同的解决方案,以便每个磁盘块存储许多小块以及另一个等级索引。检索正确的光盘块后,可以使用其中的等级索引找到要解码的正确小块,而不是解码整个块。使用此二级索引,即使使用可用的最快的固态驱动器,随机访问也可能会成为I / O绑定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.