Algorytmy i struktury danych
|
|
- Łukasz Sebastian Podgórski
- 6 lat temu
- Przeglądów:
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:
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ółowoWykł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ółowoWysokość 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ółowoZASADY 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ółowoDrzewa 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ółowoPodstawy 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ółowoPorzą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ółowoWykł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ółowoDrzewa 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ółowoWykł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ółowoStruktury 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ółowoWSTĘ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ółowoPrzypomnij 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ółowoAlgorytmy 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ółowoAlgorytmy 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ółowoWykł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ółowoAlgorytmy 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ółowoUniwersytet 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ółowoKoszt 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ółowoKaż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ółowoAlgorytmy 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ółowoPodstawy 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ółowoDrzewa 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ółowoAlgorytmy 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ółowoALGORYTMY 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ółowoDrzewa 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ółowoWykł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ółowoKolejka 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ółowoAlgorytmy 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ółowoSortowanie 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ółowoWykł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ółowoListy, 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ółowoWykł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ółowoTadeusz 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ółowoWyszukiwanie 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ółowoAlgorytmy 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ółowoDrzewa 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ółowoAlgorytmy 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 >
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 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ółowoprowadzą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ółowoTeoretyczne 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ółowoDrzewa 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ółowoAlgorytmy 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ółowoDrzewa 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ółowoWstę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ółowoAnaliza 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ółowoZadanie 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ółowoTeoretyczne 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ółowoProgramowanie 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ółowoPodstawy 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ółowoAlgorytmy 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ółowoProgramowanie 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ółowoAlgorytmy 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ółowoLista 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ółowoSortowanie. 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ółowoALGORYTMY 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ółowoDrzewa 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ółowoAlgorytmy 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ółowoliniowa - 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ółowoWykł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ółowoDefinicja 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ółowoAiSD 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 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ółowo2012-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ółowoAlgorytmy 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ółowoALGORYTMY 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ółowoWykł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ółowoWstę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ółowoSortowanie. 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ółowoModelowanie 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ółowoIndeksy. 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ółowoAlgorytmy 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ółowoKompresja 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ółowoStruktury 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ółowoMetody 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ółowoSTRUKTURY 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ółowoStos 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ółowoPrzykł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ółowoStrategia "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ółowoDrzewo 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ółowoWykł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ółowoOgó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ółowoBAZY 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ółowoProgramowanie 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ółowoBazy 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ółowoPODSTAWY 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ółowododatkowe 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ółowoWstę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ółowoGrafy (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ółowoZł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ółowoSztuczna 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ółowoTEORETYCZNE 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ółowoOSTASZEWSKI 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ółowoMatematyka 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ółowoAlgorytm 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ółowoBazy 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ółowoWykł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ółowoWstę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ółowoDistributed 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