====== 12 - Spojové struktury a ADT ======
Bude upřesněno
===== Náplň cvičení =====
* Abstraktní datové typy - konkrétněji prioritní fronta
* Implementace prioritní fronty
* Písemný test
V tomto cvičení se kromě psaní testu budeme věnovat abstraktním datovým typům (ADT).
V předešlých cvičeních jste se seznámili například s frontou a zásobníkem.
Dnes si ukážeme abstraktní datový typ prioritní fronta.
Vyzkoušíme si základní implementaci prioritní fronty lineárním vyhledáváním.
V domácím úkolu pak budeme implementovat prioritní frontu binární haldou.
===== ToDoList =====
Jak jste již v tomto semestru zjistili, je třeba dobře plánovat svůj čas, abyste dostáli svým povinostem.
Jakmile máme úkolů mnoho, tak se hodí nějaký úkolníček nebo chcete-li ToDoList.
Úkoly si můžeme ukládat do fronty. Jistě jste již slyšeli, že fronta je tzv. FIFO,
co to znamená? V jakém pořadí budeme úkoly z fronty odebírat?
Jednotlivé úkoly mají svoji prioritu. Ač je určení si priorit v tomto případě stěžejní,
my se určením priorit v PR1 nebudeme zatěžovat. Předpokládejme, že priority jsou určeny.
Nyní je potřeba úkoly zpracovat v pořadí podle priority - samozřejmě od nejvyšší priority!
Mohli bychom úkoly ve frontě seřadit. Úkoly ale obvykle přibývají dříve než stihneme všechny předchozí zpracovat ([[http://9gag.com/gag/aQqLVK8]]).
Seřadit frontu po přidání nového prvku je možné, ale tento přístup pak z každého přidání prvku dělá výpočetně náročnou operaci.
Ukážeme si k čemu by nám mohl být abstraktní datový typ prioritní fronta.
Zkusíme si, že prioritní frontu můžeme implementovat různými způsoby. A ne všechny způsoby budou stejně efektivní.
=== Úkoly: ===
- Stáhneme a spustíme si připravený projekt {{courses:A0B36PR1:tutorials:12:pr1-lab12.zip|}}.
- Metoda //run// ve třídě //Simulator// přijímá parametr tasks. Jakého typu může být tento parametr? Vysvětlete, proč můžeme z //Lab12.main// volat metodu //run// se současnými parametry typu //ArrayQueue//, //LinkedList// a //PriorityQueue//.
- Podívejme se na rozhraní fronty (interface Queue). Vysvětlete jednotlivé operace.
- V čem se liší prioritní fronta od "klasické" fronty? Podívejme se na PriorityQueue interface. Jak bychom chtěli, aby vypadal výstup při použití prioritní fronty?
- Implementujte //Comparator//, tak aby platil popis metody //compare// (cz.cvut.fel.pr1.provided.Comparator.java).
- Doimplementujte ArrayPriorityQueue. Můžete použít metodu //remove// definovanou v //ArrayQueue//. (Pokud si nevíte rady, můžete se podívat do LListPriorityQueue, kde je také fronta rozšířena na prioritní ale s využitím spojového seznamu.)
- Vyzkoušejte implementace porovnat s různým počtem úkolů (Task).
Jak přidat úkoly ...
int initTaskCount = 10000;
boolean verbose = false;
===== Domácí úkol =====
[[courses:a0b36pr1:hw:lab12|]]