Ich dachte immer, dass Haufen und Prioritäts - Warteschlangen Synonyme waren - eine abstrakte Datenstruktur , die unterstützt die insert
, findMin
und deleteMin
Operationen.
Einiges an Literatur scheint mir zuzustimmen - zum Beispiel Chris Okasakis rein funktionale Datenstrukturen (Kapitel 3).
Auf der anderen Seite definiert Wikipedia die Heap- Seite als baumbasierte Datenstruktur und gibt an, dass Heaps eine konkrete Implementierung von Prioritätswarteschlangen sind.
Ich finde es schwierig, dies mit der Tatsache in Einklang zu bringen, dass ich mir mehr als eine Heap-Implementierung vorstellen kann - linke Heaps, Binomial-Heaps, Splay-Heaps ...
Bedeutet die einfache Tatsache, dass ein Heap mit verschiedenen Datenstrukturen implementiert werden kann, per Definition nicht, dass es sich um eine abstrakte Datenstruktur handelt? Und wenn dies der Fall ist, gibt es einen tatsächlichen Unterschied zu Prioritätswarteschlangen?
quelle
Antworten:
Eine Prioritätswarteschlange kann eine beliebige Implementierung haben, z. B. ein Array, das Sie beim Aufrufen linear durchsuchen. Alles, was es bedeutet, ist, dass Sie beim Pop entweder den minimalen oder den maximalen Wert erhalten.
Ein klassischer Haufen, wie er normalerweise genannt wird, ist normalerweise ein kleiner Haufen. Eine Implementierung, die eine gute zeitliche Komplexität (
O(log n)
bei Push und Pop) und keinen Speicheraufwand aufweist.quelle
findMin
,deleteMin
,insert
), haben Haufen garantiert „gut“ Komplexität für sie , wo Prioritäts - Warteschlangen nicht?O(log(n))
vermutlich kein Push-and-Pop-Band.Diese Website bietet eine wirklich klare Erklärung. http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html
Kurz gesagt, eine Prioritätswarteschlange kann unter Verwendung vieler der Datenstrukturen implementiert werden, die wir bereits untersucht haben (ein Array, eine verknüpfte Liste oder ein binärer Suchbaum). Diese Datenstrukturen bieten jedoch nicht die effizientesten Operationen. Um alle Operationen sehr effizient zu gestalten, verwenden wir eine neue Datenstruktur, die als Heap bezeichnet wird.
quelle
Ich denke, dass das, was Sie über Beton vs. Abstrakt geschrieben haben, richtig ist. Wenn Sie sagen, dass Splay-Heaps und Binomial-Heaps unterschiedliche Implementierungen von Heaps sind, ist es meines Erachtens richtiger zu sagen, dass es sich um unterschiedliche Arten von Heaps handelt. Heap halte ich für eine Implementierungskategorie, die in der Regel nicht nur die gleiche Schnittstelle, sondern auch die gleichen Zugriffszeiten garantiert.
Sie sehen dies auch bei assoziativen Maps, Hash-Tabellen und binären Suchbäumen. Bsts- und Hash-Tabellen sind beide konkrete Datenstrukturen, die die assoziative Map-Abstract-Schnittstelle bereitstellen. Rot-Schwarz-Bäume und AVL-Bäume sind beide ausgeglichene BSTs mit denselben großen O-Garantien und derselben zusätzlichen Schnittstelle (in der Reihenfolge des Durchlaufens). Es sind verschiedene Arten von Bäumen. Ich würde mehr sagen als verschiedene Implementierungen von Bäumen. Es handelt sich um verschiedene, aber eng verwandte Implementierungen von assoziativen Karten.
quelle