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

Algorithm 范围最小查询,动态数组,区间树,treap,algorithm,data-structures,b-tree,segment-tree,rmq,Algorithm,Data Structures,B Tree,Segment Tree,Rmq,我需要一个在Python中具有某种数据结构的算法,当给定两个新元素e1、e2时,每一步都需要该算法: 查找第一个和第二个给定元素的插入位置(保持顺序) 查找两个插入位置之间间隔内元素的最大值 在先前找到的第二个给定元素的插入位置插入,第二个给定元素与间隔中找到的最大值加上一个常量配对。除非第二个给定元素已经存在,在这种情况下,我们只需要在新值更大时更新它的值 这一步必须在不超过对数的时间内完成,因为当这一步重复N次时,总体最坏情况下的时间复杂度不能远离O(NlogN) -- 例如: 我的清单

我需要一个在Python中具有某种数据结构的算法,当给定两个新元素e1、e2时,每一步都需要该算法:

  • 查找第一个和第二个给定元素的插入位置(保持顺序)
  • 查找两个插入位置之间间隔内元素的最大值
  • 在先前找到的第二个给定元素的插入位置插入,第二个给定元素与间隔中找到的最大值加上一个常量配对。除非第二个给定元素已经存在,在这种情况下,我们只需要在新值更大时更新它的值
这一步必须在不超过对数的时间内完成,因为当这一步重复N次时,总体最坏情况下的时间复杂度不能远离O(NlogN)

-- 例如: 我的清单=[(2,1)、(4,3)、(5,7)、(9,1)]

如我们所见,元素2与其赋值1配对,元素4与赋值3配对,元素5与赋值7配对,元素9与赋值1配对。我的_列表是按对的第一个元素排序的

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

(e1,)==(3,)的my_列表中的插入位置是索引1,(6,)的插入位置是索引3

在my_列表的元素中,索引1和3之间的最大值为7,因为(4,3)、(5,7)的最大值为7

假设要加的常数是1,我们有:找到的最大值+常数==7+1==8。 我们有e2==6,所以要插入的对在索引3处是(6,8)

在这一步结束时,我的清单必须是:[(2,1),(4,3),(5,7),(6,8),(9,1)]

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

对于这种类型的作业,我通常使用扩展的B+树。请参见此处了解B+树的含义:

从B+树开始,我将扩展所有内部节点,以便与指向子节点的每个指针一起,存储与该子节点所在子树中的所有键相关联的最大值

这些额外的信息使得计算O(logn)中任何时间间隔的最大值变得容易,并且在树中插入、删除和修改项目时易于维护,而无需更改这些操作的O(logn)复杂性


对于内存中的B+树,通常每个节点最多执行8个左右的键。

如果必须找到最大值的间隔为空,则可以跳过该步骤。您是否正在寻找实现,或者您的具体要求是什么,我不确定是否理解您的意思。:)@梅瑟姆-我希望有人能给我一个暗示。使用什么样的数据结构,是否一定可以用范围最小查询解决,等等。您需要在线算法还是可以接受批处理?@PetarPetrovic每个步骤中任意给定的两个元素从整个过程开始就不知道,如果这是您的意思的话。虽然它们可能可以预先计算。谢谢你的回答!我正在阅读关于B树和B+树的文章,然后我将尝试用Python实现它。Python中是否有一段基本的代码或框架,我可以修改以满足我的需要?我发现的唯一一个是GitHub上的“纯python B树和B+树实现”,但它有500多行代码,语法非常高级。我几乎不使用python,但如果你是说这个:那么它看起来是正确的。去掉B+树,保留B+树。摆脱删除/收缩/合并的东西,因为你只需要添加。只剩下几百行了