Operace na datových strukturách

Podobné dokumenty
Operace na datových strukturách

Práce se seznamy. Operace na datových strukturách. Práce se seznamy del a insert. Práce se seznamy member. Seznam: rekurzivní datová struktura

klauzulí deklarativní (specifikace programu je přímo programem) popel, glum & nepil 1/18

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Logické programování I

Složitější domény. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

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

ADT STROM Lukáš Foldýna

Stromy, haldy, prioritní fronty

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

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

Úvod do teorie grafů

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

Prioritní fronta, halda

Algoritmizace prostorových úloh

Programovací jazyk Prolog

Algoritmy na ohodnoceném grafu

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

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

Algoritmizace prostorových úloh

Datové struktury Úvod

Základní datové struktury

4EK311 Operační výzkum. 5. Teorie grafů

Algoritmy a datové struktury

a) b) c) Radek Mařík

Datové typy a struktury

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

ALGORITMY A DATOVÉ STRUKTURY

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

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

Základy umělé inteligence

Implementace slovníku bitovým vektorem

Kostry. 9. týden. Grafy. Marie Demlová (úpravy Matěj Dostál) 16. dubna 2019

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

Jan Březina. 7. března 2017

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

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

TGH07 - Chytré stromové datové struktury

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Prolog 1-1. Rodinné vztahy pomocí Prologu:

Základy informatiky. Teorie grafů. Zpracoval: Pavel Děrgel Úprava: Daniela Szturcová

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

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

Základní pojmy teorie grafů [Graph theory]

Složitosti základních operací B + stromu

Použití dalších heuristik

u odpovědí typu A, B, C, D, E: Obsah: jako 0) CLP Constraint Logic Programming

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

Hranová konzistence. Arc consistency AC. Nejprve se zabýváme binárními CSP. podmínka odpovídá hraně v grafu podmínek

Programování v Pythonu

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

TGH07 - Chytré stromové datové struktury

Semestrální práce 2 znakový strom

Přijímací zkouška - matematika

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

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

Zpráva o průběhu přijímacího řízení na vysokých školách dle Vyhlášky MŠMT č. 343/2002 a její změně 276/2004 Sb.

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

TGH12 - Problém za milion dolarů

Výroková a predikátová logika - II

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

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

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

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

Da D to t v o é v ty t py IB111: Datové typy

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

Výroková a predikátová logika - III

4.2 Syntaxe predikátové logiky

TGH05 - Problém za milion dolarů.

Funkcionální programování. Kristýna Kaslová

Drsná matematika III 10. demonstrovaná cvičení Kostry grafů

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

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

Analýza Petriho sítí. Analýza Petriho sítí p.1/28

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

Úvod do informatiky. Miroslav Kolařík

Zadání k 2. programovacímu testu

autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)

Postupy práce se šablonami IS MPP

Teorie grafů. zadání úloh. letní semestr 2008/2009. Poslední aktualizace: 19. května First Prev Next Last Go Back Full Screen Close Quit

Algoritmizace a programování

Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

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

Výroková a predikátová logika - III

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.

Algoritmy výpočetní geometrie

Aproximativní algoritmy UIN009 Efektivní algoritmy 1

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

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

Výroková a predikátová logika - IV

Vzdálenost uzlů v neorientovaném grafu

Maturitní téma: Programovací jazyk JAVA

Kombinatorika, výpočty


Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek


Programování v Pythonu

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 2014

Transkript:

Operace na datových strukturách Aleš Horák E-mail: hales@fi.muni.cz http://nlp.fi.muni.cz/uui/ Obsah: Operace na datových strukturách Binární stromy Reprezentace grafů Úvod do umělé inteligence 2/12 1 / 24

Operace na datových strukturách Práce se seznamy Práce se seznamy Seznam: rekurzivní datová struktura uspořádaná posloupnost prvků (libovolných termů včetně seznamů) operátor./2; prázdný seznam [].(Hlava,Tělo), alternativně [Hlava Tělo], Hlava je (typu) prvek seznamu, Tělo je (typu) seznam.(a,[]) [a] [a []].(a,.(b,.(c,[]))) [a,b,c] [a,b [c]], [a [b,c]],.(a,.(.(b,.(c,[])),[])) [a,[b,c]]... [a1,[[b3,c3],d2,e2],f1]... [a,b,c []], [a [b,c []]], [a [b [c []]]] [a [[b,c]]],... Úvod do umělé inteligence 2/12 2 / 24

Operace na datových strukturách Práce se seznamy Práce se seznamy member member(+prvek,+seznam) true, pokud v seznamu je zadaný prvek 1. 2. 3. member(x,[x ]). member(x,[x ]). je stručný zápis pro member(x,l):-l=[x ]. member(x,[ T]) :- member(x,t).? member(a,[x,b,c]). X=a Yes member(x,[y ]) :- X == Y. member(x,[ T]) :- member(x,t).? member(a,[x,b,c]).? member(a,[a,b,a]),write(ok),nl,fail. No ok ok No member(x,[y ]) :- X == Y. member(x,[y T]) :- X \== Y, member(x,t).? member(a,[a,b,a]),write(ok),nl,fail. ok No Úvod do umělé inteligence 2/12 3 / 24

Operace na datových strukturách Práce se seznamy Práce se seznamy del a insert predikát del(+a,+l,-vysl) smaže všechny výskyty prvku A ze seznamu L del1(+a,+l,-vysl) smaže vždy jeden (dle pořadí) výskyt A v seznamu L del(,[],[]).? del(1,[1,2,1,1,2,3,1,1],l). del(a,[a T],V) :- del(a,t,v). L = [2, 2, 3] del(a,[h T1],[H T2]) :- A\=H, del(a,t1,t2). Yes? del1(1,[1,2,1],l). del1(a,[a T],T). L = [2, 1] ; del1(a,[h T1],[H T2]) :- del1(a,t1,t2). L = [1, 2] ; No insert(+a,+l,-vysl) vkládá postupně (při žádosti o další řešení) na všechny pozice seznamu L prvek A insert1(+a,+l,-vysl) vloží A na začátek seznamu L (ve výsledku Vysl) insert(a,l,[a L]).? insert(4,[2,3,1],l). insert(a,[h T1],[H T2]):- insert(a,t1,t2). L = [4, 2, 3, 1] ; L = [2, 4, 3, 1] ; L = [2, 3, 4, 1] ; insert1(x,list,[x List]). L = [2, 3, 1, 4] ; No Úvod do umělé inteligence 2/12 4 / 24

Operace na datových strukturách Práce se seznamy Práce se seznamy permutace 1. pomocí insert perm1([],[]).? perm1([1,2,3],l). perm1([h T],L):- perm1(t,v), insert(h,v,l). L = [1, 2, 3] ; L = [2, 1, 3] ; L = [2, 3, 1] ; L = [1, 3, 2] ; L = [3, 1, 2] ; L = [3, 2, 1] ; No 2. pomocí del1 perm2([],[]). perm2(l,[x P]) :- del1(x,l,l1),perm2(l1,p). 3. pomocí append perm3([],[]). perm3(l,[h T]):- append(a,[h B],L),append(A,B,L1), perm3(l1,t). Úvod do umělé inteligence 2/12 5 / 24

Operace na datových strukturách Práce se seznamy Práce se seznamy append append(?seznam1,?seznam2,?seznam) Seznam je spojení seznamů Seznam1 a Seznam2 append([],l,l). append([h T1],L2,[H T]) :- append(t1,l2,t). predikát append je vícesměrný:? append([a,b],[c,d],l). L = [a, b, c, d] Yes? append(x,[c,d],[a,b,c,d]). X = [a, b] Yes? append(x,y,[a,b,c]). X = [] Y = [a, b, c]; X = [a] Y = [b, c]; X = [a, b] Y = [c]; X = [a, b, c] Y = []; No Úvod do umělé inteligence 2/12 6 / 24

Operace na datových strukturách Práce se seznamy Práce se seznamy využití append predikát append je všestranně použitelný: member(x,ys) last(x,xs) prefix(xs,ys) suffix(xs,ys) sublist(xs,asxsbs) adjacent(x,y,zs) :- append(as,[x Xs],Ys). :- append(as,[x],xs). :- append(xs,as,ys). :- append(as,xs,ys). :- append(asxs,bs,asxsbs), append(as,xs,asxs). :- append(as,[x,y Ys],Zs). Úvod do umělé inteligence 2/12 7 / 24

Operace na datových strukturách Práce se seznamy Práce se seznamy efektivita append Efektivní řešení predikátu append rozdílové seznamy (difference lists) Rozdílový seznam se zapisuje jako Seznam1-Seznam2. Např.: [a,b,c]... [a,b,c] - [] nebo [a,b,c,d] - [d] nebo [a,b,c,d,e] - [d,e], obecně [a,b,c X] - X []... A-A [a]... [a A]-A Seznam2 (volná proměnná) slouží jako ukazatel na konec seznamu Seznam1 predikát append s rozdílovými seznamy (append dl): append dl(a B,B C,A C).? append dl([a,b X] X,[c,d Y] Y,Z). X = [c, d Y] Y = Y Z = [a, b, c, d Y] Y Yes Úvod do umělé inteligence 2/12 8 / 24

Operace na datových strukturách Třídění seznamů Třídění seznamů quicksort predikát qsort(+l,-vysl) třídí seznam L technikou rozděl a panuj L=[5,3,7,8,1,4,7,6] L=[H T],H=5 T=[3,7,8,1,4,7,6] divide(5,...) prvky 5 M=[3,1,4], qsort(m) prvky > 5 V=[7,8,7,6], qsort(v) M1=[1,3,4] V1=[6,7,7,8] append - M1.[5].V1 Vysl=[1,3,4,5,6,7,7,8] Úvod do umělé inteligence 2/12 9 / 24

Operace na datových strukturách Třídění seznamů Třídění seznamů quicksort predikát qsort(+l,-vysl) třídí seznam L technikou rozděl a panuj qsort([],[]). qsort([h],[h]) :-!. řez zahodí další možnosti řešení qsort([h T],S) :- divide(h,t,m,v), qsort(m,m1), qsort(v,v1), append(m1,[h V1],S). divide(,[],[],[]). divide(h,[k T],[K M],V) :- K=<H,!, divide(h,t,m,v). divide(h,[k T],M,[K V]) :- divide(h,t,m,v). Úvod do umělé inteligence 2/12 10 / 24

Operace na datových strukturách Třídění seznamů Třídění seznamů quicksort II predikát qsort dl(+l,-vysl) efektivnější varianta predikátu qsort s rozdílovými seznamy qsort(l,s):- qsort dl(l,s []). qsort dl([],a A). qsort dl([h],[h A] A) :-!. qsort dl([h T],M1 B):- divide(h,t,m,v), qsort dl(m,m1 [H V1]), qsort dl(v,v1 B). % append dl(m1-a, [H V1]-B, S-C) % divide/4 beze změny divide(,[],[],[]). divide(h,[k T],[K M],V):- K=<H,!, divide(h,t,m,v). divide(h,[k T],M,[K V]):- divide(h,t,m,v). Úvod do umělé inteligence 2/12 11 / 24

Binární stromy Uspořádané binární stromy Uspořádané binární stromy Reprezentace binárního stromu: nil prázdný strom Hodn t(l,hodn,p) strom L P Příklady stromů: t(nil,8,nil) 8 t(t(nil,1,nil), 2,t(nil,3,nil)) 2 1 3 t(nil,2,t(t(nil,3,nil),4,t(nil,5,nil))) 2 4 3 5 Úvod do umělé inteligence 2/12 12 / 24

Binární stromy Přidávání do binárního stromu Přidávání do binárního stromu addleaf(+t,+x,-vysl) přidá do binárního stromu T hodnotu X na správnou pozici vzhledem k setřídění stromu addleaf(nil,x,t(nil,x,nil)). addleaf(t(left,x,right),x,t(left,x,right)). addleaf(t(left,root,right),x,t(left1,root,right)) :- Root>X,addleaf(Left,X,Left1). addleaf(t(left,root,right),x,t(left,root,right1)) :- Root<X,addleaf(Right,X,Right1).? addleaf(nil,6,t),addleaf(t,8,t1), addleaf(t1,2,t2), addleaf(t2,4,t3), addleaf(t3,1,t4). T4 = t(t(t(nil, 1, nil), 2, t(nil, 4, nil)), 6, t(nil, 8, nil))? addleaf(t(t(t(nil,1,nil),2,t(t(nil,3,nil),4,t(nil,5,nil))), 6,t(t(nil,7,nil),8,t(nil,9,nil))), 10, T). T = t( t( t(nil, 1, nil), 2, t( t(nil, 3, nil), 4, t(nil, 5, nil))), 6, t( t(nil, 7, nil), 8, t( nil, 9, t(nil, 10, nil)))) Úvod do umělé inteligence 2/12 13 / 24

Binární stromy Odebírání z binárního stromu Odebírání z binárního stromu Predikát addleaf není vícesměrný nelze definovat: del(t,x,t1) :- addleaf(t1,x,t). A A X delete(x)? L P L P Úvod do umělé inteligence 2/12 14 / 24

Binární stromy Odebírání z binárního stromu Odebírání z binárního stromu správný postup: pokud je odebíraná hodnota v listu nahradí se hodnotu nil jestliže je ale v kořenu (pod)stromu je nutné tento (pod)strom přestavět Přestavba binárního stromu při odstraňování kořene X: X ( ) Y L P L P L P Y Y Úvod do umělé inteligence 2/12 15 / 24

Binární stromy Odebírání z binárního stromu Odebírání z binárního stromu delleaf(+t,+x,-vysl) odstraní ze stromu T uzel s hodnotou X delleaf(t(nil,x,right),x,right). delleaf(t(left,x,nil),x,left). delleaf(t(left,x,right),x,t(left,y,right1)):- delmin(right,y,right1). delleaf(t(left,root,right),x,t(left1,root,right)):- X<Root,delleaf(Left,X,Left1). delleaf(t(left,root,right),x,t(left,root,right1)):- X>Root,delleaf(Right,X,Right1). delmin(t(nil,y,r),y,r). delmin(t(left,root,right),y,t(left1,root,right)) :- delmin(left,y,left1). Úvod do umělé inteligence 2/12 16 / 24

Binární stromy Vícesměrný algoritmus pro vkládání/odebírání Vícesměrný algoritmus pro vkládání/odebírání Jiný způsob vkládání: X > Y X Y Y P 2 X + L P L P 1 X < Y X L 1 Y L 2 P Úvod do umělé inteligence 2/12 17 / 24

Binární stromy Vícesměrný algoritmus pro vkládání/odebírání Vícesměrný algoritmus pro vkládání/odebírání add(?t,+x,?vysl) přidá do binárního stromu T uzel s hodnotou X s přeuspořádáním stromu (jako kořen nebo jinam při navracení) % přidej jako kořen add(t,x,t1) :- addroot(t,x,t1). % nebo kamkoliv do stromu (se zachováním uspořádání) umožní mazání add(t(l,y,r),x,t(l1,y,r)) :- gt(y,x),add(l,x,l1). add(t(l,y,r),x,t(l,y,r1)) :- gt(x,y),add(r,x,r1). addroot(nil,x,t(nil,x,nil)). addroot(t(l,y,r),x,t(l1,x,t(l2,y,r))) :- gt(y,x),addroot(l,x,t(l1,x,l2)). addroot(t(l,y,r),x,t(t(l,y,r1),x,r2)) :- gt(x,y),addroot(r,x,t(r1,x,r2)). addroot(t(l,x,r),x,t(l,x,r)). Definice predikátu gt(x,y) na konečném uživateli. Funguje i obráceně lze definovat: del(t,x,t1) :- add(t1,x,t). Úvod do umělé inteligence 2/12 18 / 24

Binární stromy Výpis binárního stromu Výpis binárního stromu pomocí odsazení zobrazujeme úroveň uzlu ve stromu a celkové uspořádání uzlů (strom je tedy zobrazen naležato ) t( 9 t( 8 t(nil,1,nil), 3, 6 t(nil,4,nil)), 5 5, t( t(nil,6, t(nil,7,nil)), 8, t(nil,9,nil))) 1 show(+t) vypíše obsah uzlů stromu T se správným odsazením show(t) :- show2(t,0). show2(nil, ). show2(t(l,x,r),indent) :- Ind2 is Indent+2,show2(R,Ind2),tab(Indent), write(x),nl,show2(l,ind2). Úvod do umělé inteligence 2/12 19 / 24 3 4 1 7 5 8 3 9 6 4 7

Reprezentace grafů Reprezentace grafů Reprezentace grafů Příklady způsobů reprezentace grafů (v Prologu): 1 term graph(v,e), kde V je seznam vrcholů grafu a E je seznam hran grafu. Každá hrana je tvaru e(v1,v2), kde V1 a V2 jsou vrcholy grafu. b a c G = graph([a,b,c,d],[e(a,b),e(b,d),e(b,c),e(c,d)]). d znázorňuje orientovaný graf Úvod do umělé inteligence 2/12 20 / 24

Reprezentace grafů Reprezentace grafů 2 vgraph(v,e) definuje uspořádanou dvojici seznamů vrcholů (V) a hran (E). Hrany jsou tvaru a(pocatecniv, KoncovyV, CenaHrany). t G = vgraph([s,t,u,v],[a(s,t,3),a(t,v,1), a(t,u,5),a(u,t,2),a(v,u,2)]). u znázorňuje orientovaný ohodnocený graf 3 graf může být uložen v programové databázi jako posloupnost faktů (i pravidel). s 3 1 edge(g3,a,b). b edge(g3,b,c). edge(g3,b,d). edge(g3,c,d). a c edge(x,a,b) :- edge(x,b,a). d díky přidanému pravidlu představuje neorientovaný graf (bez pravidla je orientovaný). Úvod do umělé inteligence 2/12 21 / 24 2 5 2 v

Reprezentace grafů Cesty v grafech Cesty v grafech Cesta v neorientovaném grafu: path(+a,+z,+graf,-cesta) v grafu Graf najde z vrcholu A do vrcholu Z cestu Cesta (Graf je ve tvaru 1). path(a,z,graf,cesta) :- path1(a,[z],graf,cesta). path1(a,[a Cesta1],,[A Cesta1]). path1(a,[y Cesta1],Graf,Cesta) :- adjacent(x,y,graf), \+ member(x,cesta1), path1(a,[x,y Cesta1],Graf,Cesta). adjacent(x,y,graph(nodes,edges)) :- member(e(x,y),edges); member(e(y,x),edges). \+ Cíl negace, not f :- p; q logické OR, zkratka za f :- p. f :- q. Úvod do umělé inteligence 2/12 22 / 24

Reprezentace grafů Cesty v grafech Cesty v grafech II. Cesta v ohodnoceném neorientovaném grafu: path(+a,+z,+graf,-cesta,-cena) hledá libovolnou cestu z jednoho vrcholu do druhého a její cenu v ohodnoceném neorientovaném grafu. path(a,z,graf,cesta,cena) :- path1(a,[z],0,graf,cesta,cena). path1(a,[a Cesta1],Cena1,Graf,[A Cesta1],Cena1). path1(a,[y Cesta1],Cena1,Graf,Cesta,Cena) :- adjacent(x,y,cenaxy,graf), \+ member(x,cesta1), Cena2 is Cena1+CenaXY, path1(a,[x,y Cesta1],Cena2,Graf,Cesta,Cena). adjacent(x,y,cenaxy,graf) :- member(x Y/CenaXY,Graf); member(y X/CenaXY,Graf). Graph je seznam hran ve tvaru X-Y/CenaXY (viz adjacent). Úvod do umělé inteligence 2/12 23 / 24

Reprezentace grafů Kostra grafu Kostra grafu Kostra grafu je strom, který prochází všechny vrcholy grafu a jehož hrany jsou zároveň hranami grafu. stree(graph,tree) :- member(edge,graph),spread([edge],tree,graph). spread(tree1,tree,graph) :- addedge(tree1,tree2,graph), spread(tree2,tree,graph). spread(tree,tree,graph) :- \+ addedge(tree,,graph). % nelze přidat hranu % přidej hranu bez vzniku cyklu addedge(tree,[a B Tree],Graph) :- adjacent(a,b,graph),node(a,tree), \+ node(b,tree). adjacent(a,b,graph) :- member(a B,Graph); member(b A,Graph). node(a,graph) :- adjacent(a,,graph). b b? stree([a b,b c,b d,c d],t). T = [b d, b c, a b] Yes a d c a d c Úvod do umělé inteligence 2/12 24 / 24