繁体   English   中英

优先级队列之类的结构,但下限类似

[英]Structure like priority queue but with something like lower bound

我想要一个结构来存储(例如)我可以在其中插入和删除元素的数字,我的结构始终保持排序(就像优先级队列一样),但是可以知道给定数字在哪里,并且每个操作都以对数时间进行。

也许使用lower_bound,upper_bound或仅进行二进制搜索,但是在priority_queue中,阻止我进行二进制搜索的原因是我无法访问只有第一个索引的元素。

优先级队列不会使事物保持排序。 至少,不是通常。 优先级队列使您可以快速获取序列中的下一项。 但是您无法有效地访问队列中的第五项。

我知道三种建立优先级队列的方法,在这些队列中,您可以通过键有效地访问项目:

  • 使用平衡的二进制搜索树来实现队列。 尽管所有操作均为O(log n),但典型的运行时间比二进制堆慢。
  • 将堆优先级队列实现为跳过列表 这是一个不错的选择。 我见过有人报告说,跳过列表优先级队列的性能优于二进制堆。 搜索[C ++跳过列表]将返回许多实现。
  • 我所谓的索引二进制堆也可以工作。 基本上,您将哈希映射或字典与二进制堆结合在一起。 该映射由键索引,其值包含堆数组中该项的索引。 这样的东西并不难构建,并且非常有效。
  • 想一想,您可以为任何类型的堆创建索引版本。

您有很多选择。 我个人比较喜欢跳过列表,但是您的里程可能会有所不同。

正如我所指出的那样,索引的二进制堆是一种混合数据结构,它维护一个字典(哈希图)和一个二进制堆。 简要说明其工作原理:

字典关键字是用于查找放入堆中的项目的字段。 该值是一个整数:该项目在堆中的索引。

堆本身是在数组中实现的标准二进制堆。 唯一的区别是,每次将项目从堆中的一个位置移动到另一个位置时,都会更新其在字典中的位置。 因此,例如,如果交换两个项目,则不仅必须交换项目本身在数组中的位置,还必须交换它们在字典中存储的位置。 例如:

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操作以及其他两个操作:

  • rank(elem):返回排序后的元素将占用的索引。
  • index(k):给定索引k,返回排序序列中该索引处的元素。

以上两个操作的运行时间为O(log n),因此非常快。

您可以将订单统计树视为优先级队列。 插入与普通的BST插入一样工作,要提取最低/最高元素,您只需从树中删除最小/最大元素,就可以在时间O(log n)中通过沿着树的左或右棘走而完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM