我需要一种在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。
答案 0 :(得分:1)
对于这种类型的工作,我通常使用增强的B +树。请参阅此处了解B +树的内容:https://en.wikipedia.org/wiki/B%2B_tree
从B +树开始,我会扩充所有内部节点,以便连同每个指向子节点的指针,它存储与以该子节点为根的子树中的所有键相关联的最大值。
额外的信息可以很容易地计算O(log N)中任何时间间隔的最大值,并且在插入,删除和修改树中的项目时很容易维护,而不会改变O(log N)复杂度那些行动。
对于内存中的B +树,每个节点最多8个密钥通常是高性能的。