1

我需要一种在 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)]

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

4

1 回答 1

1

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

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

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

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

于 2018-01-04T03:04:21.830 回答