Search
Vaším úkolem je implementovat prioritní frontu binární haldou (BinaryHeap).
package cz.cvut.fel.pr1; import cz.cvut.fel.pr1.provided.BinaryHeap; import cz.cvut.fel.pr1.provided.Comparator; import cz.cvut.fel.pr1.provided.PriorityQueue; import cz.cvut.fel.pr1.provided.Task; public class HeapQueue implements PriorityQueue, BinaryHeap{ //implementace }
V předchozím textu jsme si představili, jak bude HeapQueue vypadat navenek, neboli jaké bude muset mít metody. Nyní si pojďme říci, jaké bude muset HeapQueue mít vlastnosti. Začneme vlastnostmi prioritní fronty. Ty jsou stejné jako u běžné FIFO fronty jen s tím rozdílem, že prvky z fronty vyndaváme v pořadí daném prioritou nikoli pořadím na vstupu (FIFO). Co je pro nás nové, je struktura zvaná binární halda.
Binární halda (EN wikipedia / CS wikipedia je úplný binární strom (binární strom na wikipedii), ve kterém platí tzv. “heap property”, že každý potomek má nižší nebo stejnou hodnotu než rodič sám (v případě max-haldy). V případě kdy není poslední hladina haldy zaplněna, jsou uzly ukládány do haldy zleva.
“Heap property” je rekurzivní - všechny podstromy haldy jsou také haldy. Díky tomu máme zajištěno, že se halda chová jako prioritní fronta.
Tedy platí, že kořen stromu má nejvyšší hodnotu, tedy na výstupu (v našem případě na volání poll() a peek()) je prvek s nejvyšší prioritou.