范围最小查询,动态数组,区间树,treap

时间:2018-01-03 22:43:48

标签: algorithm data-structures dynamic-arrays b-tree segment-tree

我需要一种在Python中具有一些数据结构的算法,在给出两个新元素e1,e2时的每一步都是这样的:

  • 找到第一个和第二个给定元素的插入位置(保存顺序)。
  • 在两个插入位置之间的间隔中找到元素的最大值。
  • 插入先前找到的第二个给定元素的插入位置,第二个给定元素与在区间中找到的最大值配对加上常量。除非第二个给定元素已经存在,否则我们只需要在新值更大时更新其值。

此步骤必须在不超过对数时间内完成,因为当此步骤重复N次时,总体最坏情况时间复杂度不能远离O(NlogN)。

- 例如: my_list = [(2,1),(4,3),(5,7),(9,1)]

如我们所见,元素2与其赋值1配对,元素4与值3配对,5与值7配对,9与值1配对。并且my_list按第一个元素排序对

现在,给出了两个元素,e1 = 3,e2 = 6.

my_list中的插入位置(e1,)==(3,)是索引1,插入位置(6,)是索引3.

在索引1和3之间的my_list元素中找到的最大值是值7,因为(4,3),(5,7)的最大值是7.

想象一下,要添加的常数是1,我们得到:找到的最大值+常数== 7 + 1 == 8。 我们有e2 == 6,所以要插入的对是(6,8)在索引3。

在此步骤结束时,my_list必须是:[(2,1),(4,3),(5,7),(6,8),(9,1)]

- 这个question linked here非常相似,但我对插入元素的索引的问题不同。在那个问题中,元素被添加到末尾(附加),在我的情况下,插入必须以保持元素顺序的方式完成,以便在对数时间内找到下一个任意间隔的开始和结束。这就是为什么我认为除了使用范围最小查询之外,我还需要使用一些高级数据结构,如间隔树或treap。

1 个答案:

答案 0 :(得分:1)

对于这种类型的工作,我通常使用增强的B +树。请参阅此处了解B +树的内容:https://en.wikipedia.org/wiki/B%2B_tree

从B +树开始,我会扩充所有内部节点,以便连同每个指向子节点的指针,它存储与以该子节点为根的子树中的所有键相关联的最大值。

额外的信息可以很容易地计算O(log N)中任何时间间隔的最大值,并且在插入,删除和修改树中的项目时很容易维护,而不会改变O(log N)复杂度那些行动。

对于内存中的B +树,每个节点最多8个密钥通常是高性能的。