Seznamy a stromy Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti. Klíčové pojmy: Seznam, spojový seznam, lineární seznam, strom, list, uzel.
Úvod Pokud chceme uložit větší množství dat, použijeme pole. V tomto případě je ale nevýhoda to, že musíme dopředu znát rozsah pole a vymezit pro něj rozsah v paměti. Pokud špatně odhadneme rozsah a pole je větší, než jsme předpokládali, program v běhu zkolabuje. Naopak pro menší pole, než byl původní odhad, zbytečně rezervujeme paměť. Tedy například program pro zpracování dat pro skupinu lidí, jejíž velikost se mění, může být problematický. A pokud budeme potřebovat u těchto lidí zaznamenat jejich potomky, tak problém je ještě komplikovanější. Řešením jsou lineární seznamy a stromy.
Lineární seznam Lineární seznam je v podstatě řetěz struktur, které jsou spolu propojeny vždy na další strukturu. Propojení může být buď jednosměrné (jednosměrný lineární seznam) či obousměrné. V případě obousměrného lineárního seznamu existuje ve struktuře vazba jak na následující strukturu, tak i na předcházející strukturu. Dále může existovat i kruhový seznam, kdy poslední prvek je napojen na první.
Adresa Data Následní k
Adresa Data Následní k
Adresa Data Následní k
Adresa Data Následní k
Jednosměrný lineární seznam
Aktuální datum
Název kapitoly
Stránka/počet stránek
Důležitou operací je vložení dalšího prvku. Je potřeba utvořit novou vazbu k novému prvku, aniž by jsme ztratily ztratili adresu na kterou jsme ukazovaly, protože tam budeme ukazovat z nového vloženého prvku.
Adresa Data Následní k
Adresa Data Následní k
Adresa Data Následní k
Adresa Data Následní k
Adresa Data Následní k
Vložení dalšího prvku do seznamu
Při práci s jednosměrným lineárním seznamem je nutno zvládnout následující operace: • vytvoření prvku spojového seznamu • přidání prvku do seznamu na jeho konec • vložení prvku dovnitř seznamu • vyjmutí prvku ze seznamu • nalezení určitého prvku v seznamu • nalezení následujícího prvku v seznamu • zjištění délky seznamu Další speciální varianty lineárního seznamu jako například: • Zásobník - jedná se o jednosměrný lineární seznam u kterého jsou uzpůsobeny některé operace práci s tímto seznamem, tak aby se tato datová struktura chovala jako paměť typu LIFO(vkládání nakonec,výběr z konce). • Fronta - jedná se o jednosměrný lineární seznam u kterého jsou uzpůsobeny některé operace práci s tímto seznamem, tak aby se tato datová struktura chovala jako paměť typu FIFO(vkládání nakonec,výběr ze začátku). V objektových jazycích máme metody, které nám velmi ulehčují programování. Obyčejný seznam v Java Je reprezentován třídou JList a jako model používá rozhraní ListModel. Rozhraní modelu má pouze 4 metody, pro přidání/odebrání odběratele událostí, pro zjištění délky seznamu a pro získání určitého prvku seznamu. Text prvku se získává pomocí metody toString() příslušného prvku, v seznamu mohou bez problémů být i prvky různých typů.
Aktuální datum
Název kapitoly
Stránka/počet stránek
Co se týká samotného vykreslování, seznam nemá vlastní posuvníky (je to podobné jako např. u JTextArea). Proto ho téměř vždy umísťujeme do komponenty JScrollPane, která posuvníky poskytne. Třída seznamu disponuje obrovským množstvím metod (což dokazuje, jak velké pole působnosti zde máme) - z prostorových důvodů se ovšem podíváme jen na několik málo z nich. Zde je krátký příklad, jak se seznamem pracovat: DefaultListModel m = new DefaultListModel(); m.addElement("Prvek 1"); m.addElement("Prvek 2"); m.addElement("Prvek 3"); JList list = new JList(m); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane sp = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); ... Object o = list.getSelectedValue();[2]
Stromy Strom je nelineární datová struktura, na rozdíl od všech předchozích datových struktur (zásobník, fronta, seznam), které jsou lineární. To znamená, že ve frontě, zásobníku, či seznamu existuje maximálně jeden předchozí a jeden následující prvek. Naproti tomu ve stromě může sice také být nejvýše jeden prvek předcházející, ale prvků následujících může být obecně více. Tato vlastnost stromu jej předurčuje pro reprezentaci částečného uspořádání, zatímco lineární struktury slouží pro reprezentaci uspořádání úplného. V nejjednodušším případě mohou být ve stromě nejvýše dva následníci - takovým stromům říkáme binární stromy. Následníky v binárním stromě budeme rozlišovat jako levý a pravý následník. Reprezentace binárního stromu se tedy skládá z reprezentace jednotlivých informačních uzlů stromu, které obsahují tři položky - vlastní informaci a odkaz na levého a pravého následníka. Uzlu, který nemá žádného předchůdce, říkáme kořen stromu. Uzlům, které nemají žádné následníky říkáme listy stromu.[3]
Aktuální datum
Název kapitoly
Stránka/počet stránek
1
2
4
3
5
6
7
8
9 Orientovaný strom
Vlastnosti stromů: • N-arita - Kolik smí mít každý uzel maximálně potomků, z tohoto hlediska patří mezi neoblíbenější binární stromy (každý uzel má 0, 1 nebo 2 potomky). • Hloubka - Hloubkou rozumíme maximální hloubku libovolného uzlu (kořen je v hloubce 0, potomci v hloubce 1, vnuci v hloubce 2...). • Pravidelnost - N-ární strom je pravidelný, pokud má každý uzel 0 nebo N potomků. • Vyváženost - N-ární strom je vyvážený, pokud pro všechny listy platí, že jsou nejsou o nic více hlouběji, než kterýkoliv jiný list. Definice „o nic více hlouběji“ se liší v závislosti na konkrétní implementaci. • Úplná pravidelnost - Úplným N-árním pravidelným stromem hloubky k je strom, jehož každý uzel má 0 nebo N potomků a všechny uzly jsou ve hloubce k.[1] K procházení stromů je velmi vhodný algoritmus rekurze. Procházení stromů: • Do šířky – procházíme graf jakoby po patrech(všechny první následníky, všechny druhé následníky atd…) • Do hloubky – jdeme po jedné větvi až do posledního uzlu • Heuristicky – k procházení stromu užíváme váhy, kde každý uzel má svou hodnotu(např. nižší hodnota = výhodnější). Operace na stromech: • Počet všech prvků • Hledání prvků • Přidání nového prvku na určitou pozici ve stromu • Smazání prvku • Vyjmutí celé části stromu – prožezávání (anglicky „pruning“) • Přidání celé části do stromu – roubování (anglicky „grafting“) • Hledání kořene pro každý uzel • Výška (hloubka) stromu Aktuální datum
Název kapitoly
Stránka/počet stránek
Shrnutí: Lineární seznam je dynamická datová struktura která se na první pohled podobá poli, avšak data v této struktuře se uchovají poněkud jiným způsobem. Stromy, a zejména jejich některé konkrétní vyhledávací varianty, nacházejí široké uplatnění v oblastech, kde je třeba řešit ukládání a vyhledávání dat, zejména tam, kde je kritickou omezující podmínkou vyhledání dat s co nejmenší úrovní složitostí a při co nejméně přístupy čtení..
Literatura: [1] www.algoritmy.net; http://www.algoritmy.net/article/104/Strom; 6.11.2010 [2] www.linuxsoft.cz; http://www.linuxsoft.cz/article.php?id_article=1305; 6.11.2010 [3] wikipedia.org; http://cs.wikipedia.org/wiki/Strom_%28datov%C3%A1_struktura%29; 6.11.2010
Aktuální datum
Název kapitoly
Stránka/počet stránek