【问题标题】:How to Deque and sorting priorityqueue using heap correctly?如何正确使用堆 Deque 和排序 priorityqueue?
【发布时间】:2020-01-19 11:37:24
【问题描述】:

我的作业是通过让用户以这种格式输入来创建优先队列
案例数量
案例类型 案例ID 优先级
以 1 为最高优先级

示例。
16
我 0 2
我 1 2
D
我 3 3
我 4 1
D
我 6 1
D
我 8 1
D
我 10 2
我 11 1
我 12 3
我 13 2
我 14 3
我 15 2

(我的意思是正常情况,D表示当时的最高优先级)然后打印剩余的caseID按优先级排序

这是我的代码

import heapq
priority=[]

num=int(input())
for i in range (0,num,1):
    temp=input()
    if (len(temp)>1):
        casetype,caseID,casePrio,=temp.split(" ",2)
        heapq.heappush(priority, (int(caseID),int(casePrio)))
    else:
        heapq.heappop(priority)

for i in range(len(priority)):
    print (priority[i][1]) 

我希望得到这个输出

输出:
11
1
10
13
15
3
12
14

但是换成这个

输出:
11
1
10
15
12
13
14
3

【问题讨论】:

  • 未排序 - 只有根元素具有固定位置,其他一切都尊重堆不变量(父元素小于任何一个子元素),但在其他方面是任意的订购。
  • 只是个人笔记,也许是因为我在这方面很糟糕,但我不认为您的对象以易于理解的方式命名。例如,我在您的说明中看到您有 number of case case-type caseIDpriority... 在您的代码中,您有 pio num tic z x @98765431 .对于第一次阅读你的代码/这个作业的人,我不得不来回弄清楚什么是什么。
  • 我没有遵循您的预期输出。也许添加一些关于为什么跳过 ids 6 和 8 的细节。同样在 python 中,deque 是一个双端队列。您使用 deque 作为动词,我不明白。你的意思是出队吗?
  • @pylang 6 和 8 被跳过,因为它们是使用第 3 和第 4 个“D”命令从堆中删除的。而且,是的,他应该使用“dequeue”而不是“deque”。

标签: python heap priority-queue


【解决方案1】:

优先级队列的整个想法是,当您弹出某个内容时,它会为您提供当前队列中最高优先级的项目。你不需要自己整理东西。这只是做额外的工作。

如果你想按优先级顺序输出队列的剩余部分,你可以用这个替换你的最终循环:

while (len(priority) > 0)
    print(heapq.heappop(priority));

heappop 的每次调用都将返回仍在队列中的最高优先级项目。

但是,不要指望得到完全符合您期望的输出。 heapq 不保证具有相同优先级的项目的删除顺序。例如,如果您要按此顺序插入项目:

10 1
11 2
12 2
13 3

然后删除它们,结果将是10 11 12 13。但如果您将广告订单更改为:

10 1
13 3
11 2
12 2

那么输出将是10 12 11 13

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2021-07-19
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多