2013-11-02 48 views
0

我在創建插入函數時遇到了以下參數問題。插入功能應占用優先級隊列,並使用優先級規則插入一個元素 -python Priority Queue實現

優先級隊列將執行一系列任務,並根據它們的重要性爲它們排序 。每個任務具有從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 

我試着寫的代碼插入(元素,隊列):它應該使用優先級隊列插入元素。類似地,myPriorty是從1到10

同樣的整數可以予執行以下操作,以確保創建從1到10的優先級...

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

,這樣我可以在替換myPriority插入任務與bval.pq

+0

http://mattgemmell.com/2008/12/08/what-have-you-tried/ –

+1

風格注:票據背書擔保和BVAL確實應該只是「自我」。 目前還不清楚你在構造函數中賦值的變量來自哪裏。 – kazagistar

+0

我用自己取代了它們。@TylerCrompton我一直在看堆實現,因爲我現在被允許使用實際的priority.queue()調用。 – user2933041

回答

-3

甲雙端隊列(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 
2

請注意,有一個Queue。如果你可以同步它,我會使用它。

否則,您應該使用堆來維護您的隊列。請參閱Python文檔,其中包含example

+1

爲什麼會得到一個downvote? – 0x90

+0

@ 0x90,我不知道。 –

+0

問題是要求優先隊列的不同定義。只有10個優先級,但在每個級別內,它是一個正常的線性隊列排序。 – kazagistar

4

你爲什麼試圖重新發明輪子?

從隊列進口的PriorityQueue

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

最低值項首先檢索(最低值項是一個通過排序(列表(條目返回))[0])。典型的條目模式是以下形式的元組:

(priority_number,data)。

我使用這樣的模塊在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',[]))