优先队列 VS 队列

Priority Queues VS Queues

优先级队列如何排列队列数据结构。因为它不遵循 FIFO,所以不应该将它命名为优先级数组或优先级链接列表,主要是因为优先级队列不遵循像 FIFO 队列那样的时尚

在优先级队列中,高优先级的元素先于低优先级的元素被服务。 '如果两个元素具有相同的优先级,则根据它们在队列中的顺序提供服务' 我想这会回答你的问题

如果您查看大多数使用的实现,优先级队列本质上是堆 - 它们根据程序员定义的优先级以特定方式排列 - 在一个简单的例子中,整数的升序或降序。

将优先级队列视为一个队列,在该队列中,您不是根据添加元素的时间来检索元素,而是根据元素相互比较的方式来检索它们。在您的教科书示例中,这种比较可以简单地按升序或降序排列。你可以通过另一个 Whosebug 答案的类比来理解 ADT:

You're running a hospital and patients are coming in. There's only one doctor on staff. The first man walks in - and he's served immediately. Next, a man with a cold comes in and requires assistance. You add him to the queue and he waits in line for the doctor to become available. Next, a man with an axe in his head comes through the door. He is assigned a higher priority because he is a higher medical liability. So the man with the cold is bumped down in line. Next, someone comes in with breathing problems. So, once again, the man with the cold is bumped down in priority. This is called trigaing in the real world - but in this case it's a medical line.

Implementing this in code would use a priority queue and a worker thread (the doctor) to perform work on the consumable / units of work (the patients).

在实际情况下,您可能有进程等待 CPU 解决,而不是患者。

阅读: When would I use a priority queue?

在队列中,自然 根据元素在一行中等待的时间给出的排序可以被认为是最公平的。当您排队等候时,先到先得。

然而,有时某些元素有一些特殊之处 可能会建议他们应该比其他等待时间更长的人更快地得到服务。例如,我们并不总是按照收到的顺序阅读电子邮件,但通常 你跳过新闻通讯或朋友的“有趣”笑话,先阅读与工作相关的消息。

同样,当您设计应用程序或测试应用程序时,如果存在一些错误,这些错误会被优先处理,并且团队会根据错误的严重程度来处理这些错误。首先,所有的新错误都会被发现 时间,因此新项目将添加到列表中。假设发现了一个严重的身份验证错误—— 你需要在昨天之前解决它!此外,错误的优先级可以改变 时间。例如,您的 CEO 可能会决定您要追求市场份额 这主要是使用浏览器 X,下周五你有一个重要的功能发布,所以你真的需要在几天内解决底部的错误。

当我们需要从一个动态变化的列表(比如 CPU 上 运行 的任务列表)中以特定顺序消费元素时,优先级队列特别有用,这样在任何时候我们可以获得下一个元素(根据特定标准),将其从列表中删除,并且(通常)不再担心修复任何东西 其他元素。

这就是优先级队列背后的理念:它们的行为类似于常规的普通队列,只是队列的前端是根据某种优先级动态确定的。优先级的引入对实现造成的差异是深远的,足以值得一种特殊的数据结构。