[英]Structure like priority queue but with something like lower bound
我想要一个结构来存储(例如)我可以在其中插入和删除元素的数字,我的结构始终保持排序(就像优先级队列一样),但是可以知道给定数字在哪里,并且每个操作都以对数时间进行。
也许使用lower_bound,upper_bound或仅进行二进制搜索,但是在priority_queue中,阻止我进行二进制搜索的原因是我无法访问只有第一个索引的元素。
优先级队列不会使事物保持排序。 至少,不是通常。 优先级队列使您可以快速获取序列中的下一项。 但是您无法有效地访问队列中的第五项。
我知道三种建立优先级队列的方法,在这些队列中,您可以通过键有效地访问项目:
您有很多选择。 我个人比较喜欢跳过列表,但是您的里程可能会有所不同。
正如我所指出的那样,索引的二进制堆是一种混合数据结构,它维护一个字典(哈希图)和一个二进制堆。 简要说明其工作原理:
字典关键字是用于查找放入堆中的项目的字段。 该值是一个整数:该项目在堆中的索引。
堆本身是在数组中实现的标准二进制堆。 唯一的区别是,每次将项目从堆中的一个位置移动到另一个位置时,都会更新其在字典中的位置。 因此,例如,如果交换两个项目,则不仅必须交换项目本身在数组中的位置,还必须交换它们在字典中存储的位置。 例如:
heap is an array of string references
dict is a dictionary, keyed by string
swap (a, b)
{
// swap item at heap[a] with item at heap[b]
temp = heap[a]
heap[a] = heap[b]
heap[b] = temp
// update their positions in the dictionary
dict[heap[a]] = b
dict[heap[b]] = a
}
这是对标准二进制堆实现的非常简单的修改。 您只需要在每次移动项目时小心更新位置即可。
您还可以使用基于节点的堆(例如配对堆,斐波纳契堆,偏斜堆等)来执行此操作。
我认为您正在寻找订单统计树 ,这是一种增强的BST,它支持时间为O(log n)的所有常规BST操作以及其他两个操作:
以上两个操作的运行时间为O(log n),因此非常快。
您可以将订单统计树视为优先级队列。 插入与普通的BST插入一样工作,要提取最低/最高元素,您只需从树中删除最小/最大元素,就可以在时间O(log n)中通过沿着树的左或右棘走而完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.