2011-06-08 11 views
29

Stavo osservando il diverso tipo di strutture di dati dell'heap.Esiste un'implementazione Java standard di un heap di Fibonacci?

L'heap di Fibonacci sembra avere la migliore complessità del caso peggiore per (1) inserimento, (2) cancellazione e (2) ricerca dell'elemento minimo.

Ho trovato che in Java esiste una classe PriorityQueue che è un heap binario bilanciato. Ma perché non hanno usato un mucchio di Fibonacci?

Inoltre, esiste un'implementazione di un heap di Fibonacci in java.util?

Grazie!

+2

Le raccolte java forniscono solo le strutture dati più comuni. Suppongo che l'heap di Fibonacci sia più specializzato, o forse sta usando più memoria. –

+2

@James, che importa di questo con l'heap di Fibonacci? o.o – ignis

risposta

42

No, l'API delle raccolte Java standard non contiene un'implementazione di un heap di Fibonacci. Non sono sicuro del perché questo sia, ma credo che sia perché gli heap di Fibonacci sono asintoticamente grandi in senso amortizzato, hanno enormi fattori costanti nella pratica. Anche il framework delle collezioni non ha un heap binomiale, che sarebbe un altro buon heap da includere.

Come plug-in totalmente svergognato, ho an implementation of a Fibonacci heap in Java on my personal website. Non sono sicuro di quanto sarà utile, ma se sei curioso di vedere come funziona, penso che potrebbe essere un buon punto di partenza.

Spero che questo aiuti!

+0

Grazie mille. La tua implementazione sembra ben fatta e ben documentata con molte spiegazioni. Darei un'occhiata a questo. – Phil

+1

ci sono alcuni test (unitari)? anche quale licenza è il codice? – Karussell

+0

Wow, stavo per scrivere il mio per divertimento ma il tuo è così bello! – Andy

5

Ma perché non hanno utilizzato un heap di Fibonacci?

Probabilmente perché questi heap hanno un sovraccarico molto maggiore per entrata rispetto alle chiavi binarie.

Inoltre, è presente un'implementazione dell'heap di Fibonacci in Java.util?

No, ma

  1. C'è graphmaker da Nathan Fiedler - GPL e con buona test coverage, ma hanno uno sguardo in this nice blog post su di esso e circa problemi di Fibonacci impl può avere. In questo post vengono referenziate molte altre implementazioni Java.
  2. Sussiste qualche codice con unità test here
  3. Il JGraphT project (anche Nathan Fiedler) e con (alcuni minori) tests ma LGPL.
  4. Ultimo ma non meno importante c'è Neo4j - GPL - nessun test.
1

Ma perché non hanno usato un mucchio di Fibonacci?

Penso che il motivo principale sia perché l'heap di Fibonacci può essere d'aiuto solo nel caso in cui si abbia molta più operazione di diminuzione della connessione collegata a un'operazione extractMin. Ad esempio, quando lo si utilizza con l'algoritmo di Dijkstra.

Inoltre, è presente un'implementazione dell'heap di Fibonacci in Java.util?

Non c'è implementazione in Java.util, ma ho fatto qualche esperimento su questo argomento usando versioni open-source esistenti dell'heap di Fibonacci. Lo puoi trovare on my blog o sul project's GitHub repository.

+0

Potete per favore elaborare la vostra risposta per la prima domanda – arunmoezhi

+0

Certo che posso. L'heap di Fibonacci ha superiorità su heap binario nell'esecuzione di operazioni di riduzione e inserimento, inoltre ha la stessa complessità temporale per extractMin, ma questa operazione richiede molto più tempo per FH rispetto a BH, perché sta consolidando la foresta interna dell'albero. Quindi, se hai un decrementKey molto basso, allora è più lento del normale Heap binario. Per alcuni grafici speciali, questo è il caso dell'algoritmo di Dijkstra. – gabormakrai

Problemi correlati