Differenza tra un heap e una coda prioritaria


36

Ho sempre pensato che cumuli e code di priorità erano sinonimi - una struttura dati astratta che sostiene i insert, findMine le deleteMinoperazioni.

Alcune pubblicazioni sembrano concordare con me, ad esempio Purely Functional Data Structures (capitolo 3) di Chris Okasaki.

D'altra parte, la pagina heap di Wikipedia la definisce come una struttura di dati basata su alberi e afferma che gli heap sono un'implementazione concreta di code prioritarie.

Sto facendo molta fatica a conciliare questo con il fatto che riesco a pensare a più di una implementazione heap: cumuli di sinistra, cumuli binomiali, cumuli di splay ...

Il semplice fatto che un heap possa essere implementato con diverse strutture di dati non significa, per definizione, che sia una struttura di dati astratta? E se è così, c'è una differenza reale con le code prioritarie?


11
Leggi la pagina di Wikipedia sulle code di priorità ( en.wikipedia.org/wiki/Priority_queue ), dice "una coda di priorità può essere implementata con un heap o una varietà di altri metodi come un array non ordinato" - e questa è in realtà la risposta a la tua domanda.
Doc Brown,

2
Beh, non proprio - non mi aiuta a capire se un heap è una struttura di dati concreta o astratta. Tenderei a dirne uno astratto, poiché ci sono molte implementazioni concrete di un mucchio. In tal caso, un elenco di priorità e un heap sono entrambi strutture di dati astratte con le stesse proprietà, quindi ho bisogno di aiuto per capire la differenza e dire che uno è una possibile implementazione dell'altro non è terribilmente utile se nessuno dei due è effettivamente un attuazione concreta.
Nicolas Rinaudo,

Le cose vanno ancora peggio: un heap binario può essere implementato come un array o come un albero binario. Fortunatamente, non ho ancora sentito parlare di un array implementato come qualcos'altro.
Alexey,

Risposte:


25

Una coda prioritaria può avere qualsiasi implementazione, come un array che cerchi linearmente quando fai il pop. Tutto ciò significa che quando fai il pop ottieni il valore con il minimo o il massimo a seconda.

Un heap classico come viene generalmente indicato è di solito un heap minimo. Un'implementazione che presenta una buona complessità temporale ( O(log n)push and pop) e nessun sovraccarico di memoria.


4
Intendi dire che la differenza è che, mentre essi condividono le stesse operazioni ( findMin, deleteMin, insert"buoni" le complessità), mucchi sono garantiti per loro dove code di priorità non lo fanno?
Nicolas Rinaudo,

L'heap non può avere anche implementazioni diverse con complessità temporali diverse (ad esempio un normale albero binario collegato)? Inoltre, la complessità temporale dipende dalla memoria utilizzata. Se si tratta di un nastro magnetico O(log(n)), suppongo che non ci sarà alcun tipo di push and pop.
Alexey,

6

Questo sito Web fornisce una spiegazione molto chiara. http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html

In breve, una coda di priorità può essere implementata utilizzando molte delle strutture di dati che abbiamo già studiato (un array, un elenco collegato o un albero di ricerca binario). Tuttavia, tali strutture di dati non forniscono le operazioni più efficienti. Per rendere tutte le operazioni molto efficienti, useremo una nuova struttura di dati chiamata heap.


1
Nota che nel riepilogo della pagina a cui ti sei collegato, la coda di priorità stessa viene chiamata struttura dati .
Alexey,

2

Penso che ciò che hai scritto su concreto vs astratto sia corretto. Laddove dici che gli heap di splay, gli heap binomiali sono diverse implementazioni di heap, penso che sia più corretto affermare che sono diversi tipi di heap. Heap Penso a una categoria di implementazione che generalmente garantisce non solo la stessa interfaccia, ma anche gli stessi tempi di accesso.

Lo vedi con mappe associative e anche tabelle hash e alberi di ricerca binari. I bts e le tabelle hash sono entrambe strutture dati concrete che forniscono l'interfaccia astratta della mappa associativa. Gli alberi neri rossi e gli alberi avl sono entrambi bsts bilanciati, con le stesse grandi garanzie O e la stessa interfaccia aggiuntiva (in ordine di attraversamento). Sono diversi tipi di alberi, direi più che diverse implementazioni di alberi. Sono implementazioni diverse ma strettamente correlate delle mappe associative.

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.