-1

我在使用以下参数创建插入函数时遇到问题。插入函数应该接受一个优先级队列和一个元素并使用优先级规则插入它 -

优先级队列将接受一系列任务,并根据它们的重要性对它们进行排序。每个任务都有一个从 10(最高优先级)到 1(最低优先级)的整数优先级。如果两个任务具有相同的优先级,则顺序应基于它们插入优先级队列的顺序(较早的第一个)。

所以,截至目前,我已经创建了以下代码来初始化一些需要的东西......

class Tasks():
    __slots__ = ('name', 'priority')

     def __init__(bval):
         bval.name = myName
         bval.priority = myPriority
         return bval

class PriorityQueue():
    __slots__ = ('queue', 'element')

     def __init__(aval):
         aval.queue = queue
         aval.element = element
         return aval

我正在尝试编写的代码是 insert(element, queue): 它应该使用优先级队列插入元素。同样,myPriorty 是从 1 到 10 的整数。

同样,我可以执行以下操作以确保创建从 1 到 10 的优先级...

def __init__(bval , myPriority = 10):
      bval.priority = myPriority
      bval.pq = [[] for priority in range(bval.myPriority)]

这样我就可以用 bval.pq 替换插入任务中的 myPriority

4

4 回答 4

3

你为什么要重新发明轮子?

从队列导入优先队列

http://docs.python.org/2/library/queue.html?highlight=priorityqueue#Queue.PriorityQueue

首先检索最低值的条目(最低值的条目是由 sorted(list(entries))[0] 返回的条目。条目的典型模式是以下形式的元组:

(priority_number,数据)。

我使用这样的模块在 UI 和后台轮询线程之间进行通信。

READ_LOOP = 5
LOW_PRI = 3
MED_PRI = 2
HI_PRI = 1
X_HI_PRI = 0

然后是这样的:

CoreGUI.TX_queue.put((X_HI_PRI,'STOP',[]))
于 2013-11-02T18:00:47.593 回答
2

请注意,有一个Queue。如果你同意它被同步,我会使用它。

否则,您应该使用堆来维护您的队列。请参阅带有示例的 Python 文档。

于 2013-11-02T17:44:24.613 回答
1

摘自Alessandro Molina的一本好书《现代 Python 标准库食谱》

堆是所有具有优先级的事物的完美匹配,例如优先级队列:

import time
import heapq

class PriorityQueue:
    def __init__(self):
        self._q = []

    def add(self, value, priority=0):
        heapq.heappush(self._q, (priority, time.time(), value))

    def pop(self):
        return heapq.heappop(self._q)[-1]

例子:

>>> def f1(): print('hello')
>>> def f2(): print('world')
>>>
>>> pq = PriorityQueue()
>>> pq.add(f2, priority=1)
>>> pq.add(f1, priority=0)
>>> pq.pop()()
hello
>>> pq.pop()()
world
于 2020-03-15T14:25:56.633 回答
-2

双端队列 ( from collections import deque) 是单个队列的 Python 实现。您可以将项目添加到一端并从另一端删除它们。如果每个优先级都有一个双端队列,则可以添加到所需的优先级。

总之,它看起来有点像这样:

from collections import deque

class PriorityQueue:
    def __init__(self, priorities=10):
        self.subqueues = [deque() for _ in range(levels)]

    def enqueue(self, priorty, value):
        self.subqueues[priority].append(value)

    def dequeue(self):
        for queue in self.subqueues:
            try:
                return queue.popleft()
            except IndexError:
                continue
于 2013-11-02T18:13:22.653 回答