Předmět: Algoritmizace praktické aplikace

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

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

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

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

Dynamické datové struktury III.

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

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

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

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

Stromy, haldy, prioritní fronty

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

Abstraktní datové typy FRONTA

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

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

bfs, dfs, fronta, zásobník, prioritní fronta, halda

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

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

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

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

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

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.

Sada 1 - Základy programování

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Implementace slovníku bitovým vektorem

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

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

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:

Základy umělé inteligence

Algoritmy a datové struktury

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

Grafové algoritmy. Programovací techniky

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

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

Lineární funkce, rovnice a nerovnice 4 lineární nerovnice

Programovací jazyk Pascal

Binární vyhledávací stromy

Martin Milata, Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od

Maturitní téma: Programovací jazyk JAVA

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

Grafové algoritmy. Programovací techniky

Binární soubory (datové, typované)

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

Algoritmizace. 1. Úvod. Algoritmus

Implementace LL(1) překladů

TGH05 - aplikace DFS, průchod do šířky

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

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

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

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

TGH07 - Chytré stromové datové struktury

Dynamické programování. Optimální binární vyhledávací strom

NMIN102 Programování /2 Z, Zk

CZ.1.07/1.5.00/

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

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

a) b) c) Radek Mařík

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Prioritní fronta, halda

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í

Poslední nenulová číslice faktoriálu

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

Radomíra Duží L Datový typ množina

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.

TGH05 - aplikace DFS, průchod do šířky

TGH07 - Chytré stromové datové struktury

Dynamické datové struktury IV.

Anotace. Dynamické programování, diskrétní simulace.

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

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2013/2014 Radim Farana. Obsah. Strom

Dynamické datové typy a struktury

Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CLIL jako výuková strategie na vysoké škole

ADT STROM Lukáš Foldýna

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

Rekurzivní algoritmy

Algoritmus pro hledání nejkratší cesty orientovaným grafem

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Úvod do programování

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

popel, glum & nepil 16/28

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

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

Dělitelnost přirozených čísel. Násobek a dělitel

Programovani v Maplu Procedura

State Space Search Step Run Editace úloh Task1 Task2 Init Clear Node Goal Add Shift Remove Add Node Goal Node Shift Remove, Add Node

Algoritmus Minimax. Tomáš Kühr. Projektový seminář 1

ABSTRAKTNÍ DATOVÉ TYPY

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

Algoritmizace prostorových úloh

Algoritmy výpočetní geometrie

TGH06 - Hledání nejkratší cesty

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

Časová a prostorová složitost algoritmů

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

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

Transkript:

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. Šířka Halda (heap) Má tvar binárního stromu. Její výhodou je algoritmická jednoduchost a možnost snadné realizace v poli, známe-li horní odhad maximálního počtu prvků v haldě. Halda je binární strom, ve kterém jsou splněny následující podmínky: 1. V každé hladině od první až do předposlední je maximální možný počet uzlů, tzn. v k-té hladině je 2 k-1 uzlů. 2. V poslední hladině jsou všechny uzly umístěny co možná nejvíce vlevo, tzn. procházíme-li uzly předposlední hladiny zleva doprava, nejprve má několik z nich (popř. žádný) dva následníky, pak může být (ale nemusí) jeden uzel s jedním následníkem a zbývající uzly předposlední hladiny následníky nemají. 3. Pro každý uzel platí, že hodnota v něm uložená je menší než hodnota uložená v jeho libovolném následníkovi. Ze třetí vlastnosti přímo vyplývá, že v kořeni haldy je umístěna nejmenší hodnota.

1. Počet vrcholů stromu Počet vrcholů zjistíme pomocí postupného průchodu polem a přičítání výsledku. Použijeme k tomu algoritmus if (p[2*i]>0) or (p[2*i+1]>0) or (p[i]>0) then result:=result+1; Popis algoritmu: Pokud kořen, levý, nebo pravý následník je větší než nula, tzn. že vrchol existuje, pak se inkrementuje počet vrcholů. function Pocet_vrcholu(i:Integer):Integer; for i:=1 to StrToInt(Edit1.Text) do if (p[2*i]>0) or (p[2*i+1]>0) or (p[i]>0) then result:=result+1; 2. Počet listů Počet listů zjišťujeme opět průchodem pole. Použijeme algoritmus if (p[i] > 0) and (p[2*i]=0) and (p[2*i+1]=0) then result:=result+1; Popis algoritmu: Pokud je hodnota vrcholu větší než nula a jeho levý a současně i pravý následník je roven nule, tzn. že neexistuje, pak to znamená, že se jedná o list - počet listů se inkrementuje o 1.

function Pocet_listu(i:Integer):Integer; if (p[i] > 0) and (p[2*i]=0) and (p[2*i+1]=0) then result:=result+1; 3. Součet hodnot vrcholů Zatím jsme pracovali pouze s indexy pole a stromu. Nyní sečteme vlastní hodnoty vrcholů. Nejdříve si omezíme velikost sčítaného pole. if p[i] > 0 then result:=i; Projdeme celé pole a zjistíme největší index prvku v poli, nebo-li také nejhlubší prvek stromu, který existuje. To znamená, že je větší než nula. Toto číslo dosadíme za j a podle for i:=1 to j do result:=result+p[i]; sčítáme hodnoty jednotlivých prvků pole. function Soucet(i:Integer):Integer; if p[i] > 0 then result:=i; j:=result; for i:=1 to j do result:=result+p[i];

4. Hloubka stromu Znovu si příkazem if p[i] > 0 then result:=i; najdeme nejhlubší prvek stromu. Toto číslo pak dělíme dvěma, výsledek dosadíme místo i a pokračujeme tak dlouho, dokud i>0. Počet všech dělení minus 1 nám pak vrací výsledek funkce - hloubku stromu. Jako počáteční hodnotu výsledku musíme udat -1, protože první hladina má hodnotu 0. function hloubka(i: Integer): Integer; if p[i] > 0 then result:=i; i:=result; result:=-1; while i>0 do i:=i div 2; result:=result +1; 5. Počet vrcholů na úrovni Počet vrcholů na úrovni se zjistí funkcí urovne a funkcí hloubka. Nejdříve si program zjistí hloubku stromu a tu dosadí do příkazu for l:=0 to hloubka(u) do Pokud je např. hloubka stromu 2, výsledný řádek programu bude vypadat takto: for l:=0 to 2 do

Pak pokračuje vlastní funkcí. Nejprve začne s hodnotou 0, což odpovídá hloubce stromu 0, takže strom obsahuje pouze kořen. V úvodu funkce je dáno, že pokud se i = 0, výsledek je 1, funkce končí a vrací výsledek 1. if i=0 then result:=1; Pak začne prohledávat úroveň 1. Program zjistí, existuje-li levý následník, if p[2*q]>0 then result:=result+urovne(i-1,2*q); vrátí se o úroveň níže, tzn. do úrovně 0, která je zadána výsledkem 1. Pak zjišťuje existenci pravého následníka if p[2*q+1]>0 then result:=result+urovne(i-1,2*q+1); a pokud existuje, vrací se opět o úroveň níž a k výsledku připočítá opět 1. Takže konečný výsledek je 2. Pokračuje dál a prohledává druhou úroveň. Znova začíná od kořene, zjistí, že levý následník existuje a znovu volá rekurzivně funkci s tím, že jako kořen dosadí pole s indexem 2*q. Opět zjišťuje přítomnost následníků a připočítává je do výsledku. Pak prohledá stejným způsobem i pravou stranu stromu. function Urovne(i,q:integer):Integer; if i=0 then result:=1 else if p[2*q]>0 then result:=result+urovne(i-1,2*q); if p[2*q+1]>0 then result:=result+urovne(i-1,2*q+1);

6. Šířka stromu Tato funkce pracuje s funkcí urovne a funkcí hloubka, kde vlastně zjišťuje počet vrcholů na úrovních a největší počet vrcholů vrací jako výsledek šířky stromu. function sirka(i:integer): Integer; var w, p: Integer; for w:=0 to hloubka(u) do p:=urovne(w, 1); if p>result then result:=p Celý program: V programu je procedura na vytvoření pole, grafické znázornění stromu a vlastní funkce pro operace na stromě. {$R *.dfm} var p: array [1..100] of integer; i,u,j: Integer; procedure TForm1.Button1Click(Sender: TObject); var i:integer; p[i]:=0; for i:=1 to StrToInt(Edit1.Text) do p[i]:=2*i; procedure TForm1.Button2Click(Sender: TObject); procedure Kresli(i, x, y, sirka: Integer);

sirka:=sirka div 2; if p[2*i]<>0 then Image1.Canvas.MoveTo(x, y); Image1.Canvas.LineTo(x-sirka, y+30); Kresli(2*i, x-sirka, y+30, sirka) if p[2*i+1]<>0 then Image1.Canvas.MoveTo(x, y); Image1.Canvas.LineTo(x+sirka, y+30); Kresli(2*i+1, x+sirka, y+30, sirka) Image1.Canvas.TextOut(x-5, y-8, IntToStr(p[i])); Image1.Canvas.Brush.Color:=clWhite; Image1.Canvas.Brush.Style:=bsSolid; Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height); Kresli(1, Image1.Width div 2, 30, Image1.Width div 2) procedure TForm1.Button3Click(Sender: TObject); function Pocet_vrcholu(i:Integer):Integer; for i:=1 to StrToInt(Edit1.Text) do if (p[2*i]>0) or (p[2*i+1]>0) or (p[i]>0) then result:=result+1; function Pocet_listu(i:Integer):Integer; if (p[i] > 0) and (p[2*i]=0) and (p[2*i+1]=0) then result:=result+1; function Soucet(i:Integer):Integer; if p[i] > 0 then result:=i; j:=result;

for i:=1 to j do result:=result+p[i]; function hloubka(i: Integer): Integer; if p[i] > 0 then result:=i; i:=result; result:=-1; while i>0 do i:=i div 2; result:=result +1; function Urovne(i,q:integer):Integer; if i=0 then result:=1 else if p[2*q]>0 then result:=result+urovne(i-1,2*q); if p[2*q+1]>0 then result:=result+urovne(i-1,2*q+1); function sirka(i:integer): Integer; var w, p: Integer; for w:=0 to hloubka(u) do p:=urovne(w, 1); if p>result then result:=p var l:integer; Memo1.Lines.Clear;

Memo1.Lines.Add('Počet vrcholů je : '+IntToStr(Pocet_vrcholu(u))); Memo1.Lines.Add('Počet listů je : '+IntToStr(Pocet_listu(u))); Memo1.Lines.Add('Součet prvků je : '+IntToStr(Soucet(u))); Memo1.Lines.Add('Hloubka stromu je : '+IntToStr(Hloubka(u))); Memo1.Lines.Add('Šířka stromu je : '+IntToStr(Sirka(u))); for l:=0 to hloubka(u) do Memo1.Lines.Add('Na '+IntToStr(l)+' úrovni je vrcholů : '+IntToStr(urovne(l,1))); end.