使用堆作为调度程序

时间:2019-06-01 19:40:38

标签: python algorithm scheduled-tasks heap scheduler

在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个“好”   您提取的元素。

1 个答案:

答案 0 :(得分:0)

堆被用作优先级队列的数据结构,实际上,最小堆的基本原理是您的优先级最低(或者最大堆中的优先级最高)。因此,您始终可以提取最低或最高元素而无需搜索。

您总是可以在排序过程中插入新元素,尝试看看heapSort的工作方式。每次您需要构建堆,然后在将heap.length递减1之后,提取最大值并将其放在数组的末尾。 如果您已经对一些数字进行了排序:[..., 13, 15, 16],并且插入比提取的最后一个元素(第13 = 0个元素)高的新数字,则会得到错误的解决方案,因为您将提取新的数字但您不会将其放在正确的位置:[1, 2, 5, 7, 14, 13, 15, 16]。因为它将在heap.length位置上交换元素,所以它将放置在13之前。 显然这是错误的,因此您只能插入小于第0个元素的元素。