Ich bin mit der Verwendung von Stacks, Queues und Trees in Softwareanwendungen ziemlich vertraut, habe aber noch nie eine Deque (Double Ended Queue) verwendet. Wo würde ich ihnen normalerweise in freier Wildbahn begegnen? Wäre es an den gleichen Orten wie eine Warteschlange, aber mit zusätzlichen Gribbilien?
data-structures
Weltingenieur
quelle
quelle
Antworten:
Eine Art und Weise, wie eine Deque verwendet wird, ist das "Altern" von Gegenständen. Es wird normalerweise als Rückgängig- oder Verlaufsfunktion verwendet. Eine neue Aktion wird in die Deque eingefügt. Die ältesten Stücke befinden sich vorne. Eine Begrenzung der Größe des Deques zwingt die Elemente an der Vorderseite, zu einem bestimmten Zeitpunkt entfernt zu werden, wenn neue Elemente eingefügt werden (Alterung der ältesten Elemente). Es bietet dann eine schnelle Möglichkeit, auf beide Enden der Struktur zuzugreifen, da Sie sofort die ältesten und neuesten Elemente kennen, um entweder die Vorderseite zu entfernen und die älteste Aktion in O (1) auszuführen oder in O (1) rückgängig zu machen.
quelle
Hervorragende Frage. Ich kann mich nicht erinnern, dass unser CS 102-Kurs eine einzelne Anwendung für die doppelte Warteschlange erwähnt hat.
Bis zum heutigen Tag ist die einzige mir bekannte Anwendung der im Wikipedia-Artikel erwähnte Arbeitsplaner .
Es funktioniert im Wesentlichen wie folgt:
In einem normalen Single-Threaded-Vorgehensmodell wird bei jedem Funktionsaufruf ein Aktivierungsdatensatz auf einem sogenannten Aufrufstapel abgelegt . Ein Aktivierungsdatensatz enthält die lokalen Variablen und Parameter dieses Aufrufs. Sobald der Aufruf der Methode abgeschlossen ist ("return"), wird der letzte Aktivierungsdatensatz vom Aufrufstapel abgerufen.
Dies ist besonders wichtig, da auf diese Weise die Rekursion implementiert wird: Die Struktur der Rekursion wird im aktuellen Status des Aufrufstapels dargestellt.
Beim Parallelisieren eines rekursiven Algorithmus können wir diese Eigenschaft ausnutzen, indem wir den Aufrufstapel durch eine Aufrufwarteschlange ersetzen. Jeder Thread in der Berechnung erhält eine eigene Aufrufwarteschlange und überträgt Aktivierungsdatensätze wie bei einer sequentiellen Ausführung.
Sobald ein Thread seine Arbeit beendet hat (= seine Anrufwarteschlange ist leer), stiehlt er Arbeit von einem anderen Thread, indem er einen Aktivierungsdatensatz aus der Anrufwarteschlange dieses Threads entfernt, indem er ihn vom "falschen" Ende entfernt.
Grundsätzlich fungiert die Anrufwarteschlange als zwei Anrufstapel, die jetzt zwei Threads bedienen.
quelle