我最近刚刚启动了一个项目,其中包含一些已经编写的代码。我决定研究他的实现,发现他实现了一个带有单链表的优先级队列。
我对 SLL 的理解是,由于您可能必须遍历整个列表,因此实现它的效率很低,这就是首选堆的原因。但是,也许我错过了它背后的某种推理,并且想知道是否有人曾经为优先队列选择 SLL 而不是堆?
我最近刚刚启动了一个项目,其中包含一些已经编写的代码。我决定研究他的实现,发现他实现了一个带有单链表的优先级队列。
我对 SLL 的理解是,由于您可能必须遍历整个列表,因此实现它的效率很低,这就是首选堆的原因。但是,也许我错过了它背后的某种推理,并且想知道是否有人曾经为优先队列选择 SLL 而不是堆?
在某些情况下,SLL 比堆更适合实现优先级队列。例如:
alarm()
实际上,我在为一个简单的操作系统编写系统调用版本时遇到了这个问题。我根本负担不起 O(log n) 查找时间。与此相关的是当您需要一次删除多个元素时。从 SLL 中删除 k 个元素需要 O(k) 时间,而堆需要 O(k log n) 时间。realloc
那么这个策略就失效了。如果将堆实现为二叉树,则 SLL 需要两个指针而不是一个。在大学里,有人告诉我,我们使用链表的唯一原因是帮助我们理解指针。