Implementace binárního stromu směrníky

Rozměr: px
Začít zobrazení ze stránky:

Download "Implementace binárního stromu směrníky"

Transkript

1 Téma: Vypracoval: Zdeněk Alčer Implementace binárního stromu směrníky 1. Teorie stromu: Pojem strom je datová struktura, která je v teorii grafů formálně definována jako zvláštní případ grafu bez cyklů. Strom (viz obr. 1) je útvar složený z vrcholů (uzlů) a hran s následujícím tvarem. Jeden význačný vrchol zcela nahoře, kterým se vstupuje do celého stromu, se nazývá kořen stromu. Tento vrchol má několik následovníků (synů) se kterými je spojen hranami. Každý vrchol může mít své následovníky a ti zase svoje atd. Žádný vrchol není následovníkem dvou nebo více vrcholů současně, naopak každý vrchol s výjimkou kořene má pouze jednoho předchůdce (otce). Vrcholy, které nemají žádné další následovníky, se nazývají listy stromu. Vrcholy s výjimkou kořene jsou vnitřními vrcholy stromu. Útvar s prázdnou strukturou je prázdný strom. Četnost stromu je maximální počet následovníků, které má některý z jeho vrcholů. Cesta od kořene k některému z vrcholů se nazývá větev. Jelikož stromy neobsahují cykly, je větev jednoznačně určena. Hloubka stromu je délka cesty (počet hran) maximální větve. Udává maximální vzdálenost mezi kořenem stromu a některým z listů. Strom, který má maximálně 2 následovníky se nazývá binární strom (obr. 2). Obyčejný binární strom je binární strom bez jakékoliv organizované formy jednotlivých prvků. V programové reprezentaci řešení binárních stromů směrníky, jsou vrcholy záznamy a nesou jednak informaci a jednak odkazy na další vrcholy. Hrany jsou reprezentovány směrníky a určují vazby mezi jednotlivými vrcholy. Pro binární stromy, kde vrchol smí mít maximálně dva následovníky, užíváme směrníky s názvy Levý a Pravý, přičemž ukazují sestupování ve směru listů. Část nesené informace tvoří klíč (obr. 3). Strana 1 (celkem 16)

2 Stromy se nejčastěji zobrazují grafickou interpretací, viz následující obrázky. obr.1 Strom 1 Kořen 1 Vnitřní vrcholy 2,3,5,8 2 3 Listy 4,6,7, obr.2 Binární strom Kořen Vnitřní vrcholy 2,3,4,8 Listy 5,6,7, obr.3 Binární strom se znázorněnými směrníky Strom Strom Klíč 1 Levý Pravý Klíč 2 Levý Pravý Klíč 3 Levý Pravý Klíč 4 Levý Pravý Klíč 5 Levý Pravý Klíč 6 Levý Pravý Klíč 7 Levý Pravý Klíč 8 Levý Pravý Klíč 9 Levý Pravý Strana 2 (celkem 16)

3 2. Datový typ směrník Pro implementace binárního stromu se směrníky se vrátíme ke zopakování obecných zásad datového typu směrník. Směrník (užíváno též ukazatel, anglicky pointer), představuje zcela odlišný způsob práce s pamětí. U všech statických proměnných lze jednoduše určit dobu jejich existence. Globální existují po celou dobu existence programu, lokální proměnné podprogramu vznikají v okamžiku jeho startu a jsou zrušeny, jakmile podprogram končí. Beze změn zůstávají jejich deklarované vlastnosti. Proměnná zpřístupněná prostřednictvím směrníku se nazývá dynamicky alokovaná proměnná. Příkaz k jejímu vytvoření musí být naprogramován. Obdobně musí být dán pokyn i pro její zrušení. Dynamicky alokované proměnné a z nich vytvořené konstrukce vznikají až za běhu programu podle současné situace. Není nutné předem stanovit, kolik jich přesně bude a kdy přesně budou existovat. Směrník v sobě neuchovává konkrétní hodnotu nějakého prvku, ale uchovává v sobě adresu prvku v operační paměti počítače. Adresa, kterou směrník obsahuje, může ukazovat do libovolné části operační paměti. Směrník ukazuje vždy na proměnnou určitého typu. Existují různé typy směrníku, vždy podle datového typu dynamické proměnné, na kterou směrník ukazuje. Každý nový směrník tedy slouží jedné dynamické proměnné. Definice směrníku obsahuje právě jméno daného typu s předchozím operátorem nepřímé adresace ^. Např. typ SmeInteger, který je směrníkem na Integer se definuje takto type SmeInteger = ^ Integer ; var Cislo : SmeInteger ; Strana 3 (celkem 16)

4 Proměnná Cislo takto bude obsahovat směrník na dynamicky alokovanou proměnnou typu Integer. Obsahem proměnné Cislo bude adresa, která má být interpretována jako adresa počátku proměnné typu Integer. Alokace paměti Alokování paměti se vyžádá prostřednictvím standardní procedury New ( <Směrník> ) ; Jejím parametrem je proměnná typu směrník. New zjistí typ tohoto směrníku a najde někde kousek paměti odpovídající velikosti. Tento kousek paměti si označí za obsazený a do proměnné uloží adresu jeho začátku. Pro náš započatý případ provedeme New ( Cislo ) ; Tím se alokuje v paměti místo pro proměnnou typu Integer a jeho adresa se uloží do proměnné Cislo. Od tohoto okamžiku Cislo ukazuje na tuto dynamicky alokovanou proměnnou. Graficky znázorněno Tímto je proměnné přidělena paměť a směrník naplněn adresou. Zápis, který uloží trojku do proměnné, na kterou ukazuje Cislo zapíšeme takto Cislo^ := 3; a graficky zobrazeno Strana 4 (celkem 16)

5 Na tutéž dynamicky alokovanou proměnnou může odkazovat několik směrníků, stačí jen přiřadit mezi sebou jejich hodnoty. Např. použijeme další deklarovanou proměnnou Nejmenši typu Integer a zapíšeme příkazy New ( Cislo ) ; Cislo^ := 3; Nejmensi := Cislo; přičemž vzniká tato situace, kdy oba směrníky obsahují adresu stejné proměnné. Pozor na zdánlivě obdobnou možnost New ( Cislo ) ; Cislo^ := 3; New ( Nejmensi ); Nejmensi^ := Cislo^; Zde čtvrtý příkaz říká do proměnné, na kterou ukazuje Nejmensi, ulož obsah proměnné, na kterou ukazuje Cislo. Zde se jedná o dvě zcela samostatně dynamicky alokované proměnné, jejichž obsahy přiřazujeme. Pak znázorněno Uvolnění paměti Dynamicky alokované proměnné jsou ručně vytvářeny a stejně i zanikají, pro odstranění se používá procedura Strana 5 (celkem 16)

6 Dispose ( <Směrník> ) Parametrem je opět proměnná typu směrník. Dynamicky alokovaná proměnná na kterou ukazuje, bude zrušena a jí vyhražená paměť se uvolní pro další použití. Obsah směrníku je po provedení Dispose nedefinován. Příkaz Dispose ( Cislo); povede k likvidaci proměnné, na kterou ukazuje Cislo. Konstanta nil. Tato speciální konstanta symbolizuje, že daný směrník nikam nevede. Nil je univerzální a lze ji přiřadit libovolnému směrníku bez ohledu na jeho konkrétní typ. Je nutno dobře rozlišovat směrník s nedefinovanou hodnotou a směrník s hodnotou nil. Hodnota směrníku je na začátku nebo po provedení Dispose nedefinována. Pokud však směrníku přiřadíme nil, jeho hodnota definována je, jen její směrník právě neukazuje na žádnou dynamickou proměnnou. Směrníky stejného typu lze navzájem porovnávat, povoleny jsou však pouze testy na rovnost ( = ) a nerovnost ( < > ). Dva směrníky jsou si rovni, pokud obsahují stejnou adresu (ukazují na tutéž proměnnou). 3. Implementace binárních stromů Strana 6 (celkem 16)

7 Strukturu typu strom lze definovat jako prázdnou strukturu, tj. prázdný strom, nebo jako vrchol (prvek), ke kterému je připojen konečný počet stromových struktur, nazývaných podstromy. Jinak řečeno každý strom je tvořen dalšími stromy, pro které platí tatáž definice. Definice stromu je tedy rekurzivní, což se promítne v použitých algoritmech, které budou obsahovat rekurzivní podprogramy. Vrchol u stromové struktury lze obecně deklarovat takto: Type SmeVrchol = ^vrchol; vrchol = record datovaslozka : TypDatoveSlozky; levypodstrom, pravypodstrom : SmeVrchol Vrcholy jsou reprezentovány dynamickými proměnnými stejného typu záznam. Ze zápisu je patrné, že položky levypodstrom a pravypodstrom jsou opětně definovány jako typ směrník na strom. Při realizaci určité funkce či procedury, která má být uskutečněna nad všemi vrcholy, je třeba celým stromem projít a všechny vrcholy navštívit. K průchodu binárním stromem nám slouží tři rekurzivní metody, které se od sebe liší vzájemným pořadím provedení dané operace nad daným vrcholem (uzlem) a průchodem oběma podstromy. Metody s názvy Preorder, Inorder a Postorder si ukážeme na programové realizaci procedury, jejímž parametrem je směrník na zpracovávaný vrchol. 1. Procedura Preorder nejprve provádí danou operaci nad daným vrcholem (uzlem), poté provede průchod levým podstromem a nakonec pravým podstromem. procedure Preorder(Strom : SmeVrchol); if Strom <> nil then {neprázdný vrchol pro prohledávání? } {operace nad daným vrcholem} Preorder(Strom^.levypodstrom); {průchod levým podstromem} Preorder(Strom^.pravypodstrom); {průchod pravým podstromem} Strana 7 (celkem 16)

8 2. Procedura Inorder projde nejdříve levým podstromem, na to zpracuje operaci nad daným vrcholem a nakonec projde pravým podstromem. procedure Inorder(Strom : SmeVrchol); if Strom <> nil then Inorder(Strom^.levypodstrom); Inorder(Strom^.pravypodstrom); {průchod levým podstromem} {operace nad daným vrcholem} {průchod pravým podstromem} 3. Procedura Postorder projde nejdříve levým podstromem, na to projde pravým podstromem a nakonec zpracuje operaci nad daným vrcholem. procedure Preorder(Strom : SmeVrchol); if Strom <> nil then Preorder(Strom^.levypodstrom); Preorder(Strom^.pravypodstrom); {průchod levým podstromem} {průchod pravým podstromem} {operace nad daným vrcholem} Pokud bychom aplikovali tyto tři metody průchodu binárním stromem pro obrázek č. 2 (respektive také obr. 3), získali bychom výpisy s pořadím číselných položek: preorder: 1, 2, 4, 8, 9, 5, 3, 6, 7 inorder: 4, 8, 9, 2, 5, 1, 6, 3, 7 postorder: 9, 8, 4, 5, 2, 6, 7, 3, 1 Strana 8 (celkem 16)

9 5. Aplikace konkrétního programu s demonstrací operací pro binární strom. 5.1 Vytvoření binárního stromu Deklarace pro řešený příklad: type TStrom = ^vrchol; vrchol = record Klic: Integer; levy, pravy: TStrom var St,nalezeny: TStrom; {deklarace směrníku na kořen stromu} {a pomocného směrníku pro hledání vrcholu } Idx: Integer; {pomocné počítadlo vrcholů} Vytvoření stromu je prováděno pomocí globální procedury VytvorStrom. V ní probíhá vždy náhodný výběr pro nastavení směrníků a tím určení cesty doleva nebo doprava. Následuje zjišťování, zda existuje volná pozice pro nový vrchol (uzel), pro vybraný směrník. Následně proběhne vytvoření vrcholové proměnné pro pomocný směrník, uložení hodnoty do nového vrcholu, vynulování pomocných směrníků pro nové následovníky (potomky) a napojení tohoto vrcholu (prozatímního listu) na směrník předchůdce (otce). Tím je dosaženo vytvoření stromu s předem nedefinovanou strukturou. procedure VytvorStrom(var S: TStrom; cis: Integer); var pom: TStrom; if random(2) = 0 then {náhodný výběr cesty doleva-doprava} if S^.levy = nil then {zjištění volné pozice pro nový vrchol (uzel)} new(pom); pom^.klic := cis; {odkaz na proměnnou kam ukazuje směrník } pom^.levy := nil; pom^.pravy := nil; {vynulování pro vytvoření listu} Strana 9 (celkem 16)

10 S^.levy := pom else VytvorStrom(S^.levy, cis) {rekurzívně pokračování do levého podstromu} else if S^.pravy = nil then new(pom); pom^.klic := cis; pom^.levy := nil; pom^.pravy := nil S^.pravy := pom else VytvorStrom(S^.pravy, cis) {rekurzívně pokračování do pravého podstromu} K iniciování globální procedury VytvorStrom je sestavena procedura Vytvor_BSClick. V jejím těle probíhá operace zajišťující vytvoření kořenu s hodnotou 1 a následných vrcholů s hodnotami až do velikosti žádané hodnoty. procedure TForm1.Vytvor_BSClick(Ser: TObject); var i: Integer; {část programu pro vytvoření stromu s voláním procedury VytvorStrom} new(st);st^.levy := nil; St^.pravy := nil; St^.Klic := 1; for i := 2 to StrToInt(Edit_vytvor.text) do VytvorStrom(St,i); Idx := StrToInt(Edit_vytvor.text); Pro inicializaci náhodného generátoru hodnot je použito příkazu Randomize procedure TForm1.FormCreate(Ser: TObject); Randomize 5.2 Vykreslení a tisk vytvořeného binárního stromu Pro vykreslení struktury stromu je použita procedura Kresli_BSClick, která s využitím rekurzívní lokální procedury vykreslí na plátno grafickou strukturu vytvořeného stromu metodou postorder. procedure TForm1.Kresli_BSClick(Ser: TObject); procedure Kresli(S: TStrom; x, y, sirka: Integer); sirka := sirka div 2; if S <> nil then {neprázdný vrchol pro kreslení? } if S^.levy <> nil then {vykreslení hran vlevo} Strana 10 (celkem 16)

11 Image1.Canvas.MoveTo(x, y); Image1.Canvas.LineTo(x-sirka,y+30); Kresli(S^.levy, x-sirka, y+30, sirka); if S^.pravy <> nil then {vykreslení hran vpravo} Image1.Canvas.MoveTo(x, y); Image1.Canvas.LineTo(x+sirka,y+30); Kresli(S^.pravy, x+sirka, y+30, sirka); Image1.Canvas.TextOut(x-5, y-8, IntToStr(S^.Klic)); {zápis potomka} {tělo procedury zajišťující vymazání plátna a parametrizování volané procedury} Image1.Canvas.Brush.Color := clwhite; Image1.Canvas.Brush.Style := bssolid; Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height); Kresli(St, Image1.Width div 2, 30, Image1.Width div 2) Tisk stromu pracuje při tisku s typem řetězec, nemá tedy při výpisu řešeno zobrazení hran a pro jistou zjednodušenost řešení je zobrazená struktura pootočena o devadesát stupňů proti směru hodinových ručiček. Tvorba zobrazení je opět řešena rekurzívní lokální procedurou. procedure TForm1.Tisk_BSClick(Ser: TObject); procedure tisk(s: TStrom; h: Integer); var S1: String; j: Integer; if S <> nil then {realizace rozepsání vrcholů} tisk(s^.pravy, h+1); {hloubka (sloupec) pro pravého následníka} s1 := ''; for j := 1 to h do s1 := s1+' '; s1 := s1+inttostr(s^.klic); {realizace zvyšování hloubky následníkům} Memo1.Lines.Add(s1); {výpis hodnoty vrcholu} tisk(s^.levy, h+1) Memo1.Lines.Clear; tisk(st, 1) {hloubka (sloupec) pro levého následníka} 5.3 Prohledávání a uspořádání vytvořené struktury binárního stromu Strana 11 (celkem 16)

12 K prohledávání stromu používáme metody preorder, inorder a postorder dle obecného základu vysvětleného výše. V řešeném příkladu je vždy pro jednotlivé metody sestavena lokální procedura s výpisem zjištěných posloupností hodnot (pro ukázku metoda preorder): procedure TForm1.PreorderClick(Ser: TObject); procedure Preorder(S: TStrom); if S <> nil then {neprázdný vrchol pro prohledávání? } Memo2.Lines.Add(IntToStr(S^.Klic)); Preorder(S^.levy); Preorder(S^.pravy) {výpis hodnoty klíče} Memo2.Lines.Clear; Preorder(St) {vymazání obsahu okna pro výpis} Pro konkrétní příklad byly vytvořeny tři globální procedury Preorder_Hledej, Inorder_Hledej a Postorder_Hledej, které jsou používány i pro další algoritmy demonstrující základní operace na stromech. Při nalezení je nastaven pomocný globální směrník nalezeny jako směrník na nalezený hledaný vrchol(uzel). Ukázkou je sestavená procedura Preorder_Hledej: procedure Preorder_Hledej(S:TStrom; Hledany: Integer); if S <> nil then {neprázdný vrchol pro prohledávání? } if (S^.Klic = Hledany) then nalezeny := S; {směrník nastaven na hledaný} {vrchol} if(nalezeny = nil ) then Preorder_Hledej(S^.levy,Hledany); {pokud nenalezen prohledává se dále} {rekurzívní postup do levého podstromu} if(nalezeny = nil ) then Preorder_Hledej(S^.pravy,Hledany); {rekurzívní postup do pravého podstromu} Strana 12 (celkem 16)

13 5.4 Přidání vrcholu (uzlu) do vytvořeného binárního stromu Přidání vrcholu je sestaveno s pomocí procedury jedné ze tří metod průchodu stromem. Lze rozhodovat o směru strany kde se po vyhledání určující hodnoty vytvoří levý nebo pravý následovník. Do něj je pak vložena hodnota pomocného globálního počitadla Idx, které je při vytvoření a přidání vrcholu zvyšována. Jelikož jsou procedury shodné, závislé jsou jen od určení metod a směru je ukázkou jen sestavená procedura Pridej_Preorder_PClick (pro směr doprava): procedure TForm1.Pridej_Preorder_PClick(Ser: TObject); var kampridat,novy:tstrom; nalezeny := nil; Preorder_Hledej(St,StrToInt(Edit_kam.text)); {vyhledání vrcholu, kde se nový přidá} kampridat := nalezeny; if(kampridat <> nil) then {existuje vrchol kde se navazuje? } if(kampridat^.pravy = nil) then {pokud je pravý směrník volný, } { navazuj nový vrchol} new(novy); inc(idx); novy^.klic := Idx; novy^.levy := nil; novy^.pravy := nil; kampridat^.pravy := novy; 5.5 Vyhledání hodnoty ve vytvořeném binárním stromě K vyhledání vrcholu je využito globální procedury Preorder_Hledej (případně dalšími metodami). Nalezená hodnota je porovnávána s hledanou hodnotou a následně je indikován výsledek hledání. procedure TForm1.Hledej_PreorderClick(Ser: TObject); nalezeny := nil; Preorder_Hledej(St,StrToInt(Edit_hledej.Text)); If (nalezeny <> nil) then Label1.Caption := 'NALEZENO' else Label1.Caption := 'NENALEZENO'; 5.6 Rušení vrcholu (uzlu) vytvořeného binárního stromu Strana 13 (celkem 16)

14 Odstranění vrcholu (uzlu) ze stromu je poněkud složitější záležitost, zvláště pak jedná-li se o nijak neuspořádaný binární strom a nelze použít některých zjednodušujících operací s jasnými pravidly pro strukturu stromu. Složitost přináší fakt, že existují rozdílnosti vrcholu, listu a kořene, ale zejména nemá dojít k rozpadu struktury binárního stromu. Uváděné řešení rušení vrcholu (uzlu) probíhá ve třech fázích : - kontrolní hledání, odpojení od rodiče a samotné rušení vrcholu (uzlu). Tělo procedury Zrus_VrcholClick vykonává nejdříve hledání žádaného vrcholu (uzlu) pomocí definované globální procedury Preorder_Hledej. Když nenalezne žádanou hodnotu vrcholu, tak hledání končí s indikací stavu. Při nalezení hodnoty je zjišťováno zda jde o list. Následně pak odpojíme tento vrchol (uzel) od předchůdce (otce) ve stromu (pokud není kořenem). Pokud je žádaný vrchol kořenem, rušíme přímo známý kořen. Pokud není kořen, rušíme nalezený obecný nekořenový vrchol. Pokud se vůbec nejedná o list, použije se funkce prenesprvnilist. V ní hledaný uzel není fyzicky rušen, ale jeho hodnota je nahrazena některou (dle podmínek) z listových z jeho podstromu. Použitý list je odebrán ze struktury stromu. procedure TForm1.Zrus_VrcholClick(Ser: TObject); {funkce, která vybere hodnotu (klíč) přenášeného listu nahrazujícího rušený vrchol} function prenesprvnilist(var S:TStrom):Integer; var pom:integer; {pokud je levý směrník neprázdný pokračuj v hledání vhodného listu} if (S^.levy <> nil) then result := prenesprvnilist(s^.levy) else if(s^.pravy <> nil) then result := prenesprvnilist(s^.pravy) else {nalezen list jehož hodnota je předána rušenému uzlu} pom := S^.Klic; dispose(s); S := nil; result := pom; {vracíme hodnotu nalezeného listu} { je vybírán ukazatel na skutečného předchůdce mazaného vrcholu stromu a ten je následně} { ztotožněn (pomoci var delkarace) s globálním pomocným ukazatelem pojmenovaný nalezeny } procedure Preorder_Hledej_Vymaz(var S:TStrom; Hledany: Integer); if S <> nil then if (S^.Klic=Hledany) then nalezeny:=s; if(nalezeny = nil ) then Strana 14 (celkem 16)

15 Preorder_Hledej_Vymaz(S^.levy,Hledany); {pokud je nalezený hledaný vrchol mým levým potomkem pak jsem jeho předchůdcem} if( (nalezeny <> nil) and (S^.levy^.Klic = Hledany) ) then S^.levy := nil; if(nalezeny = nil ) then Preorder_Hledej_Vymaz(S^.pravy,Hledany); {pokud je nalezený hledaný vrchol mým pravým potomkem pak jsem jeho předchůdcem} if( (nalezeny <> nil) and (S^.pravy^.Klic = Hledany)) then S^.pravy := nil; nalezeny := nil; {klasické nalezení vrcholu} Preorder_Hledej(St,StrToInt(Edit_zrus.Text)); if(nalezeny = nil) then Label2.Caption := 'NENÍ HODNOTA' else {zjištění jestli je nalezený ukazatel na list stromu} if( (nalezeny^.levy = nil) and (nalezeny^.pravy = nil)) then nalezeny := nil; {předchůdci mazaného vrcholu odejmeme směrník na nalezený hledaný vrchol} {a zároveň znovu nalezneme hledaný vrchol} Preorder_Hledej_Vymaz(St,StrToInt(Edit_zrus.Text)); {pokud nemá klíč předchůdce, je kořenem a může byt zrušen } { (dealokován a směrník na kořen je nastaven na nil) } if(st^.klic = nalezeny^.klic) then dispose(st); St := nil; else dispose(nalezeny); nalezeny := nil; else {nalezený-rušený není listem, je nutné použít 'pouze' přenos hodnoty z listu} {do rušeného vrcholu, tedy tento vrchol není fyzicky odebrán ze stromu, } {pouze jeho hodnota je nahrazena hodnotou prvního nalezeného listu z jeho } { podstromu, který je také následně zrušen} Strana 15 (celkem 16)

16 if(nalezeny <> nil) then nalezeny^.klic := prenesprvnilist(nalezeny); Na závěr lze uvést případné zrušení celé struktury binárního stromu. Algoritmus by byl již několikrát opakovaný postup rekurzívního průchodu stromem s metodou postorder. Takto by došlo k vymazání a vynulování všech vrcholů (uzlů) ve stromu. Pro prázdný strom dojde k indikaci stavu. procedure TForm1.Zrus_BS_s_pruchodemClick(Ser: TObject); procedure Vymaz(var S: Strom) if S = nil then Label2.Caption := 'NENÍ UŽ STROM' else if S^.levy<>nil then Vymaz(S^.levy); if S = nil then Label2.Caption := 'NENÍ UŽ STROM' else if S^.pravy<>nil then Vymaz(S^.pravy); Dispose(S); S := nil Vymaz(St) Jistě by šlo i zvážit jednoduchou proceduru smazání a vynulování pouze kořene procedure TForm1.Zrus_BS_korenClick(Ser: TObject); Dispose(St); St := nil; Binární strom i se svou strukturou bude zdánlivě zrušen, je potřeba si uvědomit, že v paměti zůstaly alokovány původní vrcholy (adresy s hodnotami), což by mohlo vést u rozsáhlých stromů, respektive znovu vytvářených stromů, až k zablokování systému! K závěru uvádím, že v případně realizovaném příkladu dle uváděných programových struktur je nutno pro demonstraci zkoušené operace vždy znovu iniciovat kreslení, respektive tisk struktury binárního stromu. Toto není řešeno uváděnými programy. Strana 16 (celkem 16)

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA) Předmět: Algoritmizace praktické aplikace (3ALGA) Vytvořil: Jan Brzeska Zadání: Vytvoření funkcí na stromech (reprezentace stromu směrníky). Zadané funkce: 1. Počet vrcholů 2. Počet listů 3. Součet 4.

Více

1. D Y N A M I C K É DAT O V É STRUKTUR Y

1. D Y N A M I C K É DAT O V É STRUKTUR Y 1. D Y N A M I C K É DAT O V É STRUKTUR Y Autor: Petr Mik Abychom se mohli pustit do dynamických datových struktur, musíme se nejdřív podívat na datový typ ukazatel. 1. D AT O V Ý TYP U K A Z AT E L Datové

Více

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620 Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620 1. Vymezení pojmů Strom: Strom je takové uspořádání prvků - vrcholů, ve kterém lze rozeznat předchůdce - rodiče a následovníky - syny.

Více

Předmět: Algoritmizace praktické aplikace

Předmět: Algoritmizace praktické aplikace Předmět: Algoritmizace praktické aplikace Vytvořil: Roman Vostrý Zadání: Vytvoření funkcí na stromech (reprezentace stromu haldou). Zadané funkce: 1. Počet vrcholů 2. Počet listů 3. Součet 4. Hloubka 5.

Více

Binární vyhledávací stromy

Binární vyhledávací stromy Binární vyhledávací stromy Definice: Binární vyhledávací strom (po domácku BVS) je buďto prázdná množina nebo kořen obsahující jednu hodnotu a mající dva podstromy (levý a pravý), což jsou opět BVS, ovšem

Více

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu Ukazatel a dynamické datové struktury v prostředí DELPHI Důležitým termínem a konstrukčním programovým prvkem je typ UKAZATEL. Je to vlastně

Více

Algoritmy a datové struktury

Algoritmy a datové struktury Algoritmy a datové struktury Stromy 1 / 32 Obsah přednášky Pole a seznamy Stromy Procházení stromů Binární stromy Procházení BS Binární vyhledávací stromy 2 / 32 Pole Hledání v poli metodou půlení intervalu

Více

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)

Více

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. 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 úvod 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 Neorientovaný strom Orientovaný strom Kořenový orientovaný

Více

Abstraktní datové typy FRONTA

Abstraktní datové typy FRONTA Abstraktní datové typy FRONTA Fronta je lineární datová struktura tzn., že ke každému prvku s výjimkou posledního náleží jeden následník a ke každému prvku s výjimkou prvního náleží jeden předchůdce. Do

Více

Binární vyhledávací strom. Proč binární? Vyhledávání

Binární vyhledávací strom. Proč binární? Vyhledávání Binární vyhledávací strom J e d n á s e o o d rů d u o b e c ně j š í d a t o v é s t r u k t u r y z v a n é s t r o m. P o j e m p o c h á z í z t e o r i e g r a f ů, k d e j e s t r o m e m n a z ý

Více

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

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10 Úlohy- 2.cvičení 1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10 2. Převeďte dané desetinné číslo do dvojkové soustavy (DEC -> BIN): a) 0,8125 10 b) 0,35 10

Více

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

Stromy, haldy, prioritní fronty

Stromy, haldy, prioritní fronty Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík

Více

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach vlož do fronty kořen opakuj, dokud není fronta prázdná 1. vyber uzel z fronty a zpracuj jej 2. vlož do fronty levého následníka

Více

Dynamické datové struktury III.

Dynamické datové struktury III. Dynamické datové struktury III. Halda. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované

Více

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

Programování v C++ 1, 16. cvičení Programování v C++ 1, 16. cvičení binární vyhledávací strom 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí minule procvičené

Více

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

5 Rekurze a zásobník. Rekurzivní volání metody 5 Rekurze a zásobník Při volání metody z metody main() se do zásobníku uloží aktivační záznam obsahující - parametry - návratovou adresu, tedy adresu, kde bude program pokračovat v metodě main () po skončení

Více

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti. 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

Více

ADT STROM Lukáš Foldýna

ADT STROM Lukáš Foldýna ADT STROM Lukáš Foldýna 26. 05. 2006 Stromy mají široké uplatnění jako datové struktury pro různé algoritmy. Jsou to matematické abstrakce množin, kterou v běžném životě používáme velice často. Příkladem

Více

Datové typy a struktury

Datové typy a struktury atové typy a struktury Jednoduché datové typy oolean = logická hodnota (true / false) K uložení stačí 1 bit často celé slovo (1 byte) haracter = znak Pro 8-bitový SII kód stačí 1 byte (256 možností) Pro

Více

Časová a prostorová složitost algoritmů

Časová a prostorová složitost algoritmů .. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová

Více

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

Programování v C++, 2. cvičení Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule

Více

Implementace aritmetického stromu pomocí směrníků

Implementace aritmetického stromu pomocí směrníků Implementace aritmetického stromu pomocí směrníků Úvod Aritmetický strom je binární strom, který má ve vnitřních uzlech matematické operátory (+, -, /, *) a v listech (vrcholech) má operandy (např. čísla

Více

Dynamické datové struktury IV.

Dynamické datové struktury IV. Dynamické datové struktury IV. Prioritní fronta. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra

Více

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání.

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání. Vyhledávací stromy Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání. Vytvářejí se vždy nad již existující datovou strukturou (zpravidla tabulkou). Vyhledávací stromy můžeme rozdělit

Více

Dynamické datové struktury I.

Dynamické datové struktury I. Dynamické datové struktury I. Seznam. Fronta. Zásobník. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz

Více

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C Hanojské věže - 3 kolíky A, B, C - na A je N disků různé velikosti, seřazené od největšího (dole) k nejmenšímu (nahoře) - kolíky B a C jsou prázdné - úkol: přenést všechny disky z A na B, mohou se odkládat

Více

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

Základní datové struktury III: Stromy, haldy Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

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

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) Strom / tree uzel, vrchol / node, vertex hrana / edge vnitřní uzel

Více

Binární vyhledávací stromy II

Binární vyhledávací stromy II Binární vyhledávací stromy II doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 19. března 2019 Jiří Dvorský (VŠB TUO) Binární vyhledávací

Více

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

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 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 Umíme z minulé hodiny Implementace zásobníku a fronty pomocí

Více

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13. Grafy doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Grafy 104 / 309 Osnova přednášky Grafy

Více

Rekurzivní algoritmy

Rekurzivní algoritmy Rekurzivní algoritmy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS

Více

Dynamické datové typy a struktury

Dynamické datové typy a struktury .. a Programovací techniky doc. Ing. Jiří Rybička Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Programovací techniky a 2 / 18 Uchovávají adresu v paměti Programovací techniky a 2 / 18 Uchovávají

Více

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být

Více

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být

Více

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest Obsah prezentace Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest 1 Základní pojmy Vrchol grafu: {množina V} Je to styčná vazba v grafu, nazývá se též uzlem, prvkem

Více

Základní datové struktury

Základní datové struktury Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Spojová implementace lineárních datových struktur

Spojová implementace lineárních datových struktur Spojová implementace lineárních datových struktur doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB

Více

Úvod do teorie grafů

Úvod do teorie grafů Úvod do teorie grafů Neorientovaný graf G = (V,E,I) V množina uzlů (vrcholů) - vertices E množina hran - edges I incidence incidence je zobrazení, buď: funkce: I: E V x V relace: I E V V incidence přiřadí

Více

Struktura programu v době běhu

Struktura programu v době běhu Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů

Více

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.

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. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

NMIN102 Programování /2 Z, Zk

NMIN102 Programování /2 Z, Zk NMIN102 Programování 2 --- 2/2 Z, Zk Pavel Töpfer Katedra softwaru a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer Pavel

Více

Prohledávání do šířky = algoritmus vlny

Prohledávání do šířky = algoritmus vlny Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé

Více

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

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol. Stromy Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2018, B6B36DSA 01/2018, Lekce 9 https://cw.fel.cvut.cz/wiki/courses/b6b36dsa/start

Více

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet. 4 Stromy a les Jedním ze základních, a patrně nejjednodušším, typem grafů jsou takzvané stromy. Jedná se o souvislé grafy bez kružnic. Přes svou (zdánlivou) jednoduchost mají stromy bohatou strukturu a

Více

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání Select sort: krok 1: výběr klíče z n prvků vyžaduje 1 porovnání krok 2: výběr klíče z 1 prvků vyžaduje 2 porovnání krok 3: výběr klíče z 2 prvků vyžaduje 3 porovnání atd. celkem porovnání Zlepšení = použít

Více

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7 Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

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

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) Strom / tree uzel, vrchol / node, vertex hrana / edge vnitřní uzel

Více

Algoritmy výpočetní geometrie

Algoritmy výpočetní geometrie Algoritmy výpočetní geometrie prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA)

Více

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Metody přidělování paměti Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Důležitá hlediska jazykových konstrukcí: Dynamické typy Dynamické

Více

Stromy. Jan Hnilica Počítačové modelování 14

Stromy. Jan Hnilica Počítačové modelování 14 Stromy Jan Hnilica Počítačové modelování 14 1 Základní pojmy strom = dynamická datová struktura, složená z vrcholů (uzlů, prvků) propojených hranami hrany chápeme jako orientované, tzn. vedou z uzlu A

Více

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy 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ý

Více

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2. 1 3 4 5 6 7 8 9 10 11 1 13 14 15 16 17 18 19 0 1 3 4 5 6 7 8 9 30 31 3 Zdůvodněte, proč funkce f(n) = n log(n) 1 n 1/ roste rychleji než funkce g(n) = n. Zdůvodněte, proč funkce f(n) = n 3/ log(n) roste

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

NPRG030 Programování I, 2018/19 1 / :03:07

NPRG030 Programování I, 2018/19 1 / :03:07 NPRG030 Programování I, 2018/19 1 / 20 3. 12. 2018 09:03:07 Vnitřní třídění Zadání: Uspořádejte pole délky N podle hodnot prvků Měřítko efektivity: * počet porovnání * počet přesunů NPRG030 Programování

Více

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu

Více

Lineární spojový seznam (úvod do dynamických datových struktur)

Lineární spojový seznam (úvod do dynamických datových struktur) Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky

Více

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Metody přidělování paměti Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě Důležitá hlediska jazykových konstrukcí: Dynamické typy Dynamické

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615) IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná

Více

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost Amortizovaná složitost. Prioritní fronty, haldy binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost 1. Asymptotické odhady Asymptotická složitost je deklarována na základě

Více

Semestrální práce 2 znakový strom

Semestrální práce 2 znakový strom Semestrální práce 2 znakový strom Ondřej Petržilka Datový model BlockFileRecord Bázová abstraktní třída pro záznam ukládaný do blokového souboru RhymeRecord Konkrétní třída záznamu ukládaného do blokového

Více

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

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39 Základy algoritmizace Michal Krátký 1, Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Základy algoritmizace, 2006/2007 Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Více

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132 Ak. rok 2015/2016 vbp 1. ze 132 Ing. Vladimír Beneš, Ph.D. vedoucí katedry Petrovický K101 katedra informatiky a kvantitativních metod E-mail: vbenes@bivs.cz Telefon: 251 114 534, 731 425 276 Konzultační

Více

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

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy Volné stromy Úvod do programování Souvislý, acyklický, neorientovaný graf nazýváme volným stromem (free tree). Často vynecháváme adjektivum volný, a říkáme jen, že daný graf je strom. Michal Krátký 1,Jiří

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik; Vícerozměrné pole type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik; M[2,3] := 3145; - počet indexů není omezen (v praxi obvykle nejvýše tři) - více indexů pomalejší přístup k prvku (počítá

Více

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

Algoritmy II. Otázky k průběžnému testu znalostí

Algoritmy II. Otázky k průběžnému testu znalostí Algoritmy II Otázky k průběžnému testu znalostí Revize ze dne 19. února 2018 2 Lineární datové struktury 1 1. Vysvětlete co znamená, že zásobník představuje paměť typu LIFO. 2. Co je to vrchol zásobníku?

Více

OSTRAVSKÁ UNIVERSITA V OSTRAVĚ Pedagogická fakulta Obor informační technologie ve vzdělávání Kombinované studium

OSTRAVSKÁ UNIVERSITA V OSTRAVĚ Pedagogická fakulta Obor informační technologie ve vzdělávání Kombinované studium OSTRAVSKÁ UNIVERSITA V OSTRAVĚ Pedagogická fakulta Obor informační technologie ve vzdělávání Kombinované studium Implementace aritmetického stromu pomocí haldy David Farber L06617 16.05.2007 Úvod Aritmetický

Více

Dijkstrův algoritmus

Dijkstrův algoritmus Dijkstrův algoritmus Hledání nejkratší cesty v nezáporně hranově ohodnoceném grafu Necht je dán orientovaný graf G = (V, H) a funkce, která každé hraně h = (u, v) H přiřadí nezáporné reálné číslo označované

Více

Úloha ve stavovém prostoru SP je <s 0, C>, kde s 0 je počáteční stav C je množina požadovaných cílových stavů

Úloha ve stavovém prostoru SP je <s 0, C>, kde s 0 je počáteční stav C je množina požadovaných cílových stavů Stavový prostor a jeho prohledávání SP = formalismus k obecnějšímu uchopení a vymezení problému, který spočívá v nalezení posloupnosti akcí vedoucích od počátečního stavu úlohy (zadání) k požadovanému

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Třídy v C++ Třídy jsou uživatelsky definované typy podobné strukturám v C, kromě datových položek (proměnných) však mohou obsahovat i funkce

Více

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná. Průběžná klasifikace Nová verze modulu Klasifikace žáků přináší novinky především v práci s průběžnou klasifikací. Pro zadání průběžné klasifikace ve třídě doposud existovaly 3 funkce Průběžná klasifikace,

Více

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p Hanojská věž Stavový prostor 1. množina stavů S = {s} 2. množina přechodů mezi stavy (operátorů) Φ = {φ} s k = φ ki (s i ) zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3] který tah

Více

Dynamické datové struktury II.

Dynamické datové struktury II. Dynamické datové struktury II. Stromy. Binární vyhledávací strom. DFS. BFS. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz

Více

Základy umělé inteligence

Základy umělé inteligence Základy umělé inteligence Automatické řešení úloh Základy umělé inteligence - prohledávání. Vlasta Radová, ZČU, katedra kybernetiky 1 Formalizace úlohy UI chápe řešení úloh jako proces hledání řešení v

Více

Definice. B-stromu. B-strom řádu m je strom, kde každý uzel má maximálně m následníků a ve kterém platí:

Definice. B-stromu. B-strom řádu m je strom, kde každý uzel má maximálně m následníků a ve kterém platí: B-Strom Definice B-stromu B-strom řádu m je strom, kde každý uzel má maximálně m následníků a ve kterém platí: 1. Počet klíčů v každém vnitřním uzlu, je o jednu menší než je počet následníků (synů) 2.

Více

Programování II. Návrh programu I 2018/19

Programování II. Návrh programu I 2018/19 Programování II Návrh programu I 2018/19 Osnova přednášky Co víme? Objektový návrh programu. Příklad. Co víme? Třída Třída je popisem objektů se společnými vlastnostmi. class private:

Více

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace: Fronta Fronta je sekvence first-in-first-out (první do fronty první z fronty) prvků. Prvky mohou být vkládány pouze nakonec (rear) fronty a odstraňovány pouze zpočátku (front) fronty Délka fronty je počet

Více

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky 25 Pole Datová struktura kolekce elementů (hodnot či proměnných), identifikovaných jedním nebo více indexy, ze kterých

Více

Binární vyhledávací stromy pokročilé partie

Binární vyhledávací stromy pokročilé partie Binární vyhledávací stromy pokročilé partie KMI/ALS lekce Jan Konečný 30.9.204 Literatura Cormen Thomas H., Introduction to Algorithms, 2nd edition MIT Press, 200. ISBN 0-262-5396-8 6, 3, A Knuth Donald

Více

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

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

Více

Pole a kolekce. v C#, Javě a C++

Pole a kolekce. v C#, Javě a C++ Pole a kolekce v C#, Javě a C++ C# Deklarace pole typ_prvku_pole[] jmeno_pole; Vytvoření pole jmeno_pole = new typ_prvku_pole[pocet_prvku_pole]; Inicializace pole double[] poled = 4.8, 8.2, 7.3, 8.0; Java

Více

Radek Mařík

Radek Mařík 2012-03-20 Radek Mařík 1. Pravá rotace v uzlu U a) v podstromu s kořenem U přemístí pravého syna U.R uzlu U do kořene. Přitom se uzel U stane levým synem uzlu U.R a levý podstrom uzlu U.R se stane pravým

Více

Pointery II. Jan Hnilica Počítačové modelování 17

Pointery II. Jan Hnilica Počítačové modelování 17 Pointery II 1 Pointery a pole Dosavadní způsob práce s poli zahrnoval: definici pole jakožto kolekce proměnných (prvků) jednoho typu, umístěných v paměti za sebou int pole[10]; práci s jednotlivými prvky

Více

PODPROGRAMY PROCEDURY A FUNKCE

PODPROGRAMY PROCEDURY A FUNKCE PODPROGRAMY PROCEDURY A FUNKCE Programy bez podprogramů Příklady: a) Napište program, který na obrazovku nakreslí čáru složenou ze znaků pomlčka. program Cara; b) Napište program, který na obrazovku nakreslí

Více

Profilová část maturitní zkoušky 2017/2018

Profilová část maturitní zkoušky 2017/2018 Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2017/2018 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 78-42-M/01 Technické lyceum Předmět: TECHNIKA

Více

Radomíra Duží L06615. Datový typ množina

Radomíra Duží L06615. Datový typ množina Radomíra Duží L06615 Datový typ množina Množina slouží k uložení prvků stejného bázového ordinárního typu. Bázové typy - jsou typy, jejichž hodnot mohou prvky množiny nabývat. Nesmí obsahovat více než

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Algoritmus Daniela Szturcová Tento

Více

Reliance 3 design OBSAH

Reliance 3 design OBSAH Reliance 3 design Obsah OBSAH 1. První kroky... 3 1.1 Úvod... 3 1.2 Založení nového projektu... 4 1.3 Tvorba projektu... 6 1.3.1 Správce stanic definice stanic, proměnných, stavových hlášení a komunikačních

Více

Software602 Form Designer

Software602 Form Designer Software602 Form Designer Javascriptový vyhodnocovací mechanismus výrazů Aktualizováno: 17. 3. 2017 Software602 a.s. Hornokrčská 15 140 00 Praha 4 tel: 222 011 602 web: www.602.cz e-mail: info@602.cz ID

Více

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1 Rekurze V programování ve dvou hladinách: - rekurzivní algoritmus (řešení úlohy je definováno pomocí řešení podúloh stejného charakteru) - rekurzivní volání procedury nebo funkce (volá sama sebe přímo

Více