Perché la maggior parte delle lingue fornisce un min-heap anziché un'implementazione di max-heap?


19

Ho appena notato qualcosa e mi chiedo se c'è qualche motivo per questo. Ad eccezione di C ++ (std :: priority_queue è un heap massimo), non conosco nessun altro linguaggio che offra un heap massimo.

Il modulo heapq di Python implementa un min-heap binario in cima a un elenco.

La libreria Java contiene una classe PriorityQueue, che implementa una coda con priorità minima.

La libreria di Go contiene un modulo contenitore / heap, che implementa un min-heap in cima a qualsiasi struttura di dati compatibile.

Il framework Core Foundation di Apple contiene una struttura CFBinaryHeap, che implementa un min-heap.

Trovo un max-heap più intuitivo di un min-heap e credo che tecnicamente la differenza di implementazione sia solo una questione di modifica di un operatore di confronto. C'è qualche vero motivo? La maggior parte delle applicazioni necessita di un heap min anziché max? Grazie in anticipo


Non sono esattamente la stessa cosa? Voto per chiudere come argomentativo.

2
Solo un paio di giorni fa avevo bisogno di un heap min in C ++ ed ero un po 'infastidito dal fatto che il valore prioritario fosse impostato su un heap massimo. Mi ha costretto a definire l'operatore> sulla mia classe personalizzata, che aveva già l'operatore <. Quando si lavora con i grafici, in genere si desidera dare la priorità ai bordi più corti, quindi è necessario un heap minimo.
LaC,

2
@LaC: puoi usare std::not2(std::less<T>()).

Risposte:


9

Come altri hanno osservato, se l'heap accetta un comparatore, non è troppo difficile ottenere un comportamento o l'altro. Una rapida lettura del codice di Google, tuttavia, suggerisce che min-heap è di gran lunga più prevalente nel codice reale, a causa di due applicazioni che si presentano ripetutamente.

  • Dijkstra / A * / molti altri algoritmi di percorsi più brevi (perché i percorsi parziali si allungano).

  • Simulazione di eventi (perché il tempo passa in avanti).

Inoltre, direi che, poiché l'ordinamento predefinito restituisce elementi da piccoli a grandi, anche l'heap predefinito dovrebbe essere.


2
Di solito programma in C ++ e mi chiedo il contrario: perché C ++ non implementa un min-heap? Come hai detto, la maggior parte degli algoritmi utilizza un min-heap.
Martín Fixman,

5

È solo una questione di gusti. Non penso che ci sarà un motivo specifico. È come ad alcune persone piace esprimere i problemi di ottimizzazione come minimizzare i costi, mentre ad altri piace massimizzare i profitti.


3

La maggior parte delle lingue che conosco consentono di passare un parametro per decidere se deve essere un heap min o max. Quindi il valore predefinito è alquanto arbitrario. Immagino che per la maggior parte delle lingue sia una questione di coerenza definire quale sia l'operatore predefinito. Per C ++ nello stl il valore predefinito std::lessporta a un min-heap.

La coerenza dell'utilizzo std::lessper impostazione predefinita ovunque significa che è necessario implementare questo confronto solo quando si utilizza qualsiasi tipo di struttura di dati e non è necessario decidere quale struttura di dati verrà utilizzata successivamente durante la progettazione delle classi. Immagino che sia lo stesso per altre lingue con l'unica differenza che lo standard è un confronto maggiore di quello.


3
Non penso che ci sia una tale connessione. È possibile implementare entrambi i tipi di heap utilizzando <o>. In effetti, std :: less è il valore predefinito in STL, ma implementano un heap massimo anziché un heap minimo.
LaC,

1

Fondamentalmente, il valore dell'indice è un numero arbitrario. Se ritieni che il numero rappresenti una priorità e che numeri più grandi siano priorità più alte, ha senso un max-heap. Ma se i numeri rappresentano, ad esempio, numeri concettuali di panetteria ("Prendi un numero"), allora min-heap ha più senso.

Puoi sempre convertire l'uno dall'altro prendendo il complemento a 1 dell'indice.

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.