Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Podobné dokumenty
Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

5 Rekurze a zásobník. Rekurzivní volání metody

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Abstraktní datové typy: zásobník

Programování v C++ 1, 16. cvičení

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Binární vyhledávací stromy II

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Algoritmy a datové struktury

Principy objektově orientovaného programování

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Úvod do programovacích jazyků (Java)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Dynamické datové struktury II.

Základní datové struktury III: Stromy, haldy

Stromy. Jan Kybic.

Spojové struktury. Spojová struktura (linked structure):

Třídy a objekty -příklady

Rozptylování, stromy - zákl. vlastnosti

1. Téma 12 - Textové soubory a výjimky

Algoritmizace a programování

Stromy, haldy, prioritní fronty

Iterator & for cyklus

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Datové struktury. alg12 1

ABSTRAKTNÍ DATOVÉ TYPY

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Úvod do programovacích jazyků (Java)

PŘETĚŽOVÁNÍ OPERÁTORŮ

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Typický prvek kolekce pro české řazení

Rekurzivní algoritmy

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Teoretické minimum z PJV

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Vytváření a použití knihoven tříd

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Zápis programu v jazyce C#

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Dynamické datové struktury I.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Seminář Java IV p.1/38

Dynamické struktury a Abstraktní Datový Typy (ADT)

Část 1 Spojové struktury (stromy) Dynamické struktury a Abstraktní Datový Typy (ADT) Část 2 Abstraktní datový typ. Část 3 Příklad ADT Prioritní fronta

Úvod do programování - Java. Cvičení č.4

Java a XML. 10/26/09 1/7 Java a XML

Algoritmizace a programování

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Technologie JavaBeans

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

Programování v Javě I. Leden 2008

KTE / ZPE Informační technologie

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

typová konverze typová inference

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Dynamické datové struktury IV.

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

7. Dynamické datové struktury

Spojové struktury. x, y, a, b. X1 y1 X2 y2 X3 y3. Grafické objekty bod. kružnice. obdélník. lomenáčára

Kolekce, cyklus foreach

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Dynamicky vázané metody. Pozdní vazba, virtuální metody

OOPR_05. Případové studie

Programování v jazyce JavaScript

Programování v Javě I. Únor 2009

Dynamické programování

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Paměť počítače. alg2 1

9. přednáška - třídy, objekty

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

20. Projekt Domácí mediotéka

Java - řazení objektů

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Výčtový typ strana 67

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Regulární výrazy. Vzory

Komponenty v.net. Obsah přednášky

Java Výjimky Java, zimní semestr

Dynamické datové struktury III.

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Jazyk C# (seminář 6)

Transkript:

Základní pojmy Stromy doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Graf uzly hrany orientované / neorientované Souvislý graf Acyklický graf Strom souvislý, acyklický orientovaný graf DAG každý uzel má nejvýše jednoho předchůdce kořen, list Stromy 2 Příklady Unární strom = seznam Binární strom Rekurzivní datové struktury Seznam = Nic Uzel(data: Object, next: Seznam) Strom = Nic Uzel(data: Object, left: Strom, right: Strom) Obecný strom Stromy 3 Stromy 4 1

Binární strom data Implementace binárního stromu left public interface Node Object getdata(); void setdata(object data); right // data Node getleft(); // levý podstrom Node getright(); // pravý podstrom ` Stromy 5 public class TreeNode implements Node public TreeNode(Object d, Node l, Node r) data = d; left = l; right = r; public Object getdata() return data; public void setdata(object data) this.data = data; public Node getleft() return left; public Node getright() return right; private Object data; private Node left, right; Stromy 6 Příklad a Rekurzivní funkce Node root = new TreeNode( a, new TreeNode( b, null, null), new TreeNode( c, null, new TreeNode( d, null, null))); b c Stromy 7 d Problém: výpočet délky seznamu Rozdělíme na dvě části: a) Triviální případ řešení známe přímo b) Obecný případ předpokládáme, že už máme výsledek vypočtený pro problém o krok menší z této hodnoty a dalších údajů vypočteme výsledek length [ ] = 0 length (x : zbytek) = 1 + length zbytek Stromy 8 2

Počet uzlů ve stromu static int pocetuzlu(node root) if( root == null ) return 0; // triviální případ // řešení menšího problému int pocet_vlevo = numnodes(root.getleft()); int pocet_vpravo = numnodes(root.getright()); // výsledek return pocet_vlevo + pocet_vpravo + 1; Stromy 9 Nerekurzivní řešení Často bývá náročnější Strom = nelineární struktura v cyklu můžeme projít přes celou levou větev co s pravou větví? poznamenáme si ji do zásobníku dojdeme-li na levý konec, vybereme prvek ze zásobníku a pokračujeme opět směrem doleva je-li zásobník prázdný, výpočet končí Závěr: snažte se najít rekurzivní řešení Stromy 10 Převod stromu na text public String tostring() return " (" + data + (left==null? " null" : left.tostring()) + (right==null? " null" : right.tostring()) + ")"; // operace + se vnitřně realizuje pomocí // objektu StringBuffer Převod stromu na text // ekvivalentní řešení public String tostring() StringBuffer sb = new StringBuffer(" ("); sb.append(data).append(left==null? " null" : left.tostring()).append(right==null? " null" : right.tostring()).append(")"); return sb.tostring(); Stromy 11 Stromy 12 3

Převod stromu na text // efektivnější řešení // StringBuffer se vytváří pouze jednou public String tostring() StringBuffer sb = new StringBuffer(); this.tostring(sb); return sb.tostring(); Převod stromu na text // pomocná metoda private void tostring(stringbuffer sb) sb.append(" ("); sb.append(data); if( left==null ) sb.append(" null"); else left.tostring(sb); if( right == null ) sb.append(" null"); else right.tostring(sb); sb.append(")"); Stromy 13 Stromy 14 Průchody binárním stromem Průchody binárním stromem Preorder data levý podstrom pravý podstrom Inorder levý podstrom data pravý podstrom Postorder levý podstrom pravý podstrom - data * a + b inorder c preorder * a + b c inorder a * b + c postorder abc+* Stromy 15 Stromy 16 4

Převod stromu na seznam public static final int PREORDER = 1; public static final int INORDER = 2; public static final int POSTORDER = 3; public List traverse(int order) List list = new ArrayList(); traverse(list, order); return list; Převod stromu na seznam private void traverse(list list, int order) if( order == PREORDER ) list.add(data); if( left!= null ) left.traverse(list, order); if( order == INORDER ) list.add(data); if( right!= null ) right.traverse(list, order); if( order == POSTORDER ) list.add(data); Stromy 17 Stromy 18 Příklad výpis uzlů stromu public void print(int order) List list = this.traverse(order); // System.out.println(list); Iterator it = list.iterator(); System.out.print("[ "); while( it.hasnext() ) System.out.print(it.next()); System.out.print(" "); System.out.println("]"); Binární vyhledávací strom 6 <= 6 > 6 3 8 <= 3 > 3 > 8 1 5 9 Stromy 19 Stromy 20 5

Vyhledání uzlu ve stromu - rekurzivní varianta boolean contains(comparable obj) int c = obj.compareto(this.data); if( c == 0 ) return true; if( c < 0 ) return left==null? false : left.contains(obj); else return right==null? false : right.contains(obj); Vyhledání uzlu ve stromu - nerekurzivní varianta boolean contains(comparable obj) Node node = this; while( node!= null ) int c = obj.compareto(node.getdata()); if( c == 0 ) return true; node = c < 0? node.getleft(); : node.getright(); return false; Stromy 21 Stromy 22 Reprezentace výrazu stromem Vnitřní uzly: operátory: + - * /... Listy: operandy: čísla, proměnné,... Vyhodnocení výrazu průchod typu postorder nejprve se vyhodnotí operandy, pak operátor Reprezentace výrazu stromem interface Expr int eval(); // vyhodnocení výrazu abstract class BinaryExpr implements Expr Expr left; Expr right; Stromy 23 Stromy 24 6

Reprezentace výrazu stromem class PlusExpr extends BinaryExpr public int eval() return left.eval() + right.eval(); class ConstExpr implements Expr public ConstExpr(int value) this.value = value; public int eval() return value; private int value; Stromy 25 Reprezentace výrazu stromem // (3 + 2) + 5 Expr expr = new PlusExpr( new PlusExpr( new ConstExpr(3), new ConstExpr(2) ), new ConstExpr(5) ); System.out.println(expr.eval()); Stromy 26 Úkol pro cvičení Rozšiřte reprezentaci výrazu o třídy pro operátory násobení, změny znaménka Doplňte reprezentaci výrazu o metodu tostring() umožňující převod výrazu na řetězec pozor na závorky, je třeba je doplnit! quick&dirty řešení závorky doplnit vždy Stromy 27 7