2017-10-27 3 views
0

Ich experimentiere mit einem Suchalgorithmus, und ich versuche, einen A * -Algorithmus zu verwenden, um das Problem zu lösen.Python - Eine Liste von Wörterbüchern sortieren

Ich verwende eine Liste von Wörterbüchern, um die interne Knotenstruktur zu erhalten. Jeder Knoten ist durch einen bestimmten Zustand und die damit verbundenen Kosten gekennzeichnet. Die Auswahlfunktion sollte den Knoten mit den niedrigsten Kosten zurückgeben. Um dies zu tun, filtere ich die Liste jedes Mal. Ich fand das ist sehr schnell, wenn das Problem sehr klein ist, aber in dem Fall, dass die Liste sehr groß ist, verwendet diese Funktion 84% der Gesamtzeit des Algorithmus.

Meine Frage ist, ob es eine effizientere Möglichkeit gibt, dies zu tun.

def select(self, frontier): 
    frontier.sort(key = lambda x: x['f_cost']) 
    #select the node with the lowest f_cost 
    return frontier.pop(0) 
+0

Vielleicht möchten Sie auch eine Prioritätswarteschlange verwenden. Zum Beispiel ['heapq'] (https://docs.python.org/3/library/heapq.html). –

Antwort

2

Ja, nicht .pop von Anfang an! Das ist lineare Zeit. .pop vom Ende konstant ist, so einfach tun:

def select(self, frontier): 
    frontier.sort(key = lambda x: x['f_cost'], reverse=True) 
    #select the node with the lowest f_cost 
    return frontier.pop() 

Vielleicht möchten Sie alternative Datenstrukturen berücksichtigen, wenn Sie eine sortierte Folge zu halten versuchen. Sie können heapq betrachten, die Teil der Standard-Bibliothek ist, obwohl es ziemlich nackt ist. Sie könnten auch die sortedcontainers-Bibliothek betrachten, die offensichtlich ist sehr performant.

+0

Das "Pop von Anfang an" (O (n)) ist wahrscheinlich nicht so schlecht wie die Sortierung (O (n log n)), so dass der zweite Teil der Antwort (eine andere Datenstruktur verwenden) vielversprechender aussieht. – Sebastian

+0

@Sebastian Wahr, aber bedenken Sie, timsort ist * schlimmster Fall * O (n log n), aber es ist * blitzschnell * beim Sortieren fast sortierter Listen. Davon abgesehen steht Ihr Standpunkt immer noch. –

+0

@ juanpa.arrivillaga Es ist nicht blitzschnell verglichen mit dem Auftauchen von vorne. Es ist sehr langsam im Vergleich dazu. Versuch es. –

Verwandte Themen