我需要一种在 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。
(e1, ) == (3, ) 在 my_list 中的插入位置为索引 1,(6, ) 的插入位置为索引 3。
在 my_list 的索引 1 和 3 之间的元素中找到的最大值是值 7,因为 (4,3)、(5,7) 的最大值是 7。
假设要添加的常数是 1,我们有:找到最大值 + 常数 == 7 + 1 == 8。我们有 e2 == 6,所以要插入的对是索引 3 处的 (6, 8)。
在这一步结束时,my_list 必须是:[(2,1), (4,3), (5,7), (6,8), (9,1)]
- 这里链接的这个问题非常相似,但与我关于插入元素的索引的问题不同。在那个问题中,元素被添加到最后(附加),在我的情况下,插入必须以保留元素顺序的方式完成,以便可以在对数时间内找到下一个任意间隔的开始和结束. 这就是为什么我认为,除了使用范围最小查询之外,我还需要使用一些高级数据结构,例如区间树或树形图。