在Python官方文档here上,提到了有关堆的以下内容:
此类的一个不错的功能是您可以有效地插入新的 进行排序时提供的项目,前提是插入的项目是 不比您提取的最后0个元素“好”。这是 在树包含所有树的仿真环境中特别有用 传入事件,“获胜”条件意味着计划的最小 时间。当一个事件安排其他事件执行时,它们是 安排在未来,以便他们可以轻松进入堆堆
我只能想到以下使用堆来实现调度程序的简单算法:
# Priority queue using heap
pq = []
# The first element in the tuple represents the time at which the task should run.
task1 = (1, Task(...))
task2 = (2, Task(...))
add_task(pq, task1)
add_task(pq, task2)
# Add a few more root-level tasks
while pq:
next_task = heapq.heappop()
next_task.perform()
for child_task in next_task.get_child_tasks():
# Add new child tasks if available
heapq.heappush(pq, child_task)
在这里,排序甚至出现在图片中?
即使将来的子任务有时间进行“过去”操作,该算法仍然可以正常工作。
那么,为什么作者警告孩子事件仅在将来安排呢?
这是什么意思:
您可以在进行排序时有效地插入新项目, 只要插入的项目不比最后0个“好” 您提取的元素。
答案 0 :(得分:0)
堆被用作优先级队列的数据结构,实际上,最小堆的基本原理是您的优先级最低(或者最大堆中的优先级最高)。因此,您始终可以提取最低或最高元素而无需搜索。
您总是可以在排序过程中插入新元素,尝试看看heapSort的工作方式。每次您需要构建堆,然后在将heap.length递减1之后,提取最大值并将其放在数组的末尾。
如果您已经对一些数字进行了排序:[..., 13, 15, 16]
,并且插入比提取的最后一个元素(第13 = 0个元素)高的新数字,则会得到错误的解决方案,因为您将提取新的数字但您不会将其放在正确的位置:[1, 2, 5, 7, 14, 13, 15, 16]
。因为它将在heap.length位置上交换元素,所以它将放置在13之前。
显然这是错误的,因此您只能插入小于第0个元素的元素。