【问题标题】:When would it be preferred to implement a priority queue with a Singly Linked List over a Heap?什么时候最好在堆上使用单链表来实现优先级队列?
【发布时间】:2011-06-20 16:45:01
【问题描述】:

我最近刚刚启动了一个项目,其中包含一些已经编写的代码。我决定研究他的实现,发现他实现了一个带有单链表的优先级队列。

我对 SLL 的理解是,由于您可能必须遍历整个列表,因此实现它的效率很低,这就是首选堆的原因。但是,也许我错过了它背后的某种推理,并且想知道是否有人曾选择 SLL 而不是堆作为优先级队列?

【问题讨论】:

  • 优先级队列必须支持插入、删除和更改元素的优先级。一个好的实现将在 O(log n) 时间(简单堆)或更短时间(二项式堆、斐波那契堆)内完成任何这些。 “他的”实现是否有这样的运行时间?回答这个问题,你就会回答你自己的问题。

标签: c priority-queue singly-linked-list binomial-heap


【解决方案1】:

种情况,在实现优先级队列方面,SLL 比堆更好。例如:

  1. 从队列中移除时需要尽可能快。从 SLL 中删除是 O(1)(从列表/队列的前面),而从堆中删除是 O(log n)。实际上,我在为一个简单的操作系统编写 alarm() 系统调用的版本时遇到了这个问题。我根本负担不起 O(log n) 查找时间。与此相关的是当您需要一次删除多个元素时。从 SLL 中删除 k 个元素需要 O(k) 时间,而堆需要 O(k log n) 时间。
  2. 内存问题。最小或最大堆的传统实现涉及一个数组,需要随着堆的增长而调整其大小。如果你负担不起做大型realloc 所需的时间,那么这个策略就失效了。如果将堆实现为二叉树,则 SLL 需要两个指针而不是一个。
  3. 当您必须维护多个优先级时。跟踪不同链表中的相同节点相对容易。使用堆执行此操作要复杂得多。

【讨论】:

    【解决方案2】:

    在大学时,有人告诉我,让我们使用链表的唯一原因是帮助我们理解指针。

    【讨论】:

    • 这是对它们的有效教育用途,但它们在现实世界中确实具有一些不错的属性,使它们成为某些用途的首选数据结构。
    • 你可以学习使用指针,甚至实现二项式堆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2013-11-30
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多