更新大树结构“偏移”字段的有效方法

时间:2012-10-17 10:14:07

标签: list tree linked-list

我有一个大的(>百万元素)树,每个元素都有一个'offset'字段,引用外部的东西。我需要做两件事:

  1. 在任意位置插入新元素。每次插入都会导致后面元素的“偏移”字段增加一些量。
  2. 快速获取元素的偏移值。
  3. 如果2不是必需的,我会相对于前一个存储偏移,然后在插入后不需要更新所有内容。但这意味着我需要将每个先前的偏移量相加以计算一个元素的绝对值。

    有没有规范的方法来做这种事情?我想也许是妥协,例如,每个第n个元素都有一个绝对偏移量,其他元素的偏移量将相对于前一个绝对值,这意味着我必须在两种情况下进行少量遍历。 / p>

1 个答案:

答案 0 :(得分:1)

有一些方法有点基于你的想法,即让一些元素存储绝对偏移量。

其中一个(我认为它是tiered vector的一个版本)是存储第一个连续sqrt(N)元素的偏移量变化,然后是sqrt(N)到{{}的元素的变化1}}等等。然后,为了找到给定元素的偏移量,您需要对先前元素的所有连续总和(最多2 * sqrt(N),因为sqrt(N) + 1)求和,然后添加后面的元素最后一个整个组,但在您感兴趣的元素之前。这为您提供(sqrt(N) ^ 2) = N插入和查找时间。

您也可以将此方法提升到下一级别,并存储以下内容:

  • 整个时间间隔
  • 间隔的第一和第二半
  • 第1季度......第4季度等。

这样,您获得的数据结构类似于间隔或段树,但不完全相同。它可以使用简单数组实现为完整的二叉树。它为您提供了O(sqrt(N))两种操作的复杂性。

对这个想法的一些改进导致Binary Indexed Trees,它具有相同的复杂性,但占用了大约一半的空间。