Warum werden der Laufzeitheap für die dynamische Speicherzuweisung in Sprachen im C-Stil und die Datenstruktur als "Heap" bezeichnet? Gibt es eine Beziehung?
Warum werden der Laufzeitheap für die dynamische Speicherzuweisung in Sprachen im C-Stil und die Datenstruktur als "Heap" bezeichnet? Gibt es eine Beziehung?
Antworten:
Donald Knuth sagt (The Art of Computer Programming, 3. Aufl., Bd. 1, S. 435):
Mehrere Autoren begannen ungefähr 1975, den Pool des verfügbaren Speichers als "Haufen" zu bezeichnen.
Er sagt nicht, welche Autoren und gibt keine Verweise auf bestimmte Artikel, aber er sagt, dass die Verwendung des Begriffs "Haufen" in Bezug auf Prioritätswarteschlangen der traditionelle Sinn des Wortes ist.
Sie haben den gleichen Namen, sind sich aber nicht wirklich ähnlich (auch nicht konzeptionell). Ein Speicherhaufen wird als Haufen bezeichnet, so wie Sie einen Wäschekorb als "Kleiderhaufen" bezeichnen würden. Dieser Name wird verwendet, um einen etwas unordentlichen Ort anzuzeigen, an dem Speicher nach Belieben zugewiesen und freigegeben werden kann. Die Datenstruktur (wie der Wikipedia-Link zeigt, auf den Sie verweisen) ist ganz anders.
Die Namenskollision ist unglücklich, aber nicht so mysteriös. Heap ist ein kleines, gebräuchliches Wort, das einen Stapel, eine Sammlung, eine Gruppe usw. bedeutet. Die Verwendung des Wortes für die Datenstruktur datiert (ich bin mir ziemlich sicher) vor dem Namen des Speicherpools. In der Tat wäre Pool meiner Meinung nach eine viel bessere Wahl für Letzteres gewesen. Heap bezeichnet eine vertikale Struktur (wie ein Stapel), die zur Datenstruktur passt, nicht jedoch zum Speicherpool. Wir betrachten einen Speicherpool-Heap nicht als hierarchisch, während die Grundidee hinter der Datenstruktur darin besteht, das größte Element oben auf dem Heap (und den Sub-Heaps) zu halten.
Die Datenstruktur stammt aus der Mitte der 60er Jahre. Haufen den Speicherpool, die frühen 70er Jahre. Der Begriff Heap (Speicherpool) wurde mindestens 1971 von Wijngaarden in Diskussionen über Algol verwendet.
Möglicherweise wurde die früheste Verwendung von Heap als Datenstruktur sieben Jahre zuvor in
Williams, JWJ 1964, gefunden. "Algorithm 232 - Heapsort", Communications of the ACM 7 (6): 347-348
Das Lesen über die Art und Weise, wie Speicher zugewiesen wird (siehe Buddy-Blöcke ), erinnert mich an einen Haufen in Datenstrukturen.
IMO ist es nur ein Zufall / Zufall, dass diese beiden völlig unabhängigen Dinge den gleichen Namen haben. Es ist wie Grafik und Grafik .
Die Heap-ähnliche Datenstruktur wird vom Algorithmus zum Ermitteln der verfügbaren Speicherzuordnung verwendet. Das Folgende ist ein Auszug aus http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .
Wenn
new
es aufgerufen wird, sucht es nach einem freien Speicherblock, der der Größe Ihrer Anfrage entspricht. Angenommen, ein solcher Speicherblock wird gefunden, wird er als reserviert markiert und ein Zeiger auf diesen Speicherort wird zurückgegeben. Es gibt verschiedene Algorithmen, um dies zu erreichen, da ein Kompromiss zwischen dem Scannen des gesamten Speichers, um den kleinsten freien Block zu finden, der größer als die Größe Ihres Objekts ist, oder dem Zurückgeben des ersten Blocks, in den der benötigte Speicher passt. Um die Geschwindigkeit beim Abrufen eines Speicherblocks zu verbessern, werden die freien und reservierten Speicherbereiche in einer Datenstruktur verwaltet, die Binärbäumen ähnelt, die als Heap bezeichnet werden.
Die umgangssprachlichen Begriffe Stapelspeicher und Heapspeicher werden im C ++ - Standard nicht verwendet. Der Standard verwendet statischen Speicher, Thread-Speicher, automatischen Speicher und dynamischen Speicher.
Weitere Informationen finden Sie im Abschnitt Speicherdauer des Standards.
Aus Sicht der Sprache und der Standardbibliothek gibt es daher keine Verwirrung.
F. Was ist ein Haufen? A. Ein Haufen ist eine Sammlung von Objekten, die übereinander liegen.
Antwort auf Ihre Frage: Sowohl der Speicherheap als auch der Binärheap verwenden dasselbe Konzept wie Sie wissen. Daten werden in Form eines Heaps im Speicher in derselben Reihenfolge wie im Programm gespeichert gespeichert, während binärer Heap eine Datenstruktur ist, die dem gleichen Konzept folgt, Daten in geordneter Weise in Form eines Heaps zu speichern (Daten oben) des anderen). Lassen Sie mich wissen, was Sie in den Kommentaren denken.
Vielleicht wurde der erste implementierte Speicherheap von einer Heap-Struktur verwaltet?