Algorytmy i struktury danych

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

Download "Algorytmy i struktury danych"

Transkrypt

1 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 tablicy asocjacyjnej (mapy) - podsumowanie Drzewa czerwono-czarne Źródła: większość ilustracji i przykładów pochodzi z "Problem Solving with Algorithms and Data Structures using Python", Binarne drzewo poszukiwań (ang. binary search tree, BST) drzewo binarne, w którym: lewe poddrzewo każdego węzła zawiera wyłącznie elementy o kluczach nie większych niż klucz węzła prawe poddrzewo każdego węzła zawiera wyłącznie elementy o kluczach nie mniejszych niż klucz węzła węzły, oprócz klucza, przechowują wskaźniki na swojego lewego i prawego syna oraz na swojego ojca przechodząc drzewo metodą inorder uzyskamy ciąg kluczy posortowanych niemalejąco koszty operacji (wstawianie, wyszukiwanie, usuwanie): proporcjonalny do wysokości (liczby poziomów) drzewa h w przypadku drzew zrównoważonych h log 2 n, gdzie n to liczba węzłów optymistyczny koszt operacji to O(logn) w przypadku drzew skrajnie niezrównoważonych może być nawet h n pesymistyczny koszt wzrasta do O(n) można wykorzystać do implementacji tablic asocjacyjnych (czyli par klucz-wartość) Interfejs abstrakcyjnej tablicy asocjacyjnej Map() - tworzy pustą mapę (tablicę asocjacyjną) put(key,val) - dodaje nową parę klucz-wartość do tablicy. Jeśli klucz jest już w tablicy, odpowiadająca mu wartość jest zmieniana na nową get(key) - odczytuje wartość odpowiadającą kluczowi del map[key] - usuwa parę klucz-wartość z tablicy len() - liczba par klucz-wartość zapisana w tablicy in - operator przynależności, zwraca True jeżeli klucz znajduje się w tablicy Implementacja rozważmy najpierw proces tworzenia drzewa dla następującej listy kluczy: 70,31,93,94,14,23,73 pierwszy element listy, czyli 70 staje się korzeniem 31 jest mniejsze od 70, więc staje się jego lewym dzieckiem 93 jest większe od 70, więc staje się prawym dzieckiem korzenia 94 jest większe od 70 i od 93, więc staje się prawym dzieckiem elementu 93

2 14 jest mniejsze od 70 i od 31, więc staje się lewym dzieckiem elementu jest mniejsze od 70 i 31, ale większe od 14, więc staje się prawym dzieckiem elementu 14 zaimplementujemy BST przy pomocy dwóch klas: TreeNode - węzeł drzewa, zawiera referencje do dzieci i rodzica oraz szereg funkcji pomocniczych, które pozwalają sklasyfikować węzeł na podstawie jego położenia BinarySearchTree - właściwe drzewo, zawiera referencję do korzenia drzewa, która jest równa None (drzewo puste) lub wskazuje na konkret klasy TreeNode Podstawowe klasy In [2]: class TreeNode: def init (self,key,val,left=none,right=none, parent=none): self.key = key self.payload = val self.leftchild = left self.rightchild = right self.parent = parent def hasleftchild(self): return self.leftchild def hasrightchild(self): return self.rightchild def isleftchild(self): return self.parent and self.parent.leftchild == self def isrightchild(self): return self.parent and self.parent.rightchild == self def isroot(self): return not self.parent def isleaf(self): return not (self.rightchild or self.leftchild) def hasanychildren(self): return self.rightchild or self.leftchild def hasbothchildren(self): return self.rightchild and self.leftchild def replacenodedata(self,key,value,lc,rc): self.key = key self.payload = value self.leftchild = lc self.rightchild = rc if self.hasleftchild(): self.leftchild.parent = self if self.hasrightchild(): self.rightchild.parent = self szablon właściwej klasy może wyglądać tak:

3 In [1]: class BinarySearchTree: def init (self): self.root = None self.size = 0 def length(self): def len (self): def iter (self): return self.root. iter () Wstawianie elementów do drzewa metoda put jeśli drzewo jest puste, tworzymy nową instancję TreeNode i wstawiamy ją w miejsce korzenia jeśli drzewo ma już korzeń, wówczas: zaczynając od korzenia, porównujemy wartość nowego klucza z kluczem aktualnego węzła: jeśli jest mniejsza, przechodzimy do lewego poddrzewa jeśli jest większa, przechodzimy do prawego poddrzewa jeśli nie ma poddrzew, znaleźliśmy pozycję do wstawienia nowego klucza tworzymy nową instancję TreeNode i wstawiamy ją na znalezioną pozycję

4 In [3]: class BinarySearchTree: def init (self): self.root = None self.size = 0 def length(self): def len (self): def iter (self): return self.root. iter () def put(self,key,val): if self.root: self._put(key,val,self.root) #_put is a helper function self.root = TreeNode(key,val) self.size = self.size + 1 def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) dodatkowo możemy przeładować jeszcze operator [], co pozwoli na korzystanie z nowej struktury jak ze słownika: In [4]: class BinarySearchTree: def init (self): self.root = None self.size = 0 def length(self): def len (self): def iter (self): return self.root. iter () def put(self,key,val): if self.root: self._put(key,val,self.root) #_put is a helper function self.root = TreeNode(key,val) self.size = self.size + 1 def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) def setitem (self,k,v): #overloading of [] operator self.put(k,v)

5 Odczytywanie wartości metoda get rekursywne przeszukiwanie drzewa do momentu: znalezienia podanego klucza dojścia do liścia, którego klucz ma inną wartość (klucza nie ma w drzewie) dodatkowo znowu przeładujemy operator [], aby za jego pomocą można było odczytywać wartości In [5]: class BinarySearchTree: def init (self): self.root = None self.size = 0 def length(self): def len (self): def iter (self): return self.root. iter () def put(self,key,val): if self.root: self._put(key,val,self.root) #_put is a helper function self.root = TreeNode(key,val) self.size = self.size + 1 def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) def setitem (self,k,v): #overloading of [] operator self.put(k,v) def get(self,key): if self.root: res = self._get(key,self.root) if res: return res.payload return None return None def _get(self,key,currentnode): if not currentnode: return None elif currentnode.key == key: return currentnode elif key < currentnode.key: return self._get(key,currentnode.leftchild) return self._get(key,currentnode.rightchild) def getitem (self,key): #overloading of [] operator return self.get(key) Sprawdzanie przynależności metoda get pozwala na natychmiastowe zaimplementowanie operatora in

6 In [ ]: class BinarySearchTree: def init (self): self.root = None self.size = 0 def length(self): def len (self): def iter (self): return self.root. iter () def put(self,key,val): if self.root: self._put(key,val,self.root) #_put is a helper function self.root = TreeNode(key,val) self.size = self.size + 1 def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) def setitem (self,k,v): #overloading of [] operator self.put(k,v) def get(self,key): if self.root: res = self._get(key,self.root) if res: return res.payload return None return None def _get(self,key,currentnode): if not currentnode: return None elif currentnode.key == key: return currentnode elif key < currentnode.key: return self._get(key,currentnode.leftchild) return self._get(key,currentnode.rightchild) def getitem (self,key): #overloading of [] operator return self.get(key) def contains (self,key): # overloading of in operator if self._get(key,self.root): return True return False Usuwanie elementów metoda delete i przeciążony operator del najtrudniejsza z metod kroki: znalezienie węzła z podanym kluczem metodą _get trzy możliwości - znaleziony węzeł: jest liściem (nie ma dzieci) najprostsza możliwość

7 usuwamy element i referencję do niego w węźle rodzicu ma jedno dziecko przesuwamy dziecko w miejsce usuwanego rodzica ma dwoje dzieci przeszukujemy poddrzewo usuwanego węzła, aby znaleźć kandydata na jego miejsce, czyli następnik (ang. successor) będzie to węzeł o najmniejszym kluczu większym od klucza węzła usuwanego powinien on mieć tylko prawe dziecko usuwamy go jak w poprzednim przypadku wstawiamy na miejsce usuwanego węzła In [6]: class BinarySearchTree: def init (self): self.root = None self.size = 0 def length(self):

8 def length(self): def len (self): def iter (self): return self.root. iter () def put(self,key,val): if self.root: self._put(key,val,self.root) #_put is a helper function self.root = TreeNode(key,val) self.size = self.size + 1 def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) def setitem (self,k,v): #overloading of [] operator self.put(k,v) def get(self,key): if self.root: res = self._get(key,self.root) if res: return res.payload return None return None def _get(self,key,currentnode): if not currentnode: return None elif currentnode.key == key: return currentnode elif key < currentnode.key: return self._get(key,currentnode.leftchild) return self._get(key,currentnode.rightchild) def getitem (self,key): #overloading of [] operator return self.get(key) def contains (self,key): # overloading of in operator if self._get(key,self.root): return True return False def delete(self,key): if self.size > 1: nodetoremove = self._get(key,self.root) if nodetoremove: self.remove(nodetoremove) self.size = self.size-1 raise KeyError('Error, key not in tree') elif self.size == 1 and self.root.key == key: self.root = None self.size = self.size - 1 raise KeyError('Error, key not in tree') def delitem (self,key): #overloading of del operator self.delete(key) def spliceout(self):

9 def spliceout(self): if self.isleaf(): if self.isleftchild(): self.parent.leftchild = None self.parent.rightchild = None elif self.hasanychildren(): if self.hasleftchild(): if self.isleftchild(): self.parent.leftchild = self.leftchild self.parent.rightchild = self.leftchild self.leftchild.parent = self.parent if self.isleftchild(): self.parent.leftchild = self.rightchild self.parent.rightchild = self.rightchild self.rightchild.parent = self.parent def findsuccessor(self): succ = None if self.hasrightchild(): succ = self.rightchild.findmin() if self.parent: if self.isleftchild(): succ = self.parent self.parent.rightchild = None succ = self.parent.findsuccessor() self.parent.rightchild = self return succ def findmin(self): current = self while current.hasleftchild(): current = current.leftchild return current def remove(self,currentnode): if currentnode.isleaf(): #leaf if currentnode == currentnode.parent.leftchild: currentnode.parent.leftchild = None currentnode.parent.rightchild = None elif currentnode.hasbothchildren(): #interior succ = currentnode.findsuccessor() succ.spliceout() currentnode.key = succ.key currentnode.payload = succ.payload # this node has one child if currentnode.hasleftchild(): if currentnode.isleftchild(): currentnode.leftchild.parent = currentnode.parent currentnode.parent.leftchild = currentnode.leftchild elif currentnode.isrightchild(): currentnode.leftchild.parent = currentnode.parent currentnode.parent.rightchild = currentnode.leftchild currentnode.replacenodedata(currentnode.leftchild.key, currentnode.leftchild.payload, currentnode.leftchild.leftchild, currentnode.leftchild.rightchild) if currentnode.isleftchild(): currentnode.rightchild.parent = currentnode.parent currentnode.parent.leftchild = currentnode.rightchild elif currentnode.isrightchild(): currentnode.rightchild.parent = currentnode.parent currentnode.parent.rightchild = currentnode.rightchild currentnode.replacenodedata(currentnode.rightchild.key, currentnode.rightchild.payload, currentnode.rightchild.leftchild, currentnode.rightchild.rightchild)

10 In [7]: mytree = BinarySearchTree() mytree[3]="red" mytree[4]="blue" mytree[6]="yellow" mytree[2]="at" print(mytree[6]) print(mytree[2]) yellow at Analiza binarnych drzew wyszukiwania szukając miejsca do wstawienia nowej pary klucz-wartość, w najgorszym wypadku wykonamy liczbę porównań równą wysokości drzewa wysokość to nic innego jak liczba krawędzi między korzeniem i najgłębiej położonym liściem wydajność metody put ograniczona jest wysokością drzewa jeśli wartości wstawiane są do drzewa w losowym porządku kluczy, wysokość h log 2 n ponieważ klucze są losowo uporządkowane, mniej więcej połowa z nich będzie mniejsza od korzenia, a druga połowa - większa w drzewie binarnym mamy jeden element na poziomie pierwszym (korzeń), maksymalnie dwa elementy na kolejnym itd. na poziomie d mamy zatem 2 d elementów jeżeli drzewo jest idealnie zrównoważone, całkowita liczba węzłów wynosi n = 2 h idealnie zrównoważone drzewo ma tę samą liczbę węzłów w każdym poddrzewie rzeczywiście mamy więc h = log 2 n wysokość jest ograniczeniem wydajności - put jest klasy O(logn) jeśli wstawiane wartości wstawiane są według posortowanych kluczy drzewo ma wysokość h = n w tym wypadku put jest klasy O(n) metody get, in i del mają podobne ograniczenia wydajności Zrównoważone binarne drzewa poszukiwań (AVL) Definicja zrównoważone binarne drzewo poszukiwań skrót AVL pochodzi od nazwisk rosyjskich matematyków: Adelsona-Velskiego oraz Landisa (właściwie: Gieorgij Adelson-Wielskij i Jewgienij Łandis) rozwiązuje problem utrzymania dobrej wydajności operacji na drzewie (czyli jego dobrej struktury) każdemu węzłowi przypisuje się współczynnik wyważenia (ang. balance factor): balancefactor = height(leftsubtree) height(rightsubtree)

11 drzewo jest zrównoważone, jeśli współczynnik wyważenia wynosi 0, +1 lub -1 wstawiając lub usuwając węzły tak, aby zachować własności drzewa BST, modyfikuje się również współczynnik wyważenia gdy współczynnik przyjmuje niedozwoloną wartość, wykonuje się operację rotacji węzłów w celu przywrócenia zrównoważenia Wydajność motywacja dla drzew AVL jest taka, że utrzymując współczynnik zrównoważenia w dopuszczalnych granicach poprawimy złożoność najważniejszych opreacji rozważmy 3 drzewa o wysokościach 0, 1, 2 i 3 w ich najmniej zrównoważonej wersji zachowującej poprawne wartości współczynników wyważenia

12 liczba węzłów w funkcji wysokości w powyższym przykładzie: N 0 = 1 N 1 = = 2 N 2 = = 4 N 3 = = 7 ogólnie otrzymaliśmy zależność zależność ta bardzo przypomina ciąg Fibonacciego: N h = 1 + N h 1 + N h 2 F 0 = 0 F 1 = 1 F i = F i 1 + F i 2 for all i 2 wiemy, że lim gdzie \Phi to złoty podział wyraźmy liczbę węzłów w drzewie AVL przez wyrazy ciągu Fibonacciego: N_h = F_{h+2} - 1, h \ge 1 ponadto załóżmy, że: F_i = \Phi^i/\sqrt{5} wówczas N_h = \frac{\phi^{h+2}}{\sqrt{5}} - 1 \begin{eqnarray} \log{n_h+1} & = & (h+2)\log{\phi} - \frac{1}{2} \log{5} \\ h & = & \frac{\log{n_h+1} - 2 \log{\phi} + \frac{1}{2} \log{5}}{\log{\phi}} \\ h & = & 1.44 \log{n_h} \end{eqnarray} drzewa AVL również w najgorszym przypadku mają wysokość równą pewnej stałej pomnożonej przez logarytm z liczby węzłów wydajność podstawowych operacji pozostaje na poziomie O(\log N)! Implementacja możemy zaimplementować drzewo AVL jako klasę pochodną drzew BST musimy nadpisać część definicji metod pomocniczych na takie, które zachowują własności drzew AVL Wstawianie elementów nowe klucze są wstawiane do drzewa jako liście ich współczynnik wyważenia wynosi 0 musimy jednak zaktualizować współczynnik rodzica następnie rekursywnie wyliczamy na nowo współczynniki wszystkich przodków dwa przypadki bazowe: doszliśmy do korzenia rodzic po aktualizacji ma współczynnik wyważenia równy 0 (jeśli jakieś poddrzewo ma współczynnik 0, to współczynnik przodka nie ulega zmianie musimy nadpisać metodę _put i dopisać nową funkcję pomocniczą do aktualizowania współczynnika wyważenia

13 In [8]: class AVLTree(BinarySearchTree): def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) self.updatebalance(currentnode.leftchild) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) self.updatebalance(currentnode.rightchild) def updatebalance(self,node): if node.balancefactor > 1 or node.balancefactor < -1: self.rebalance(node) return if node.parent!= None: if node.isleftchild(): node.parent.balancefactor += 1 elif node.isrightchild(): node.parent.balancefactor -= 1 if node.parent.balancefactor!= 0: self.updatebalance(node.parent) aby ponownie zrównoważyć drzewo, konieczna może być rotacja węzłów rotacja w lewo odbywa się w następujący sposób: prawe dziecko B staje się korzeniem poddrzewa dawny korzeń jest teraz nowym lewym dzieckiem jeśli węzeł B miał prawe dziecko, pozostaw je w kolejnym przykładzie wymagana jest rotacja w prawo przesuń C w miejsce korzenia poprzedni korzeń E staje się prawym dzieckiem nowego korzenia jeśli C miał prawe dziecko (D), staje się ono lewym dzieckiem nowego prawego dziecka (E)

14 In [9]: class AVLTree(BinarySearchTree): def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) self.updatebalance(currentnode.leftchild) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) self.updatebalance(currentnode.rightchild) def updatebalance(self,node): if node.balancefactor > 1 or node.balancefactor < -1: self.rebalance(node) #to be implemented return if node.parent!= None: if node.isleftchild(): node.parent.balancefactor += 1 elif node.isrightchild(): node.parent.balancefactor -= 1 if node.parent.balancefactor!= 0: self.updatebalance(node.parent) def rotateleft(self,rotroot): newroot = rotroot.rightchild #keep track of the new root rotroot.rightchild = newroot.leftchild # right child of the old root replaced with the left child of the new if newroot.leftchild!= None: newroot.leftchild.parent = rotroot newroot.parent = rotroot.parent if rotroot.isroot(): self.root = newroot if rotroot.isleftchild(): # if the old root is a left child then we change the pa rent rotroot.parent.leftchild = newroot # of the left child to point to the new root; otherwise we # change the parent of the right child to point rotroot.parent.rightchild = newroot # to the new root newroot.leftchild = rotroot rotroot.parent = newroot rotroot.balancefactor = rotroot.balancefactor min(newroot.balancefactor, 0) #aktualizacja wspó łczynnika newroot.balancefactor = newroot.balancefactor max(rotroot.balancefactor, 0) w ostatnich dwóch liniach metody rotateleft zmieniliśmy współczynniki zrównoważenia nowego i poprzedniego korzenia ponieważ pozostałe ruchy przesuwają całe poddrzewa, pozostałe współczynniki nie ulegają zmianie rozważmy rotację w lewo jak na powyższym rysunku B i D to rotowane elementy, reszta to ich poddrzewa niech h_x opisuje wysokość poddrzewa o korzeniu w węźle x z definicji mamy \begin{eqnarray} newbal(b) & = & h_a - h_c \\ oldbal(b) & = & h_a - h_d \end{eqnarray} wysokość węzła to dłuższa z wysokości jego poddrzew zwiększona o 1: h_d = 1 + \max (h_c,h_e) oldbal(b) = h_a - (1 + \max(h_c,h_e)) odejmując równania na nowy i stary współczynnik dla węzła B otrzymamy \begin{split}newbal(b) - oldbal(b) = h_a - h_c - (h_a - (1 + \max(h_c,h_e))) \\ newbal(b) - oldbal(b) = h_a - h_c - h_a + (1 + \max(h_c,h_e)) \\

15 newbal(b) - oldbal(b) = h_a - h_a \max(h_c,h_e) - h_c \\ newbal(b) - oldbal(b) = 1 + \max(h_c,h_e) - h_c\end{split} korzystamy z własności \max (a,b) - c = \max(a-c,b-c) ostatecznie otrzymamy \begin{split}newbal(b) = oldbal(b) \max(0, -oldbal(d)) \\ newbal(b) = oldbal(b) \min(0, oldbal(d)) \\\end{split} innymi słowy nie musimy wyliczać wysokości poddrzew, żeby zaktualizować współczynniki wyważenia węzła B podobny wywód można przeprowadzić dla węzła D z rotacją związany jest jeszcze jeden problem: współczynnik węzła wynosi -2, więc powinniśmy rotować w lewo wtedy otrzymamy jednak potrzebujemy dodatkowych warunków: jeśli poddrzewo wymaga rotacji w lewo (współczynnik korzenia mniejszy od 0), sprawdź współczynnik prawego dziecka: jeśli dziecko ma współczynnik większy od zera (dłuższa lewa gałąź), rotuj w prawo względem prawego dziecka, a następnie w lewo względem korzenia jeśli poddrzewo wymaga rotacji w prawo (współczynnik korzenia większy od 0), sprawdź współczynnik lewego dziecka: jeśli dziecko ma współczynnik mniejszy od zera (dłuższa prawa gałąź), rotuj w lewo względem lewego dziecka, a następnie w prawo względem korzenia

16 In [10]: class AVLTree(BinarySearchTree): def _put(self,key,val,currentnode): if key < currentnode.key: if currentnode.hasleftchild(): self._put(key,val,currentnode.leftchild) currentnode.leftchild = TreeNode(key,val,parent=currentNode) self.updatebalance(currentnode.leftchild) if currentnode.hasrightchild(): self._put(key,val,currentnode.rightchild) currentnode.rightchild = TreeNode(key,val,parent=currentNode) self.updatebalance(currentnode.rightchild) def updatebalance(self,node): if node.balancefactor > 1 or node.balancefactor < -1: self.rebalance(node) return if node.parent!= None: if node.isleftchild(): node.parent.balancefactor += 1 elif node.isrightchild(): node.parent.balancefactor -= 1 if node.parent.balancefactor!= 0: self.updatebalance(node.parent) def rotateleft(self,rotroot): newroot = rotroot.rightchild #keep track of the new root rotroot.rightchild = newroot.leftchild # right child of the old root replaced with the left child of the new if newroot.leftchild!= None: newroot.leftchild.parent = rotroot newroot.parent = rotroot.parent if rotroot.isroot(): self.root = newroot if rotroot.isleftchild(): # if the old root is a left child then we change the pa rent rotroot.parent.leftchild = newroot # of the left child to point to the new root; otherwise we # change the parent of the right child to point rotroot.parent.rightchild = newroot # to the new root newroot.leftchild = rotroot rotroot.parent = newroot rotroot.balancefactor = rotroot.balancefactor min(newroot.balancefactor, 0) #aktualizacja wspó łczynnika newroot.balancefactor = newroot.balancefactor max(rotroot.balancefactor, 0) def rebalance(self,node): if node.balancefactor < 0: if node.rightchild.balancefactor > 0: self.rotateright(node.rightchild) self.rotateleft(node) self.rotateleft(node) elif node.balancefactor > 0: if node.leftchild.balancefactor < 0: self.rotateleft(node.leftchild) self.rotateright(node) self.rotateright(node)

17 po wstawieniu nowego elementu jako liścia aktualizacja współczynników wszystkich przodków to co najwyżej log_2(n) operacji (jedna na każdym poziomie) co najwyżej dwie rotacje, aby przywrócić zrównoważenie rotacje są klasy O(1) \Rightarrow put pozostaje klasy O(\log_2 n) metody get i in są takie same, jak dla drzew BST metoda del również będzie wymagała rotacji, jednak podobnie jak w przypadku put jej złożoność czasowa nie zmieni się w stosunku do drzew BST Implementacja tablicy asocjacyjnej (mapy) - podsumowanie Operacja Lista posortowana Tablica hashująca Drzewa binarne Drzewa AVL put O(n) O(1) O(n) O(log_2 n) get O(log_2n) O(1) O(n) O(log_2n) in O(log_2n) O(1) O(n) O(log_2n) del O(n) O(1) O(n) O(log_2n)

18 Drzewa czerwono-czarne samoorganizujące się drzewo binarne poszukiwań wynalezione przez Rudolfa Bayera w 1972 r (jako symetryczne binarne B-drzewa) używane najczęściej do implementacji tablic asocjacyjnych skomplikowane w implementacji niska złożoność obliczeniowa elementarnych operacji z każdym węzłem powiązany jest dodatkowy atrybut - kolor, który może być czerwony lub czarny oprócz typowych własności drzew BST wprowadzono kolejne wymagania: 1. każdy węzeł jest czerwony albo czarny 2. korzeń jest czarny 3. każdy liść jest czarny (można traktować nil jako liść) 4. jeśli węzeł jest czerwony, to jego synowie muszą być czarni 5. każda ścieżka z ustalonego węzła do liścia liczy tyle samo czarnych węzłów wymagania te gwarantują, że najdłuższa ścieżka od korzenia do liścia będzie co najwyżej dwukrotnie dłuższa niż najkrótsza: 1. Zgodnie z własnością 4, żadna ścieżka nie zawiera dwóch czerwonych węzłów z rzędu, jednak może zawierać czarne. Stąd najkrótsza ścieżka od węzła X zawiera wyłącznie n czarnych węzłów. 2. Zgodnie z własnością 5, druga ścieżka wychodząca z węzła X musi zawierać także n czarnych węzłów. Jedynym sposobem, aby miała ona inną łączną długość, jest umieszczenie pomiędzy każdą parą węzłów czarnych węzła czerwonego. 3. Zgodnie z własnością 3, liść kończący obie ścieżki musi być czarny. Jeżeli węzeł X jest czarny, wtedy w ścieżce możemy rozmieścić co najwyżej n-1 węzłów czerwonych, w przeciwnym zaś razie będziemy mieli w niej n czerwonych węzłów (wliczając w to sam X). dla n węzłów głębokość drzewa czerwono-czarnego h wyniesie najwyżej 2 \log (n+1), przez co elementarne operacje będą wykonywać się w czasie O(\log n) podobnie, jak drzewa AVL wymagają rotacji węzłów celem przywrócenia własności pesymistyczna złożonośc czasowa jest taka sama jak drzew AVL, jednak drzewa AVL są bardziej wydajne przy powtarzających się wyszukiwaniach (

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Algorytmy i Struktury Danych, 9. ćwiczenia

Algorytmy i Struktury Danych, 9. ćwiczenia Algorytmy i Struktury Danych, 9. ćwiczenia 206-2-09 Plan zajęć usuwanie z B-drzew join i split na 2-3-4 drzewach drzepce adresowanie otwarte w haszowaniu z analizą 2 B-drzewa definicja każdy węzeł ma następujące

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

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

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

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

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

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

Wykład 8 - Drzewa i algorytmy ich przetwarzania

Wykład 8 - Drzewa i algorytmy ich przetwarzania 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)

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

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

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

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

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

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. 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

< 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

. 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

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

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

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

Algorytmy i Struktury Danych. (c) Marcin Sydow. Słownik. Tablica mieszająca. Słowniki. Słownik uporządkowany. Drzewo BST.

Algorytmy i Struktury Danych. (c) Marcin Sydow. Słownik. Tablica mieszająca. Słowniki. Słownik uporządkowany. Drzewo BST. i Zawartość wykładu definicja słownika analiza naiwnych implementacji słownika tablice mieszające własności funkcji mieszającej analiza operacji słownika zaimplementowanych na tablicy mieszającej sposoby

Bardziej szczegółowo

Drzewa AVL definicje

Drzewa AVL definicje Drzewa AVL definicje Uporzadkowane drzewo binarne jest drzewem AVL 1, jeśli dla każdego wez la różnica wysokości dwóch jego poddrzew wynosi co najwyżej 1. M D S C H F K Z typowe drzewo AVL minimalne drzewa

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

Analiza algorytmów zadania podstawowe

Analiza algorytmów zadania podstawowe Analiza algorytmów zadania podstawowe Zadanie 1 Zliczanie Zliczaj(n) 1 r 0 2 for i 1 to n 1 3 do for j i + 1 to n 4 do for k 1 to j 5 do r r + 1 6 return r 0 Jaka wartość zostanie zwrócona przez powyższą

Bardziej szczegółowo

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie. Sortowanie Dane wejściowe: ciąg n-liczb (kluczy) (a 1, a 2, a 3,..., a n 1, a n ) Dane wyjściowe: permutacja ciągu wejściowego (a 1, a 2, a 3,..., a n 1, a n) taka, że a 1 a 2 a 3... a n 1 a n. Będziemy

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

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

Podstawy Informatyki Metody dostępu do danych

Podstawy Informatyki Metody dostępu do danych Podstawy Informatyki Metody dostępu do danych alina.momot@polsl.pl http://zti.polsl.pl/amomot/pi Plan wykładu 1 Wprowadzenie Czym zajmuje się informatyka 2 Wprowadzenie Podstawowe problemy baz danych Struktury

Bardziej szczegółowo

Algorytmy i struktury danych Struktury danych IS/IO, WIMiIP

Algorytmy i struktury danych Struktury danych IS/IO, WIMiIP Algorytmy i struktury danych Struktury danych IS/IO, WIMiIP Danuta Szeliga AGH Kraków Spis treści I 1 Wstęp Pojęcia podstawowe Abstrakcyjne typ danych Statyczna/dynamiczna struktura danych 2 Statyczne

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

Algorytmy i struktury danych Struktury danych - drzewa IS/IO, WIMiIP

Algorytmy i struktury danych Struktury danych - drzewa IS/IO, WIMiIP Algorytmy i struktury danych Struktury danych - drzewa IS/IO, WIMiIP Danuta Szeliga AGH Kraków Drzewo Drzewo (tree) Drzewo jest hierarchiczną strukturą danych. Def. Drzewo jest to zbiór T jednego lub więcej

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

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

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

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

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

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

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

Definicja pliku kratowego

Definicja pliku kratowego Pliki kratowe Definicja pliku kratowego Plik kratowy (ang grid file) jest strukturą wspierająca realizację zapytań wielowymiarowych Uporządkowanie rekordów, zawierających dane wielowymiarowe w pliku kratowym,

Bardziej szczegółowo

AiSD zadanie drugie. Gliwiński Jarosław Marek Kruczyński Konrad Marek Grupa dziekańska I5. 10 kwietnia 2008

AiSD zadanie drugie. Gliwiński Jarosław Marek Kruczyński Konrad Marek Grupa dziekańska I5. 10 kwietnia 2008 AiSD zadanie drugie Gliwiński Jarosław Marek Kruczyński Konrad Marek Grupa dziekańska I5 10 kwietnia 2008 1 Wstęp W nowym zadaniu porównywano efektywność kilku operacji na dwóch różnie zorganizowanych

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

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

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane Algorytmy i struktury danych Wykład 4 Tablice nieporządkowane i uporządkowane Tablice uporządkowane Szukanie binarne Szukanie interpolacyjne Tablice uporządkowane Szukanie binarne O(log N) Szukanie interpolacyjne

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 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

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

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

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Modelowanie hierarchicznych struktur w relacyjnych bazach danych Modelowanie hierarchicznych struktur w relacyjnych bazach danych Wiktor Warmus (wiktorwarmus@gmail.com) Kamil Witecki (kamil@witecki.net.pl) 5 maja 2010 Motywacje Teoria relacyjnych baz danych Do czego

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

Algorytmy i struktury danych

Algorytmy i struktury danych Algorytmy i struktury danych ĆWICZENIE 2 - WYBRANE ZŁOŻONE STRUKTURY DANYCH - (12.3.212) Prowadząca: dr hab. inż. Małgorzata Sterna Informatyka i3, poniedziałek godz. 11:45 Adam Matuszewski, nr 1655 Oliver

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

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

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

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

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

Przykładowe B+ drzewo

Przykładowe B+ drzewo Przykładowe B+ drzewo 3 8 1 3 7 8 12 Jak obliczyć rząd indeksu p Dane: rozmiar klucza V, rozmiar wskaźnika do bloku P, rozmiar bloku B, liczba rekordów w indeksowanym pliku danych r i liczba bloków pliku

Bardziej szczegółowo

Strategia "dziel i zwyciężaj"

Strategia dziel i zwyciężaj Strategia "dziel i zwyciężaj" W tej metodzie problem dzielony jest na kilka mniejszych podproblemów podobnych do początkowego problemu. Problemy te rozwiązywane są rekurencyjnie, a następnie rozwiązania

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

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

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

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

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

Bazy danych - BD. Indeksy. Wykład przygotował: Robert Wrembel. BD wykład 7 (1)

Bazy danych - BD. Indeksy. Wykład przygotował: Robert Wrembel. BD wykład 7 (1) Indeksy Wykład przygotował: Robert Wrembel BD wykład 7 (1) 1 Plan wykładu Problematyka indeksowania Podział indeksów i ich charakterystyka indeks podstawowy, zgrupowany, wtórny indeks rzadki, gęsty Indeks

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

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

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

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

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to wprowadzili J. Hartmanis i R. Stearns. Najczęściej przez zasób rozumie się czas oraz pamięć dlatego

Bardziej szczegółowo

Sztuczna Inteligencja i Systemy Doradcze

Sztuczna Inteligencja i Systemy Doradcze Sztuczna Inteligencja i Systemy Doradcze Przeszukiwanie przestrzeni stanów algorytmy ślepe Przeszukiwanie przestrzeni stanów algorytmy ślepe 1 Strategie slepe Strategie ślepe korzystają z informacji dostępnej

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

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) 20.11.2002 Algorytmy i Struktury Danych PIŁA ZŁOŻONE STRUKTURY DANYCH C za s tw or ze nia s tr uk tur y (m s ) TWORZENIE ZŁOŻONYCH STRUKTUR DANYCH: 00 0

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

Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych

Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych 1 Algorytm obejścia drzewa poszukiwań i zadanie o hetmanach szachowych Alexander Denisjuk Prywatna Wyższa Szkoła Zawodowa w Giżycku

Bardziej szczegółowo

Bazy danych. Andrzej Łachwa, UJ, /15

Bazy danych. Andrzej Łachwa, UJ, /15 Bazy danych Andrzej Łachwa, UJ, 2013 andrzej.lachwa@uj.edu.pl www.uj.edu.pl/web/zpgk/materialy 15/15 PYTANIA NA EGZAMIN LICENCJACKI 84. B drzewa definicja, algorytm wyszukiwania w B drzewie. Zob. Elmasri:

Bardziej szczegółowo

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli) Wykład 7 Abstrakcyjne typy danych słownik (lista symboli) Definicja słownika: Słownik (tablica lub lista symboli) to struktura danych zawierająca elementy z kluczami, która pozwala na przeprowadzanie dwóch

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania Rekurencja, metoda dziel i zwyciężaj Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk(Wydział Fizyki) WP w. VIII Jesień 2014 1 / 27 Rekurencja Recursion See Recursion. P. Daniluk(Wydział

Bardziej szczegółowo

Distributed Hash Tables i ich zastosowania

Distributed Hash Tables i ich zastosowania Distributed Hash Tables i ich zastosowania Seminarium z Systemów Rozproszonych, 2005/2006 Spis treści 1 Czym sa DHT? Typowe zastosowania 2 3 Sieci P2P Cooperative File System Czym sa DHT? Typowe zastosowania

Bardziej szczegółowo