何时优先实现具有单个链接列表的优先级队列?

时间:2011-06-20 16:45:01

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

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

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

2 个答案:

答案 0 :(得分:0)

在大学时我被告知,我们使用链接列表的唯一原因是帮助我们理解指针。

答案 1 :(得分:0)

的情况,其中SLL优于用于实现优先级队列的堆。例如:

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