【问题标题】:python Priority Queue implementationpython优先队列实现
【发布时间】:2013-11-02 17:39:40
【问题描述】:

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

优先级队列将接受一系列任务并对它们进行排序 基于它们的重要性。每个任务都有一个从 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

【问题讨论】:

  • 风格说明:aval 和 bval 应该只是“self”。您在构造函数中分配的变量来自哪里也不清楚。
  • 我用 self 替换了它们。 @TylerCrompton 我一直在研究堆实现,因为我现在可以使用实际的 priority.queue() 调用。
  • 使用 avalbval 让我很困惑,为什么我第一次看到它。谢谢。

标签: python priority-queue


【解决方案1】:

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

从队列导入 PriorityQueue

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',[]))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 问题是要求对优先级队列进行不同的定义。优先级只有 10 个,但在每个级别内,都是正常的线性队列排序。
    • @kazagistar,完全是优先级队列。我引用的示例按照 OP 的要求按照插入的顺序维护了同等排名的项目。
    • 对,但每次插入和删除的复杂度为 O(logN),完全没有必要。
    • @kazagistar,当然,但优先级队列有效。愿上帝原谅我每次做 O(log n) 而我可以做 O(1)。
    【解决方案3】:

    来自 Alessandro Molina 的一本好书“Modern Python Standard Library Cookbook

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

    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
    

    【讨论】:

      【解决方案4】:

      双端队列 (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-13
        • 1970-01-01
        • 2011-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        • 2014-08-13
        相关资源
        最近更新 更多