Wykład 8 - Drzewa i algorytmy ich przetwarzania

Wielkość: px
Rozpocząć pokaz od strony:

Download "Wykład 8 - Drzewa i algorytmy ich przetwarzania"

Transkrypt

1 Algorytmy i struktury danych Wykład 8 - Drzewa i algorytmy ich przetwarzania Janusz Szwabiński Plan wykładu: Przykłady drzew Pojęcia i definicje Reprezentacje drzew Drzewa wyprowadzenia (ang. parse trees) Przechodzenie drzewa Kopiec binarny Kolejka priorytetowa Źródła: większość ilustracji i przykładów pochodzi z "Problem Solving with Algorithms and Data Structures using Python", Przykłady drzew Systematyka biologiczna

2 System plików

3 In [7]:!tree -d -L 2 /home/szwabin/dropbox/zajecia/ /home/szwabin/dropbox/zajecia/ AlgorytmyIStrukturyDanych Lab Materiały Cwiczenia PythonIntro PythonIntro PWr UWr WstepDoProgramowania Cwiczenia Egzamin Laboratoria Przykłady Wyklady 14 directories

4 Drzewo znaczników HTML <html xmlns=" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>simple</title> </head> <body> <h1>a simple web page</h1> <ul> <li>list item one</li> <li>list item two</li> </ul> <h2> <a href=" Matematyki PWr </a> <h2> </body> </html> Drzewa składniowe

5 Pojęcia i definicje Węzeł lub wierzchołek (ang. node) - podstawowy element drzewa: może mieć nazwę, czyli klucz (ang. key) może zawierać dodatkowe dane (ang. payload) dane te nie mają z reguły znaczenia dla algorytmów dotyczących drzew, są jednak bardzo ważne w zastosowaniach Krawędź (ang. edge) - kolejny ważny element drzewa: łączy ze sobą wierzchołki, aby zaznaczyć relację między nimi każdy wierzchołek (oprócz korzenia) ma jedną krawędź wchodzącą, łączącą go z rodzicem każdy wierzchołek może mieć wiele krawędzi wychodzących Korzeń (ang. root) - jedyny wierzchołek, który nie ma krawędzi wchodzącej (nie ma rodzica) Ścieżka (ang. path) - uporządkowana lista wierzchołków z łączącymi ich krawędziami: Mammal Carnivora Felidae Felis Domestica Dziecko (ang. child, child node) - węzeł połączony krawędzią wchodzącą z innym węzłem jest jego dzieckiem Rodzic (ang. parent) - węzeł połączony krawędzią wychodzącą z innym węzłem jest jego rodzicem Rodzeństwo (ang. siblings) - wszystkie węzły mające tego samego rodzica Potomek (ang. descendant) - potomkami węzła nazywamy wszystkie węzły, do których prowadzi od niego ścieżka Poddrzewo (ang. subtree) - zbiór węzłów i krawędzi złożony z wybranego węzła (rodzica) i wszystkich jego potomków Liść (ang. leaf) - wierzchołek, który nie ma dzieci Długość (ang. length) - liczba krawędzi w ścieżce od korzenia do węzła Poziom (ang. level) - to inaczej długość od korzenia Wysokość (ang. height) - najwyższy poziom istniejący w drzewie

6 Drzewo - definicja 1 zbiór wierzchołków i krawędzi łączących pary węzłów własności: jeden wyróżniony węzeł - korzeń, który nie ma rodzica każdy węzeł n (z wyjątkiem korzenia) jest połączony dokładnie jedną krawędzią wchodzącą z węzłem p. Węzeł p jest rodzicem węzła n istnieje tylko jedna ścieżka łącząca dowolny węzeł z korzeniem jeśli każdy węzeł może mieć co najwyżej 2 dzieci, mówimy o drzewach binarnych Drzewo - definicja 2 drzewo jest albo puste albo zawiera korzeń i pewną liczbą poddrzew, z których każde jest drzewem korzeń poddrzewa jest połaczony z korzeniem drzewa głównego krawędzią

7 Reprezentacje drzew Lista list na podstawie definicji rekurencyjnej wbudowane listy w Pythonie pierwszy element listy to korzeń, drugi to lewe poddrzewo, trzeci - prawe poddrzewo In [3]: mytree = ['a', #root ['b', #left subtree ['d', [], []], #left subtree of the left subtree ['e', [], []] ], #right subtree of the left subtree ['c', #right subtree ['f', [], []], #left subtree of the right subtree [] ] #right subtree of the right subtree (empty) ] In [4]: mytree Out[4]: ['a', ['b', ['d', [], []], ['e', [], []]], ['c', ['f', [], []], []]] do poszczególnych elementów odnosimy się przy pomocy standardowych indeksów list korzeń to mytree[0] lewe poddrzewo to mytree[1], prawe - mytree[2] In [5]: print(mytree) print('left subtree = ', mytree[1]) print('root = ', mytree[0]) print('right subtree = ', mytree[2]) ['a', ['b', ['d', [], []], ['e', [], []]], ['c', ['f', [], []], []]] left subtree = ['b', ['d', [], []], ['e', [], []]] root = a right subtree = ['c', ['f', [], []], []] poddrzewa odczytujemy w ten sam sposób reprezentacja ma strukturę rekurencyjną In [6]: print('root of left subtree = ', mytree[1][0]) print('left subtree of the left subtree = ',mytree[1][1]) print('right subtree of the left subtree = ',mytree[1][2]) root of left subtree = b left subtree of the left subtree = ['d', [], []] right subtree of the left subtree = ['e', [], []] podrzewo, które ma korzeń i dwie puste listy to po prostu liść reprezentację można uogólnić do większej liczby potomków - każde kolejne poddrzewo to następna lista

8 Konstruktor In [18]: def BinaryTree(r): return [r, [], []] Wstawianie elementów aby dodać lewe poddrzewo, musimy wstawić nową listę w miejsce drugiego elementu listy reprezentującej drzewo jeśli w liście nadrzędnej jest już jakiś obiekt na drugiej pozycji: ściągamy go z listy i zapamiętujemy wartość wstawiamy poddrzewo zapamiętany element wstawiamy jako lewe dziecko tego poddrzewa tak zdefiniowana funkcja pozwoli nam wstawić poddrzewo w dowolnym wierzchołku drzewa nadrzędnego In [19]: def insertleft(root,newbranch): t = root.pop(1) if len(t) > 1: root.insert(1,[newbranch,t,[]]) root.insert(1,[newbranch, [], []]) return root funkcja wstawiająca prawe poddrzewo jest bardzo podobna: In [20]: def insertright(root,newbranch): t = root.pop(2) if len(t) > 1: root.insert(2,[newbranch,[],t]) root.insert(2,[newbranch,[],[]]) return root Inne przydatne funkcje In [21]: def getrootval(root): return root[0] def setrootval(root,newval): root[0] = newval def getleftchild(root): return root[1] def getrightchild(root): return root[2]

9 In [31]: r = BinaryTree(3) print("initial tree: ",r) insertleft(r,4) insertleft(r,5) insertright(r,6) insertright(r,7) print("tree after insertions: ",r) l = getleftchild(r) print("left subtree: ",l) setrootval(l,9) print("left subtree after change of root: ",l) insertleft(l,11) print("tree after insertions: ",r) print("right child of right child: ",getrightchild(getrightchild(r))) Initial tree: [3, [], []] Tree after insertions: [3, [5, [4, [], []], []], [7, [], [6, [], []]]] Left subtree: [5, [4, [], []], []] Left subtree after change of root: [9, [4, [], []], []] Tree after insertions: [3, [9, [11, [4, [], []], []], []], [7, [], [6, [], []]]] Right child of right child: [6, [], []] Reprezentacja przy pomocy węzłów i referencji reprezentacja ta przypomina nieco omawianą wcześniej listę jednokierunkową tworzymy klasę, która przechowuje korzeń oraz referencje do poddrzew podobnie, jak w poprzedniej reprezentacji, struktura rekurencyjna In [32]: class BinaryTree: def init (self,rootobj): self.key = rootobj self.leftchild = None self.rightchild = None atrybuty leftchild i rightchild staną się referencjami do poddrzew rootobj w konstruktorze to referencja do dowolnego obiektu korzystając z rekurencyjnej definicji drzewa, przykład powyżej wymagałby stworzenia 6 instancji klasy BinaryTree Wstawianie elementów aby dodać lewe dziecko do drzewa, stworzymy nową instancję drzewa binarnego, a następnie wykorzystamy atrybut leftchild, aby odnieść się do niego

10 In [33]: class BinaryTree: def init (self,rootobj): self.key = rootobj self.leftchild = None self.rightchild = None def insertleft(self,newnode): if self.leftchild == None: self.leftchild = BinaryTree(newNode) t = BinaryTree(newNode) t.leftchild = self.leftchild self.leftchild = t uwzględniliśmy tutaj dwa przypadki: 1. korzeń drzewa nadrzędnego nie ma lewego dziecka - wtedy po prostu je wstawiamy 2. wstawiamy nowe poddrzewo w miejsce istniejącego, przesuwając to ostatnie na wyższy poziom prawe poddrzewo wstawiamy podobnie: In [34]: class BinaryTree: def init (self,rootobj): self.key = rootobj self.leftchild = None self.rightchild = None def insertleft(self,newnode): if self.leftchild == None: self.leftchild = BinaryTree(newNode) t = BinaryTree(newNode) t.leftchild = self.leftchild self.leftchild = t def insertright(self,newnode): if self.rightchild == None: self.rightchild = BinaryTree(newNode) t = BinaryTree(newNode) t.rightchild = self.rightchild self.rightchild = t Funkcje pomocnicze

11 In [35]: class BinaryTree: def init (self,rootobj): self.key = rootobj self.leftchild = None self.rightchild = None def insertleft(self,newnode): if self.leftchild == None: self.leftchild = BinaryTree(newNode) t = BinaryTree(newNode) t.leftchild = self.leftchild self.leftchild = t def insertright(self,newnode): if self.rightchild == None: self.rightchild = BinaryTree(newNode) t = BinaryTree(newNode) t.rightchild = self.rightchild self.rightchild = t def getrightchild(self): return self.rightchild def getleftchild(self): return self.leftchild def setrootval(self,obj): self.key = obj def getrootval(self): return self.key In [40]: r = BinaryTree('a') print("root key = ",r.getrootval()) print("left child = ",r.getleftchild()) r.insertleft('b') print("left child after insertion (reference) = ",r.getleftchild()) print("left child after insertion (value) = ",r.getleftchild().getrootval()) r.insertright('c') print("right child after insertion (reference) = ",r.getrightchild()) print("right child after insertion (value) = ",r.getrightchild().getrootval()) r.getrightchild().setrootval('hello') print("root key after update = ",r.getrightchild().getrootval()) Root key = a Left child = None Left child after insertion (reference) = < main.binarytree object at 0x7f813039a828> Left child after insertion (value) = b Right child after insertion (reference) = < main.binarytree object at 0x7f813039ac18> Right child after insertion (value) = c Root key after update = hello Drzewa wyprowadzenia (ang. parse trees) drzewa wyprowadzenia mogą być stosowane do reprezentowania: zdań w języku naturalnym, np. "Homer hit Bart"

12 wyrażeń matematycznych, np. ((7 + 3) (5 2)) wykorzystanie drzew pozwala osobno przetwarzać poszczególne części tych struktur (reprezentowane przez poddrzewa) Tworzenie drzew wyprowadzenia wyrażeń matematycznych Co wiemy o wyrażeniach matematycznych?: nawiasy, operatory i operandy każdy lewy nawias rozpoczyna nowe działanie (nowe poddrzewo) każdy prawy nawias kończy działanie operandy powinny być liśćmi operator to rodzic operandów każdy operator ma dwoje dzieci Sposób postępowania: 1. Przekształć wyrażenie na listę znaków. 2. Przetwarzaj wyrażenie znak po znaku: jeśli aktualny znak to (, dodaj lewe dziecko do aktualnego węzła i przejdź do niego, jeśli aktualny znak jest na liście ['+','-','*','/'], przypisz go do atrybutu key aktualnego węzła. Dodaj nowy węzeł jako prawe dziecko i przejdź do niego, jeśli znak to liczba, przypisz go do atrybutu key aktualnego węzła i wróć do jego rodzica, jeśli aktualny znak to ), wróć do rodzica aktualnego węzła. Przykład wyrażenie (3 + (4 5)) lista znaków `['(', '3', '+', '(', '4', '*', '5',')',')']` krok 1 - drzewo z pustym korzeniem

13 krok 2 - wczytujemy znak ( tworzymy lewe dziecko i przechodzimy do niego (aktualny węzeł jest szary) krok 3 - wczytujemy 3 wstawiamy wartość do klucza aktualnego węzła wracamy do rodzica krok 4 - wczytujemy + wstawiamy wartość do klucza aktualnego węzła dodajemy nowy węzeł jako prawe dziecko przechodzimy do niego krok 5 - wczytujemy ( tworzymy lewe dziecko aktualnego węzła i przechodzimy do niego krok 6 - wczytujemy 4 wstawiamy wartość do klucza aktualnego węzła i wracamy do rodzica

14 krok 7 - wczytujemy '*' wstawiamy wartość do klucza aktualnego węzła dodajemy nowy węzeł jako prawe dziecko przechodzimy do niego krok 8 - wczytujemy 5 wstawiamy wartość do klucza aktualnego węzła i wracamy do rodzica krok 9 - wczytujemy ) przechodzimy do rodzica aktualnego węzła krok 10 - wczytujemy ) przechodzimy do rodzica aktualnego węzła lub kończymy, jeśli jesteśmy w korzeniu całego drzewa, który nie ma rodzica aby zaimplementować tę procedurę, musimy śledzić rodzica i dziecko każdego węzła: w przypadku dzieci sprawa jest prosta - nasza klasa zawiera już odpowiednie narzędzia w przypadku rodziców - możemy wykorzystać stos: za każdym razem, kiedy chcemy wrócić do rodzica, pobieramy go ze stosu Implementacja

15 In [42]: from asd import Stack def buildparsetree(fpexp): fplist = fpexp.split() pstack = Stack() etree = BinaryTree('') pstack.push(etree) currenttree = etree for i in fplist: if i == '(': currenttree.insertleft('') pstack.push(currenttree) currenttree = currenttree.getleftchild() elif i not in ['+', '-', '*', '/', ')']: currenttree.setrootval(int(i)) parent = pstack.pop() currenttree = parent elif i in ['+', '-', '*', '/']: currenttree.setrootval(i) currenttree.insertright('') pstack.push(currenttree) currenttree = currenttree.getrightchild() elif i == ')': currenttree = pstack.pop() raise ValueError return etree In [43]: pt = buildparsetree("( ( ) * 3 )") Wykonywanie działań reprezentowanych w postaci drzew każdy nawias reprezentowany jest poddrzewem możemy wykonać działania rekurencyjnie, wykonując oddzielnie każde z poddrzew przypadek bazowy: węzeł zawierający liczbę (czyli liść) nie wymaga dalszego przetwarzania funkcja wykonująca działania zwraca po prostu jego wartość wyniki dwóch rekurencyjnych wywołań na dzieciach są operandami działania zdefiniowanego w ich rodzicu In [45]: import operator def evaluate(parsetree): opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv} leftc = parsetree.getleftchild() rightc = parsetree.getrightchild() if leftc and rightc: fn = opers[parsetree.getrootval()] return fn(evaluate(leftc),evaluate(rightc)) return parsetree.getrootval() In [46]: evaluate(pt) Out[46]: 45

16 Przechodzenie drzewa przechodzenie drzewa to proces odwiedzania wszystkich węzłów drzewa większość zastosowań drzew wymaga takiej operacji w zależności od kolejności odwiedzania rozróżniamy przejście wzdłużne (ang. preorder) - najpierw odwiedzamy korzeń, a potem rekursywnie przechodzimy jego lewe poddrzewo, a potem tak samo prawe podrzewo przejście poprzeczne (ang. inorder) - rekursywne wykonanie przechodzenia na lewym poddrzewie, potem odwiedzamy korzeń i wykonujemy rekursywne przechodzenie prawego poddrzewa przejście wsteczne (ang. postorder) - rekursywnie przechodzimy lewe poddrzewo, potem prawe, a na końcu odwiedzamy korzeń![przechodzenie drzewa](tree_traversal.png) preorder: F, B, A, D, C, E, G, I, H inorder: A, B, C, D, E, F, G, H, I postorder: A, C, E, D, B, H, I, G, F In [47]: def preorder(tree): if tree: print(tree.getrootval()) preorder(tree.getleftchild()) preorder(tree.getrightchild()) In [49]: preorder(pt) * In [50]: def postorder(tree): if tree!= None: postorder(tree.getleftchild()) postorder(tree.getrightchild()) print(tree.getrootval()) In [51]: postorder(pt) * wykonanie działania reprezentowanego przez drzewo to nic innego jak przejście postorder: In [56]: def postordereval(tree): opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv} res1 = None res2 = None if tree: res1 = postordereval(tree.getleftchild()) res2 = postordereval(tree.getrightchild()) if res1 and res2: return opers[tree.getrootval()](res1,res2) return tree.getrootval()

17 In [57]: postordereval(pt) Out[57]: 45 In [52]: def inorder(tree): if tree!= None: inorder(tree.getleftchild()) print(tree.getrootval()) inorder(tree.getrightchild()) In [53]: inorder(pt) * 3 przechodzenie w porządku inorder zwraca wejściowe wyrażenie bez nawiasów możemy wykorzystać to do wypisania wyrażenia na ekranie: In [54]: def printexp(tree): sval = "" if tree: sval = '(' + printexp(tree.getleftchild()) sval = sval + str(tree.getrootval()) sval = sval + printexp(tree.getrightchild())+')' return sval In [55]: printexp(pt) Out[55]: '(((10)+(5))*(3))' Kopiec binarny struktura danych oparta na drzewie binarnym wartości węzła są w stałej relacji z wartością rodzica (np. wartość rodzica jest nie mniejsza niż wartości jego potomka) Operacje na kopcu BinaryHeap() - tworzy nowy, pusty kopiec binarny insert(k) - dodaj element do kopca findmin() - zwraca wartość najmniejszego elementu, pozostawia go na kopcu delmin() - ściąga najmniejszą wartość z kopca isempty() - sprawdza, czy kopiec jest pusty size() - zwraca liczbę elementów w kopcu buildheap(list) - tworzy kopiec z listy elementów Własności kopca Struktura kopca aby przetwarzanie drzewa było wydajne (w czasie logarytmicznym), musi być ono zrównoważone zrównoważone drzewo posiada mniej więcej tę samą liczbę węzłów w obu poddrzewach zupełne drzewo binarne: każdy poziom drzewa (z wyjątkiem ostatniego czyli liści) musi być pełny liście wstawiamy sukcesywnie od lewej do prawej takie drzewo można reprezentować pojedynczą listą: jeśli rodzic jest na pozycji p, jego lewe dziecko ma indeks 2p, a jego prawe dziecko - 2p + 1

18 węzeł na pozycji n ma rodzica na pozycji n / / 2 korzeń musi mieć indeks 1 (zerowy element listy nie jest wykorzystywany) Porządek w kopcu klucz węzła x jest większy bądź równy kluczowi jego rodzica p Implementacja Konstruktor do reprezentacji kopca używamy pythonowych list w konstruktorze wstawiamy 0 jako pierwszy element listy element ten nie będzie później używany In [58]: class BinHeap: def init (self): self.heaplist = [0] self.currentsize = 0

19 Wstawianie elementów najbardziej wydajna metoda wstawiania elementów do listy to dołączanie ich do jej końca w ten sposób utrzymana zostanie struktura kopca, tzn.: drzewo pozostanie prawie pełne (liście tylko na ostatnim i ewentualnie przedostatnim poziomie) liście na ostatnim poziomie wstawiane od lewej najprawdopodobniej naruszymy w ten sposób porządek kopca łatwo jest jednak wymyślić metodę naprawienia porządku: przesuwając węzeł do góry, przywracamy odpowiedni porządek między węzłem i jego rodzicem porządek pozostałych potomków nie zostaje naruszony jeśli nowy element jest bardzo mały, konieczne może być wykonanie wielu takich zamian

20 In [59]: class BinHeap: def init (self): self.heaplist = [0] self.currentsize = 0 def percup(self,i): while i // 2 > 0: if self.heaplist[i] < self.heaplist[i // 2]: tmp = self.heaplist[i // 2] self.heaplist[i // 2] = self.heaplist[i] self.heaplist[i] = tmp i = i // 2 def insert(self,k): self.heaplist.append(k) self.currentsize = self.currentsize + 1 self.percup(self.currentsize) Znajdowanie minimum ze względu na porządek w kopcu, to po prostu klucz korzenia In [ ]: class BinHeap: def init (self): self.heaplist = [0] self.currentsize = 0 def percup(self,i): while i // 2 > 0: if self.heaplist[i] < self.heaplist[i // 2]: tmp = self.heaplist[i // 2] self.heaplist[i // 2] = self.heaplist[i] self.heaplist[i] = tmp i = i // 2 def insert(self,k): self.heaplist.append(k) self.currentsize = self.currentsize + 1 self.percup(self.currentsize) def findmin(self): return self.heaplist[1] Usuwanie najmniejszego elementu po usunięciu najmniejszego elementu kopca (czyli korzenia drzewa), przywracamy jego własności w dwóch krokach: 1. wstawiamy ostatni element z listy w miejsce korzenia 2. jeśli porządek został zburzony, przywracamy go, zamieniając korzeń z mniejszym z jego dzieci 3. kontunuujemy zamiany do odzyskania porządku kopca

21

22 In [60]: class BinHeap: def init (self): self.heaplist = [0] self.currentsize = 0 def percup(self,i): while i // 2 > 0: if self.heaplist[i] < self.heaplist[i // 2]: tmp = self.heaplist[i // 2] self.heaplist[i // 2] = self.heaplist[i] self.heaplist[i] = tmp i = i // 2 def insert(self,k): self.heaplist.append(k) self.currentsize = self.currentsize + 1 self.percup(self.currentsize) def findmin(self): return self.heaplist[1] def percdown(self,i): while (i * 2) <= self.currentsize: mc = self.minchild(i) if self.heaplist[i] > self.heaplist[mc]: tmp = self.heaplist[i] self.heaplist[i] = self.heaplist[mc] self.heaplist[mc] = tmp i = mc def minchild(self,i): if i * > self.currentsize: return i * 2 if self.heaplist[i*2] < self.heaplist[i*2+1]: return i * 2 return i * def delmin(self): retval = self.heaplist[1] self.heaplist[1] = self.heaplist[self.currentsize] self.currentsize = self.currentsize - 1 self.heaplist.pop() self.percdown(1) return retval Generowanie kopca z listy traktujemy listę wejściową jako kopiec dokonujemy ewentualnych zmian w celu przywrócenia porządku

23 In [74]: class BinHeap: def init (self): self.heaplist = [0] self.currentsize = 0 def percup(self,i): while i // 2 > 0: if self.heaplist[i] < self.heaplist[i // 2]: tmp = self.heaplist[i // 2] self.heaplist[i // 2] = self.heaplist[i] self.heaplist[i] = tmp i = i // 2 def insert(self,k): self.heaplist.append(k) self.currentsize = self.currentsize + 1 self.percup(self.currentsize) def findmin(self): return self.heaplist[1] def percdown(self,i): while (i * 2) <= self.currentsize: mc = self.minchild(i) if self.heaplist[i] > self.heaplist[mc]: tmp = self.heaplist[i] self.heaplist[i] = self.heaplist[mc] self.heaplist[mc] = tmp i = mc def minchild(self,i): if i * > self.currentsize: return i * 2 if self.heaplist[i*2] < self.heaplist[i*2+1]: return i * 2 return i * def delmin(self): retval = self.heaplist[1] self.heaplist[1] = self.heaplist[self.currentsize] self.currentsize = self.currentsize - 1 self.heaplist.pop() self.percdown(1) return retval def buildheap(self,alist): i = len(alist) // 2 self.currentsize = len(alist) self.heaplist = [0] + alist[:] while (i > 0): self.percdown(i) i = i - 1 def size(self): return self.currentsize def isempty(self): return self.currentsize == 0 def str (self): txt = "{}".format(self.heaplist[1:]) return txt In [75]: bh = BinHeap() bh.isempty() Out[75]: True

24 In [76]: bh.buildheap([9,5,6,2,3]) print(bh) [2, 3, 6, 5, 9] In [77]: bh.isempty() Out[77]: False In [80]: print(bh.delmin()) print(bh.delmin()) print(bh.delmin()) print(bh.delmin()) print(bh.delmin()) In [81]: bh.isempty() Out[81]: True In [82]: print(bh) []

25 Kolejka priorytetowa przypomina kolejkę, jednak jej elementy mają dodatkowy porządek (priorytet) elementy ściągane są z początku kolejki im wyższy priorytet ma element, tym bliżej początku kolejki się znajduje możliwa do zaimplementowania przy pomocy funkcji sortujących i list: wstawianie do listy jest operacją O(n) sortowanie listy to O(nlogn) nie jest to najwydajniejsza metoda kopiec binarny pozwala na pobieranie i wstawianie elementów ze złożonością O(logn)

Wysokość drzewa Głębokość węzła

Wysokość drzewa Głębokość węzła Drzewa Drzewa Drzewo (ang. tree) zbiór węzłów powiązanych wskaźnikami, spójny i bez cykli. Drzewo posiada wyróżniony węzeł początkowy nazywany korzeniem (ang. root). Drzewo ukorzenione jest strukturą hierarchiczną.

Bardziej szczegółowo

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce. POLITECHNIKA WARSZAWSKA Instytut Automatyki i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 204/205 Język programowania: Środowisko programistyczne: C/C++ Qt Wykład 2 : Drzewa BST c.d., równoważenie

Bardziej szczegółowo

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np. Drzewa binarne Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0 i T 1 są drzewami binarnymi to T 0 T 1 jest drzewem binarnym Np. ( ) ( ( )) Wielkość drzewa

Bardziej szczegółowo

Struktury danych: stos, kolejka, lista, drzewo

Struktury danych: stos, kolejka, lista, drzewo Struktury danych: stos, kolejka, lista, drzewo Wykład: dane w strukturze, funkcje i rodzaje struktur, LIFO, last in first out, kolejka FIFO, first in first out, push, pop, size, empty, głowa, ogon, implementacja

Bardziej szczegółowo

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Wykład 2. Drzewa zbalansowane AVL i 2-3-4 Wykład Drzewa zbalansowane AVL i -3-4 Drzewa AVL Wprowadzenie Drzewa AVL Definicja drzewa AVL Operacje wstawiania i usuwania Złożoność obliczeniowa Drzewa -3-4 Definicja drzewa -3-4 Operacje wstawiania

Bardziej szczegółowo

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola: Drzewa Drzewa Drzewo (ang. tree) zbiór węzłów powiązanych wskaźnikami, spójny i bez cykli. Drzewo posiada wyróżniony węzeł początkowy nazywany korzeniem (ang. root). Drzewo ukorzenione jest strukturą hierarchiczną.

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania Stosy, kolejki, drzewa Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk(Wydział Fizyki) WP w. VII Jesień 2013 1 / 25 Listy Lista jest uporządkowanym zbiorem elementów. W Pythonie

Bardziej szczegółowo

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno Instrukcja laboratoryjna 5 Podstawy programowania 2 Temat: Drzewa binarne Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny Drzewa są jedną z częściej wykorzystywanych struktur danych. Reprezentują

Bardziej szczegółowo

Algorytmy i struktury danych

Algorytmy i struktury danych Algorytmy i struktury danych Wykład 9 - Drzewa i algorytmy ich przetwarzania (ciąg dalszy) Janusz Szwabiński Plan wykładu: Binarne drzewo poszukiwań (BST) Zrównoważone binarne drzewa poszukiwań (AVL) Implementacja

Bardziej szczegółowo

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste Akademia Górniczo-Hutnicza Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej WSTĘP DO INFORMATYKI Adrian Horzyk Drzewa i struktury drzewiaste www.agh.edu.pl DEFINICJA DRZEWA Drzewo

Bardziej szczegółowo

Teoretyczne podstawy informatyki

Teoretyczne podstawy informatyki Teoretyczne podstawy informatyki Wykład 6a Model danych oparty na drzewach 1 Model danych oparty na drzewach Istnieje wiele sytuacji w których przetwarzane informacje mają strukturę hierarchiczną lub zagnieżdżoną,

Bardziej szczegółowo

Metody getter https://www.python-course.eu/python3_object_oriented_programming.php 0_class http://interactivepython.org/runestone/static/pythonds/index.html https://www.cs.auckland.ac.nz/compsci105s1c/lectures/

Bardziej szczegółowo

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych Algorytmy i Struktury Danych Kopce Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 11 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych Wykład 11 1 / 69 Plan wykładu

Bardziej szczegółowo

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru. Spis treści 1 Drzewa 1.1 Drzewa binarne 1.1.1 Zadanie 1.1.2 Drzewo BST (Binary Search Tree) 1.1.2.1 Zadanie 1 1.1.2.2 Zadanie 2 1.1.2.3 Zadanie 3 1.1.2.4 Usuwanie węzła w drzewie BST 1.1.2.5 Zadanie 4

Bardziej szczegółowo

Sortowanie - wybrane algorytmy

Sortowanie - wybrane algorytmy Sortowanie - wybrane algorytmy Aleksandra Wilkowska Wydział Matematyki - Katedra Matematyki Stosowanej Politechika Wrocławska 2 maja 2018 1 / 39 Plan prezentacji Złożoność obliczeniowa Sortowanie bąbelkowe

Bardziej szczegółowo

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego. Kolejki Kolejka priorytetowa Kolejka priorytetowa (ang. priority queue) to struktura danych pozwalająca efektywnie realizować następujące operacje na zbiorze dynamicznym, którego elementy pochodzą z określonego

Bardziej szczegółowo

Teoretyczne podstawy informatyki

Teoretyczne podstawy informatyki Teoretyczne podstawy informatyki Wykład 6b: Model danych oparty na drzewach http://hibiscus.if.uj.edu.pl/~erichter/dydaktyka2010/tpi-2010 Prof. dr hab. Elżbieta Richter-Wąs 1 Model danych oparty na drzewach

Bardziej szczegółowo

Stos LIFO Last In First Out

Stos LIFO Last In First Out Stos LIFO Last In First Out Operacje: push - dodanie elementu na stos pop - usunięcie elementu ze stosu empty - sprawdzenie, czy stos jest pusty size - zwrócenie liczby elementów na stosie value (peek)

Bardziej szczegółowo

Wykład 8. Drzewa AVL i 2-3-4

Wykład 8. Drzewa AVL i 2-3-4 Wykład 8 Drzewa AVL i 2-3-4 1 Drzewa AVL Ø Drzewa AVL Definicja drzewa AVL Operacje wstawiania i usuwania Złożoność obliczeniowa Ø Drzewa 2-3-4 Definicja drzewa 2-3-4 Operacje wstawiania i usuwania Złożoność

Bardziej szczegółowo

Wykład 6. Drzewa poszukiwań binarnych (BST)

Wykład 6. Drzewa poszukiwań binarnych (BST) Wykład 6 Drzewa poszukiwań binarnych (BST) 1 O czym będziemy mówić Definicja Operacje na drzewach BST: Search Minimum, Maximum Predecessor, Successor Insert, Delete Struktura losowo budowanych drzew BST

Bardziej szczegółowo

Listy, kolejki, stosy

Listy, kolejki, stosy Listy, kolejki, stosy abc Lista O Struktura danych składa się z węzłów, gdzie mamy informacje (dane) i wskaźniki do następnych węzłów. Zajmuje tyle miejsca w pamięci ile mamy węzłów O Gdzie można wykorzystać:

Bardziej szczegółowo

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy) Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Sieci powiązań Paweł Daniluk Wydział Fizyki Jesień 2015 P. Daniluk (Wydział Fizyki) PO w. IX Jesień 2015 1 / 21 Sieci powiązań Można (bardzo zgrubnie) wyróżnić dwa rodzaje powiązań

Bardziej szczegółowo

STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA. Część 3. Drzewa Przeszukiwanie drzew

STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA. Część 3. Drzewa Przeszukiwanie drzew STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA Część 3 Drzewa Przeszukiwanie drzew 1 / 24 DRZEWA (ang.: trees) Drzewo struktura danych o typie podstawowym T definiowana rekurencyjnie jako: - struktura pusta,

Bardziej szczegółowo

Podstawowe pojęcia dotyczące drzew Podstawowe pojęcia dotyczące grafów Przykłady drzew i grafów

Podstawowe pojęcia dotyczące drzew Podstawowe pojęcia dotyczące grafów Przykłady drzew i grafów Podstawowe pojęcia dotyczące drzew Podstawowe pojęcia dotyczące grafów Przykłady drzew i grafów Drzewa: Drzewo (ang. tree) jest strukturą danych zbudowaną z elementów, które nazywamy węzłami (ang. node).

Bardziej szczegółowo

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych Algorytmy i Struktury Danych Drzewa poszukiwań binarnych dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 12 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych

Bardziej szczegółowo

liniowa - elementy następują jeden za drugim. Graficznie możemy przedstawić to tak:

liniowa - elementy następują jeden za drugim. Graficznie możemy przedstawić to tak: Sortowanie stogowe Drzewo binarne Binary Tree Dotychczas operowaliśmy na prostych strukturach danych, takich jak tablice. W tablicy elementy ułożone są zgodnie z ich numeracją, czyli indeksami. Jeśli za

Bardziej szczegółowo

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych Algorytmy i Struktury Danych Drzewa poszukiwań binarnych dr hab. Bożena Woźna-Szcześniak Jan Długosz University, Poland Wykład 8 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych Wykład 8 1 /

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Sieci powiązań Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk (Wydział Fizyki) PO w. IX Jesień 2014 1 / 24 Sieci powiązań Można (bardzo zgrubnie) wyróżnić dwa rodzaje powiązań

Bardziej szczegółowo

prowadzący dr ADRIAN HORZYK /~horzyk e-mail: horzyk@agh tel.: 012-617 Konsultacje paw. D-13/325

prowadzący dr ADRIAN HORZYK /~horzyk e-mail: horzyk@agh tel.: 012-617 Konsultacje paw. D-13/325 PODSTAWY INFORMATYKI WYKŁAD 8. prowadzący dr ADRIAN HORZYK http://home home.agh.edu.pl/~ /~horzyk e-mail: horzyk@agh agh.edu.pl tel.: 012-617 617-4319 Konsultacje paw. D-13/325 DRZEWA Drzewa to rodzaj

Bardziej szczegółowo

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy Wykład 3 Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy Dynamiczne struktury danych Lista jest to liniowo uporządkowany zbiór elementów, z których dowolny element

Bardziej szczegółowo

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne Algorytmy i struktury danych Drzewa: BST, kopce Letnie Warsztaty Matematyczno-Informatyczne Drzewa: BST, kopce Definicja drzewa Drzewo (ang. tree) to nieskierowany, acykliczny, spójny graf. Drzewo może

Bardziej szczegółowo

dr inż. Paweł Myszkowski Wykład nr 11 ( )

dr inż. Paweł Myszkowski Wykład nr 11 ( ) dr inż. Paweł Myszkowski Politechnika Białostocka Wydział Elektryczny Elektronika i Telekomunikacja, semestr II, studia stacjonarne I stopnia Rok akademicki 2015/2016 Wykład nr 11 (11.05.2016) Plan prezentacji:

Bardziej szczegółowo

Wykład 2. Drzewa poszukiwań binarnych (BST)

Wykład 2. Drzewa poszukiwań binarnych (BST) Wykład 2 Drzewa poszukiwań binarnych (BST) 1 O czym będziemy mówić Definicja Operacje na drzewach BST: Search Minimum, Maximum Predecessor, Successor Insert, Delete Struktura losowo budowanych drzew BST

Bardziej szczegółowo

Ogólne wiadomości o grafach

Ogólne wiadomości o grafach Ogólne wiadomości o grafach Algorytmy i struktury danych Wykład 5. Rok akademicki: / Pojęcie grafu Graf zbiór wierzchołków połączonych za pomocą krawędzi. Podstawowe rodzaje grafów: grafy nieskierowane,

Bardziej szczegółowo

Drzewa czerwono-czarne.

Drzewa czerwono-czarne. Binboy at Sphere http://binboy.sphere.p l Drzewa czerwono-czarne. Autor: Jacek Zacharek Wstęp. Pojęcie drzewa czerwono-czarnego (red-black tree) zapoczątkował Rudolf Bayer w książce z 1972 r. pt. Symmetric

Bardziej szczegółowo

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH LGORTM I STRUKTUR DNH Temat 6: Drzewa ST, VL Wykładowca: dr inż. bigniew TRPT e-mail: bigniew.tarapata@isi.wat.edu.pl http://www.tarapata.strefa.pl/p_algorytmy_i_struktury_danych/ Współautorami wykładu

Bardziej szczegółowo

Lista liniowa dwukierunkowa

Lista liniowa dwukierunkowa 53 Lista liniowa dwukierunkowa Jest to lista złożona z elementów, z których każdy posiada, oprócz wskaźnika na element następny, również wskaźnik na element poprzedni. Zdefiniujmy element listy dwukierunkowej

Bardziej szczegółowo

Podstawy Informatyki. Wykład 6. Struktury danych

Podstawy Informatyki. Wykład 6. Struktury danych Podstawy Informatyki Wykład 6 Struktury danych Stałe i zmienne Podstawowymi obiektami występującymi w programie są stałe i zmienne. Ich znaczenie jest takie samo jak w matematyce. Stałe i zmienne muszą

Bardziej szczegółowo

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych. Algorytmy i Struktury Danych. Drzewa poszukiwań binarnych. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 10 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych.

Bardziej szczegółowo

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych Algorytmy i Struktury Danych Wykład IV Sortowania cd. Elementarne struktury danych 1 Co dziś? Dolna granica sortowań Mediany i statystyki pozycyjne Warstwa implementacji Warstwa abstrakcji #tablice #listy

Bardziej szczegółowo

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 > Typy indeksów Indeks jest zakładany na atrybucie relacji atrybucie indeksowym (ang. indexing field). Indeks zawiera wartości atrybutu indeksowego wraz ze wskaźnikami do wszystkich bloków dyskowych zawierających

Bardziej szczegółowo

Sortowanie bąbelkowe

Sortowanie bąbelkowe 1/98 Sortowanie bąbelkowe (Bubble sort) prosty i nieefektywny algorytm sortowania wielokrotnie przeglądamy listę elementów, porównując dwa sąsiadujące i zamieniając je miejscami, jeśli znajdują się w złym

Bardziej szczegółowo

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski Algorytmy i struktury danych Wykład 5: Drzewa Dr inż. Paweł Kasprowski pawel@kasprowski.pl Drzewa Struktury przechowywania danych podobne do list ale z innymi zasadami wskazywania następników Szczególny

Bardziej szczegółowo

Porządek symetryczny: right(x)

Porządek symetryczny: right(x) Porządek symetryczny: x lef t(x) right(x) Własność drzewa BST: W drzewach BST mamy porządek symetryczny. Dla każdego węzła x spełniony jest warunek: jeżeli węzeł y leży w lewym poddrzewie x, to key(y)

Bardziej szczegółowo

Tadeusz Pankowski www.put.poznan.pl/~tadeusz.pankowski

Tadeusz Pankowski www.put.poznan.pl/~tadeusz.pankowski : idea Indeksowanie: Drzewo decyzyjne, przeszukiwania binarnego: F = {5, 7, 10, 12, 13, 15, 17, 30, 34, 35, 37, 40, 45, 50, 60} 30 12 40 7 15 35 50 Tadeusz Pankowski www.put.poznan.pl/~tadeusz.pankowski

Bardziej szczegółowo

Struktury Danych i Złożoność Obliczeniowa

Struktury Danych i Złożoność Obliczeniowa Struktury Danych i Złożoność Obliczeniowa Zajęcia 3 Struktury drzewiaste drzewo binarne szczególny przypadek drzewa, które jest szczególnym przypadkiem grafu skierowanego, stopień każdego wierzchołka jest

Bardziej szczegółowo

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

dodatkowe operacje dla kopca binarnego: typu min oraz typu max: ASD - ćwiczenia IX Kopce binarne własność porządku kopca gdzie dla każdej trójki wierzchołków kopca (X, Y, Z) porządek etykiet elem jest następujący X.elem Y.elem oraz Z.elem Y.elem w przypadku kopca typu

Bardziej szczegółowo

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste. Drzewa binarne Każdy węzeł w drzewie posiada pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste. Uporządkowanie. Zakładamy, że klucze są różne. Klucze leżące

Bardziej szczegółowo

Matematyka dyskretna - 7.Drzewa

Matematyka dyskretna - 7.Drzewa Matematyka dyskretna - 7.Drzewa W tym rozdziale zajmiemy się drzewami: specjalnym przypadkiem grafów. Są one szczególnie przydatne do przechowywania informacji, umożliwiającego szybki dostęp do nich. Definicja

Bardziej szczegółowo

. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016

. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016 .. Podstawy Programowania 2 Drzewa bst - część pierwsza Arkadiusz Chrobot Zakład Informatyki 22 maja 2016 1 / 55 Plan.1 Wstęp.2 Definicje.3 Implementacja Typ bazowy i wskaźnik na korzeń Dodawanie elementu

Bardziej szczegółowo

Drzewa poszukiwań binarnych

Drzewa poszukiwań binarnych 1 Cel ćwiczenia Algorytmy i struktury danych Instytut Sterowania i Systemów Informatycznych Wydział Elektrotechniki, Informatyki i Telekomunikacji Uniwersytet ielonogórski Drzewa poszukiwań binarnych Ćwiczenie

Bardziej szczegółowo

Drzewo binarne BST. LABORKA Piotr Ciskowski

Drzewo binarne BST. LABORKA Piotr Ciskowski Drzewo binarne BST LABORKA Piotr Ciskowski zadanie 1. drzewo binarne - 1 Zaimplementuj drzewo binarne w postaci: klasy Osoba przechowującej prywatne zmienne: liczbę całkowitą to będzie klucz, wg którego

Bardziej szczegółowo

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Algorytmy i struktury danych Laboratorium Drzewa poszukiwań binarnych 1 Cel ćwiczenia Ćwiczenie ma na celu zapoznanie studentów

Bardziej szczegółowo

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH ALGORYTMY I STRUKTURY DANYCH Temat 4: Realizacje dynamicznych struktur danych. Wykładowca: dr inż. Zbigniew TARAPATA e-mail: Zbigniew.Tarapata@isi.wat.edu.pl http://www.tarapata.strefa.pl/p_algorytmy_i_struktury_danych/

Bardziej szczegółowo

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz Grafy (3): drzewa Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków UTP Bydgoszcz 13 (Wykłady z matematyki dyskretnej) Grafy (3): drzewa 13 1 / 107 Drzewo Definicja. Drzewo to graf acykliczny

Bardziej szczegółowo

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH ALGORYTMY I STRUKTURY DANYCH Temat : Drzewa zrównoważone, sortowanie drzewiaste Wykładowca: dr inż. Zbigniew TARAPATA e-mail: Zbigniew.Tarapata@isi.wat.edu.pl http://www.tarapata.strefa.pl/p_algorytmy_i_struktury_danych/

Bardziej szczegółowo

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik Wykład X Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2016 c Copyright 2016 Janusz Słupik Drzewa binarne Drzewa binarne Drzewo binarne - to drzewo (graf spójny bez cykli) z korzeniem (wyróżnionym

Bardziej szczegółowo

Drzewa poszukiwań binarnych

Drzewa poszukiwań binarnych 1 Drzewa poszukiwań binarnych Kacper Pawłowski Streszczenie W tej pracy przedstawię zagadnienia związane z drzewami poszukiwań binarnych. Przytoczę poszczególne operacje na tej strukturze danych oraz ich

Bardziej szczegółowo

Algorytmy i struktury danych. wykład 5

Algorytmy i struktury danych. wykład 5 Plan wykładu: Wskaźniki. : listy, drzewa, kopce. Wskaźniki - wskaźniki Wskaźnik jest to liczba lub symbol który w ogólności wskazuje adres komórki pamięci. W językach wysokiego poziomu wskaźniki mogą również

Bardziej szczegółowo

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Wykład 8. Drzewo rozpinające (minimum spanning tree) Wykład 8 Drzewo rozpinające (minimum spanning tree) 1 Minimalne drzewo rozpinające - przegląd Definicja problemu Własności minimalnych drzew rozpinających Algorytm Kruskala Algorytm Prima Literatura Cormen,

Bardziej szczegółowo

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST) Drzewa ST i VL Drzewa poszukiwań binarnych (ST) Drzewo ST to dynamiczna struktura danych (w formie drzewa binarnego), która ma tą właściwość, że dla każdego elementu wszystkie elementy w jego prawym poddrzewie

Bardziej szczegółowo

TEORETYCZNE PODSTAWY INFORMATYKI

TEORETYCZNE PODSTAWY INFORMATYKI 1 TEORETYCZNE PODSTAWY INFORMATYKI WFAiS UJ, Informatyka Stosowana I rok studiów, I stopień Wykład 7 część I 2 Modele danych: zbiory Podstawowe definicje Operacje na zbiorach Prawa algebraiczne Struktury

Bardziej szczegółowo

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1 Wykład Algorytmy grafowe metoda zachłanna. Właściwości algorytmu zachłannego:. W przeciwieństwie do metody programowania dynamicznego nie występuje etap dzielenia na mniejsze realizacje z wykorzystaniem

Bardziej szczegółowo

Drzewa wyszukiwań binarnych (BST)

Drzewa wyszukiwań binarnych (BST) Drzewa wyszukiwań binarnych (BST) Krzysztof Grządziel 12 czerwca 2007 roku 1 Drzewa Binarne Drzewa wyszukiwań binarnych, w skrócie BST (od ang. binary search trees), to szczególny przypadek drzew binarnych.

Bardziej szczegółowo

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania: Sortowanie Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania: podać strukturę danych dla elementów dynamicznego skończonego multi-zbioru S, względem którego są wykonywane następujące

Bardziej szczegółowo

Podstawy Informatyki. Metody dostępu do danych

Podstawy Informatyki. Metody dostępu do danych Podstawy Informatyki c.d. alina.momot@polsl.pl http://zti.polsl.pl/amomot/pi Plan wykładu 1 Bazy danych Struktury danych Średni czas odszukania rekordu Drzewa binarne w pamięci dyskowej 2 Sformułowanie

Bardziej szczegółowo

TEORETYCZNE PODSTAWY INFORMATYKI

TEORETYCZNE PODSTAWY INFORMATYKI 1 TEORETYCZNE PODSTAWY INFORMATYKI WFAiS UJ, Informatyka Stosowana I rok studiów, I stopień Wykład 6 część I 2 Modele danych: zbiory Podstawowe definicje Operacje na zbiorach Prawa algebraiczne Struktury

Bardziej szczegółowo

Metody Kompilacji Wykład 3

Metody Kompilacji Wykład 3 Metody Kompilacji Wykład 3 odbywa się poprzez dołączenie zasad(reguł) lub fragmentów kodu do produkcji w gramatyce. Włodzimierz Bielecki WI ZUT 2 Na przykład, dla produkcji expr -> expr 1 + term możemy

Bardziej szczegółowo

Abstrakcyjne struktury danych - stos, lista, drzewo

Abstrakcyjne struktury danych - stos, lista, drzewo Sprawozdanie Podstawy Informatyki Laboratoria Abstrakcyjne struktury danych - stos, lista, drzewo Maciej Tarkowski maciek@akom.pl grupa VII 1/8 1. Stos Stos (ang. Stack) jest podstawową liniową strukturą

Bardziej szczegółowo

2012-01-16 PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew

2012-01-16 PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew 0-0-6 PLAN WYKŁADU Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew BAZY DANYCH Wykład 9 dr inż. Agnieszka Bołtuć INDEKSY - DEFINICJE Indeksy to pomocnicze struktury

Bardziej szczegółowo

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel Wstęp do programowania Drzewa podstawowe techniki Piotr Chrząstowski-Wachtel Drzewa wyszukiwań Drzewa często służą do przechowywania informacji. Jeśli uda sie nam stworzyć drzewo o niewielkiej wysokości

Bardziej szczegółowo

0-0000, 1-0001, 2-0010, 3-0011 itd... 9-1001.

0-0000, 1-0001, 2-0010, 3-0011 itd... 9-1001. KODOWANIE Jednym z problemów, z którymi spotykamy się w informatyce, jest problem właściwego wykorzystania pamięci. Konstruując algorytm staramy się zwykle nie tylko o zminimalizowanie kosztów czasowych

Bardziej szczegółowo

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019 .. Podstawy Programowania 2 Drzewa bst - część druga Arkadiusz Chrobot Zakład Informatyki 12 maja 2019 1 / 39 Plan.1 Wstęp.2 Wyszukiwanie w BST Minimalny i maksymalny klucz Wskazany klucz.3.4 Zmiany w

Bardziej szczegółowo

BAZY DANYCH. Microsoft Access. Adrian Horzyk OPTYMALIZACJA BAZY DANYCH I TWORZENIE INDEKSÓW. Akademia Górniczo-Hutnicza

BAZY DANYCH. Microsoft Access. Adrian Horzyk OPTYMALIZACJA BAZY DANYCH I TWORZENIE INDEKSÓW. Akademia Górniczo-Hutnicza BAZY DANYCH Microsoft Access OPTYMALIZACJA BAZY DANYCH I TWORZENIE INDEKSÓW Adrian Horzyk Akademia Górniczo-Hutnicza Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej Katedra Automatyki

Bardziej szczegółowo

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna Podstawy Programowania 2 Drzewa bst - część druga Arkadiusz Chrobot Zakład Informatyki 12 maja 2016 1 / 8 Plan Wstęp Wyszukiwanie w BST Minimalny i maksymalny klucz Wskazany klucz Zmiany w funkcji main()

Bardziej szczegółowo

Sortowanie. Bartman Jacek Algorytmy i struktury

Sortowanie. Bartman Jacek Algorytmy i struktury Sortowanie Bartman Jacek jbartman@univ.rzeszow.pl Algorytmy i struktury danych Sortowanie przez proste wstawianie przykład 41 56 17 39 88 24 03 72 41 56 17 39 88 24 03 72 17 41 56 39 88 24 03 72 17 39

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania Wykład 5 Podstawowe techniki programownia w przykładach Janusz Szwabiński Plan wykładu: Metoda babilońska wyliczania pierwiastka Liczby pierwsze i sito Eratostenesa Metoda bisekcji

Bardziej szczegółowo

Drzewa podstawowe poj

Drzewa podstawowe poj Drzewa podstawowe poj ecia drzewo graf reprezentujacy regularna strukture wskaźnikowa, gdzie każdy element zawiera dwa lub wiecej wskaźników (ponumerowanych) do takich samych elementów; wez ly (albo wierzcho

Bardziej szczegółowo

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Wykład 5. Sortowanie w czasie liniowologarytmicznym Wykład 5 Sortowanie w czasie liniowologarytmicznym 1 Sortowanie - zadanie Definicja (dla liczb): wejście: ciąg n liczb A = (a 1, a 2,, a n ) wyjście: permutacja (a 1,, a n ) taka, że a 1 a n 2 Zestawienie

Bardziej szczegółowo

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel Wstęp do programowania Drzewa Piotr Chrząstowski-Wachtel Drzewa Drzewa definiują matematycy, jako spójne nieskierowane grafy bez cykli. Równoważne określenia: Spójne grafy o n wierzchołkach i n-1 krawędziach

Bardziej szczegółowo

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać

Bardziej szczegółowo

Indeksy. Wprowadzenie. Indeksy jednopoziomowe indeks podstawowy indeks zgrupowany indeks wtórny. Indeksy wielopoziomowe

Indeksy. Wprowadzenie. Indeksy jednopoziomowe indeks podstawowy indeks zgrupowany indeks wtórny. Indeksy wielopoziomowe 1 Plan rozdziału 2 Indeksy Indeksy jednopoziomowe indeks podstawowy indeks zgrupowany indeks wtórny Indeksy wielopoziomowe Indeksy typu B-drzewo B-drzewo B+ drzewo B* drzewo Wprowadzenie 3 Indeks podstawowy

Bardziej szczegółowo

Wykład 3. Drzewa czerwono-czarne

Wykład 3. Drzewa czerwono-czarne Wykład 3 Drzewa czerwono-czarne 1 Drzewa zbalansowane Wprowadzenie Drzewa czerwono-czarne Definicja, wysokość drzewa Rotacje, operacje wstawiania i usuwania Literatura Cormen, Leiserson, Rivest, Wprowadzenie

Bardziej szczegółowo

Wykłady z Matematyki Dyskretnej

Wykłady z Matematyki Dyskretnej Wykłady z Matematyki Dyskretnej dla kierunku Informatyka dr Instytut Informatyki Politechnika Krakowska Wykłady na bazie materiałów: dra hab. Andrzeja Karafiata dr hab. Joanny Kołodziej, prof. PK Grafy

Bardziej szczegółowo

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)! Rekurencja Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)! Pseudokod: silnia(n): jeżeli n == 0 silnia = 1 w przeciwnym

Bardziej szczegółowo

Kompresja danych Streszczenie Studia Dzienne Wykład 10,

Kompresja danych Streszczenie Studia Dzienne Wykład 10, 1 Kwantyzacja wektorowa Kompresja danych Streszczenie Studia Dzienne Wykład 10, 28.04.2006 Kwantyzacja wektorowa: dane dzielone na bloki (wektory), każdy blok kwantyzowany jako jeden element danych. Ogólny

Bardziej szczegółowo

7. Teoria drzew - spinanie i przeszukiwanie

7. Teoria drzew - spinanie i przeszukiwanie 7. Teoria drzew - spinanie i przeszukiwanie Grzegorz Kosiorowski Uniwersytet Ekonomiczny w Krakowie zima 2016/2017 rzegorz Kosiorowski (Uniwersytet Ekonomiczny 7. wteoria Krakowie) drzew - spinanie i przeszukiwanie

Bardziej szczegółowo

Notacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.

Notacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera. 1 wyliczanie i transformacja wyrażeń (wersja skrócona) Opis został przygotowany przez: Bogdana Kreczmera 28 kwietnia 2002 Strona 1 z 68 Zakład Podstaw Cybernetyki i Robotyki - trochę historii...............

Bardziej szczegółowo

Koszt zamortyzowany. Potencjał - Fundusz Ubezpieczeń Kosztów Algorytmicznych

Koszt zamortyzowany. Potencjał - Fundusz Ubezpieczeń Kosztów Algorytmicznych Koszt zamortyzowany Jeśli mamy ciąg operacji, to koszt zamortyzowany jednej z nich jest sumarycznym kosztem wykonania wszystkich operacji podzielonym przez liczbę operacji. Inaczej mówiąc jest to, dla

Bardziej szczegółowo

Ogólne wiadomości o drzewach

Ogólne wiadomości o drzewach Ogólne wiadomości o drzewach Algorytmy i struktury danych Wykład 4. Rok akademicki: 2010/2011 Drzewo jako struktura danych Drzewo kolekcja elementów pozostających w zależności hierarchicznej, posiadająca

Bardziej szczegółowo

Algorytmy sortujące i wyszukujące

Algorytmy sortujące i wyszukujące Algorytmy sortujące i wyszukujące Zadaniem algorytmów sortujących jest ułożenie elementów danego zbioru w ściśle określonej kolejności. Najczęściej wykorzystywany jest porządek numeryczny lub leksykograficzny.

Bardziej szczegółowo

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.) Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.) Kontenery - - wektor vector - - lista list - - kolejka queue - - stos stack Kontener asocjacyjny map 2016-01-08 Bazy danych-1 W5 1 Kontenery W programowaniu

Bardziej szczegółowo

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Cel zajęć. Celem zajęć jest zapoznanie się ze sposobem działania popularnych kolekcji. Wprowadzenie teoretyczne. Rozważana w ramach niniejszych

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania Algorytmy na tablicach Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk (Wydział Fizyki) WP w. III Jesień 2013 1 / 23 Dwadzieścia pytań Zasady 1 Osoba 1 wymyśla hasło z ustalonej

Bardziej szczegółowo

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Podstawowe algorytmy i ich implementacje w C. Wykład 9 Wstęp do programowania 1 Podstawowe algorytmy i ich implementacje w C Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 9 Element minimalny i maksymalny zbioru Element minimalny

Bardziej szczegółowo

PODSTAWY INFORMATYKI wykład 6.

PODSTAWY INFORMATYKI wykład 6. PODSTAWY INFORMATYKI wykład 6. Adrian Horzyk Web: http://home.agh.edu.pl/~horzyk/ E-mail: horzyk@agh.edu.pl Google: Adrian Horzyk Gabinet: paw. D13 p. 325 Akademia Górniczo-Hutnicza w Krakowie WEAIiE,

Bardziej szczegółowo

Poprawność semantyczna

Poprawność semantyczna Poprawność składniowa Poprawność semantyczna Poprawność algorytmu Wypisywanie zdań z języka poprawnych składniowo Poprawne wartościowanie zdań języka, np. w języku programowania skutki wystąpienia wyróżnionych

Bardziej szczegółowo

Programowanie w VB Proste algorytmy sortowania

Programowanie w VB Proste algorytmy sortowania Programowanie w VB Proste algorytmy sortowania Sortowanie bąbelkowe Algorytm sortowania bąbelkowego polega na porównywaniu par elementów leżących obok siebie i, jeśli jest to potrzebne, zmienianiu ich

Bardziej szczegółowo

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe Algorytmy i złożoności Wykład 3. Listy jednokierunkowe Wstęp. Lista jednokierunkowa jest strukturą pozwalającą na pamiętanie danych w postaci uporzadkowanej, a także na bardzo szybkie wstawianie i usuwanie

Bardziej szczegółowo