Perché due concetti diversi sono entrambi chiamati "heap"?


170

Perché l'heap di runtime viene utilizzato per l'allocazione dinamica della memoria in linguaggi di tipo C e la struttura dei dati entrambi chiamati "heap"? C'è qualche relazione?


4
Oggi me lo chiedevo mentre studiavo le strutture dati.
MitMaro,


3
Vai a un dizionario inglese e conta il numero di voci in "Esegui". Quante delle oltre 40 voci si applicano ai computer? :)
jmucchiello,


Un post correlato qui contiene l'heap di runtime utilizzato per l'allocazione dinamica della memoria.
RBT

Risposte:


77

Donald Knuth afferma (The Art of Computer Programming, Third Ed., Vol. 1, p. 435):

Numerosi autori iniziarono verso il 1975 a definire un "mucchio" di memoria disponibile.

Non dice quali autori e non fornisce riferimenti a nessun documento specifico, ma afferma che l'uso del termine "heap" in relazione alle code prioritarie è il senso tradizionale della parola.


11
Pool sarebbe un nome migliore di heap.

7
Interessante. Qualcuno dovrebbe chiedergli se ricorda quali autori.
Prof. Falken,

27
Wikipedia afferma che è perché in una fase iniziale Lisp ha usato un heap (struttura di dati) per implementare il suo archivio di memoria. Non dice come. Il suo riferimento è "Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1990): Introduzione agli algoritmi. MIT Press / McGraw-Hill.", Che non ho.
Steve Jessop,

2
Non ho riferimenti per questo, ma la mia ipotesi sarebbe che inizialmente la struttura dei dati utilizzata per organizzare i riferimenti a blocchi aperti di memoria fosse un minimo heap. Sembra che sarebbe almeno un modo decente di trovare rapidamente il più piccolo blocco di memoria che ti consentirebbe di archiviare i dati che stavi cercando di memorizzare Aggiornamento: quello che ho detto suona esattamente come buddy block en.wikipedia.org/wiki/Dynamic_memory_allocation # Buddy% 5Fblocks
Will

4
@SteveJessop - Checking Cormen, Leiserson, Rivest, Stein - 3a edizione (2009) all'inizio del capitolo Heapsort dice solo 'Il termine "heap" è stato originariamente coniato nel contesto di heapsort, ma da allora è venuto a fare riferimento a " Garbage Collected Storage ", come i linguaggi di programmazione Java e Lisp. La nostra struttura di dati heap non è un archivio raccolto in modo inutile e ogni volta che ci riferiamo agli heap in questo libro, intendiamo una struttura di dati piuttosto che un aspetto della garbage collection. " CLRS - 2a edizione ha anche quasi lo stesso fraseggio (nessuna indicazione che Lisp abbia usato un Heap).
dr jimbob,

64

Hanno lo stesso nome ma in realtà non sono simili (anche concettualmente). Un heap di memoria è chiamato heap nello stesso modo in cui si farebbe riferimento a un cesto della biancheria come un "mucchio di vestiti". Questo nome viene utilizzato per indicare un luogo un po 'disordinato in cui la memoria può essere allocata e deallocata a piacimento. La struttura dei dati (come sottolinea il link di Wikipedia che fai riferimento) è piuttosto diversa.


8
Sì, penso che sia piuttosto il punto su cui sta basando la sua domanda: sono diversi. Quindi perché sono chiamati la stessa cosa - c'è qualche relazione di fondo.
Sean Owen,

9
Il modo in cui ho interpretato questa risposta è "no, non esiste una relazione di base", quindi risponde alla domanda.
Laurence Gonsalves,

Andrew sta rispondendo a quello. Non c'è relazione. Solo una coincidenza L'heap di memoria è più fedele all'uso comune poiché la memoria è allocata come se fosse un "mucchio di vestiti". La struttura dei dati ha tuttavia richiesto un più ampio tratto di immaginazione. E questo diventa un "perché" piuttosto molto più interessante. Il nome deriva dal fatto che i nodi sono organizzati in base alla loro chiave e una chiave del nodo padre è sempre> = rispetto al suo nodo figlio.
Alexandre Bell,

6
Sono decisamente indipendenti. Tuttavia, il problema nel chiamarlo "l'heap" è che "la controparte dell'heap -" lo stack "- è anche uno stack effettivo.
dan

1
So perché la struttura dei dati heap è chiamata heap: perché soddisfa la proprietà heap. Ma perché la proprietà heap è chiamata tale? Non ha senso per me, dato che un nome come "top heavy" sarebbe molto meglio.
Thomas Eding,

31

La collisione del nome è sfortunata, ma non così misteriosa. Heap è una piccola parola comune usata per indicare un mucchio, una raccolta, un gruppo, ecc. L'uso della parola per la struttura dei dati precede (ne sono abbastanza sicuro) il nome del pool di memoria. In effetti, piscina sarebbe stata una scelta molto migliore per quest'ultima, secondo me. Heap connota una struttura verticale (come una pila), che si adatta alla struttura dei dati, ma non al pool di memoria. Non pensiamo a un heap del pool di memoria come gerarchico, mentre l'idea fondamentale dietro la struttura dei dati è mantenere l'elemento più grande in cima all'heap (e sotto-heap).

Ammucchiare la struttura dei dati risale alla metà degli anni '60; ammucchiare il pool di memoria, all'inizio degli anni '70. Il termine heap (che significa pool di memoria) fu usato almeno nel 1971 da Wijngaarden nelle discussioni su Algol.

Probabilmente il primo utilizzo dell'heap come struttura di dati si trova sette anni prima in
Williams, JWJ 1964. "Algorithm 232 - Heapsort", Communications of the ACM 7 (6): 347-348


1
Sì, ma un mucchio implica anche disordine e i cumuli di memoria sono generalmente disordinati. L'heap della struttura dei dati è estremamente ben ordinato. Quindi di nuovo c'è un'eguale discrepanza che va nella direzione opposta in base alla definizione comune di heap.
jmucchiello,

Viene sempre introdotto come l'opposto dello stack che dovrebbe essere sufficiente per spiegare il nome IMO.
reinierpost,

1
Non è una coincidenza: l'elenco gratuito può essere implementato come una coda prioritaria tramite un heap binomiale.
Heath Hunnicutt,

2
@jmucchiello: un mucchio di tronchi (vedi foto ) è ben ordinato e assomiglia ad un albero. Questa è l'origine del nome della struttura dei dati secondo uno dei miei libri di testo universitari.
gioele,

6

In realtà, leggere il modo in cui viene allocata la memoria (vedi Buddy Blocks ) mi ricorda un mucchio di strutture di dati.


Anche il mio commento sulla risposta di Peter Zhang è rilevante qui. Il sistema di amici binari può essere rappresentato come un albero binario, e sembra anche un heap max valido quando la "chiave" di ciascun nodo è la memoria totale sottostante (ma questi valori sono impliciti e non cambiano mai). Né l'allocazione né l'algoritmo di liberazione usano operazioni di heap su questo albero binario, per quanto ne so.
Eric Dubé,

5

IMO è semplicemente un incidente / coincidenza che queste due cose completamente indipendenti abbiano lo stesso nome. E 'come grafico e grafico .


I due grafici possono comunque essere in qualche modo correlati. Immagina il grafico di una funzione come segue: Il dominio tupla, intervallo) è un vertice e un bordo collega due di questi vertici

2
@Amit: per grafici continui ciò significherebbe un numero infinito di vertici. Questo va bene, ma ciò rende insignificante anche il concetto di spigoli tra i vertici. Nel grafico della funzione f (x) = x * 2, c'è un bordo tra (0,0) e (1,2)? Se sì, che ne dici di (0,0) e (0,5,1)? (0,0) e (0,25,0,5)? Non c'è modo di avere il concetto di un bordo tra i vertici, quindi questo non è davvero un grafico.
MAK

5

La struttura dei dati simile a un heap viene utilizzata dall'algoritmo per trovare l'allocazione di memoria disponibile. Quanto segue è tratto da http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html .

Quando newviene invocato, inizia a cercare un blocco di memoria libero che si adatti alle dimensioni della richiesta. Supponendo che un tale blocco di memoria venga trovato, viene contrassegnato come riservato e viene restituito un puntatore a tale posizione. Esistono diversi algoritmi per raggiungere questo obiettivo, poiché è necessario scendere a compromessi tra la scansione dell'intera memoria per trovare il blocco libero più piccolo più grande della dimensione dell'oggetto o restituire il primo in cui si adatta la memoria necessaria. Al fine di migliorare la velocità di ottenimento di un blocco di memoria, le aree di memoria libere e riservate vengono mantenute in una struttura di dati simile agli alberi binari chiamata heap.


1
Sono estremamente scettico di questo, in particolare "... le aree di memoria libere e riservate sono mantenute in una struttura di dati simile agli alberi binari chiamata heap". Mi sembra che l'autore indovini che esiste una connessione, basata sul nome "heap", e probabilmente si sbaglia. Qualcuno può confermare / confutare?
Don Hatch,

1
Dopo alcune ricerche leggere sul sistema Binary Buddy (usato in Linux), può essere rappresentato da un albero binario a causa di come partiziona i dati. Questo albero binario appare come un heap massimo valido se si osservano i nodi in termini di memoria totale, ma i nodi non vengono inseriti in questo albero binario in quanto si trovano in un heap massimo - i nodi vengono inseriti direttamente nella più piccola foglia di memoria libera> = la dimensione richiesta. 1 2 3
Eric Dubé,

1

I termini colloquiali stack memory e heap memory non sono utilizzati nello standard C ++. Lo standard utilizza l'archiviazione statica, l'archiviazione thread, l'archiviazione automatica e l'archiviazione dinamica.

Maggiori informazioni sono disponibili nella sezione Durazione di stoccaggio dello standard.

Quindi, dal punto di vista della lingua e della libreria standard, non c'è confusione.


1

D. Che cos'è un heap? A. Un heap è una raccolta di oggetti posizionati uno sopra l'altro.

Risposta alla tua domanda: sia l'heap di memoria che l'heap binario usano lo stesso concetto che conosci. I dati vengono archiviati sotto forma di heap nella memoria nello stesso ordine in cui sono scritti nel programma, mentre l'heap binario è una struttura di dati che segue lo stesso concetto di archiviazione dei dati in modo ordinato sotto forma di heap (Dati in alto dell'altro). Fammi sapere cosa ne pensi nella sezione commenti.


-2

Forse il primo heap di memoria implementato è stato gestito da una struttura heap?


8
Questa ipotesi non sembra affatto ovvia: in che modo un heap (la struttura dei dati) è utile per mantenere un heap (la regione della memoria dinamica)?
Keith Randall,

7
-1. Preferirei una dichiarazione autorevole con prove invece di ciò che ovviamente è solo un'ipotesi.
Rob Kennedy,

Altamente improbabile. Non sembra esserci alcuna buona ragione per usare un heap (la struttura dei dati) per gestire l'heap (il pool di memoria libera).
Jason,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.