2013-05-25 3 views
0

Compte tenu de ce code ...Python Queue.Queue et consistance cohérente?

import Queue 

def breadthFirstSearch(graph, start, end): 
q = Queue.Queue() 
path = [start] 
q.put(path) 
visited = set([start]) 
while not q.empty(): 
    path = q.get() 
    last_node = path[-1] 
    if last_node == end: 
     return path 
    for node in graph[last_node]: 
     if node not in visited: 
      visited.add(node) 
      q.put(path + [node]) 

Où graphique est un dictionnaire qui représente un graphe orienté, par exemple, { 'pile': [ 'débordement'], 'foo': [ 'bar']} par exemple, la pile pointe vers le débordement et foo pointe vers la barre. Pourquoi ne reçois-je pas le même résultat lorsque je remplace Queue.Queue par deque dans les collections pour augmenter l'efficacité?

from collections import deque 

def breadthFirstSearch(graph, start, end): 
q = deque() 
path = [start] 
q.append(path) 
visited = set([start]) 
while q: 
    path = q.pop() 
    last_node = path[-1] 
    if last_node == end: 
     return path 
    for node in graph[last_node]: 
     if node not in visited: 
      visited.add(node) 
      q.append(path + [node]) 

Répondre

2

Votre version Queue.Queue utilise FIFO alors que votre version deque utilise FILO. Vous devez utiliser path = q.popleft() à la place pour résoudre ce problème.

Notez que Queue.Queue utilise en interne un deque sous-jacent pour représenter la file d'attente. Pour plus d'informations, voir le relevant documentation (voir _get méthode)

+0

Merci cela fonctionne, juste pour être sûr, en utilisant deque dans cette situation est plus efficace non? – Ogen

+0

@Clay Oui car 'Queue' utilise lui-même' deque' (voir edit), 'Queue' a l'avantage d'être thread safe cependant – jamylak

+1

Je ne le savais pas, merci pour l'aperçu, je peux voir l'amélioration de mon programme en utilisant deque parce que mes graphiques sont si grands. – Ogen

Questions connexes