Drzewa wielokierunkowe trie

Podobne dokumenty
Drzewa AVL definicje

Drzewa podstawowe poj

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

Tablice hashowe. indeksowana

Informatyka 1. Przetwarzanie tekstów

Algorytmy i Struktury Danych

Algorytmy i struktury danych. wykład 5

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

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

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

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Algorytmy i struktury danych

Paradygmaty programowania. Paradygmaty programowania

Teoretyczne podstawy informatyki

Drzewa poszukiwań binarnych

Wstęp do programowania. Różne różności

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

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

Porządek symetryczny: right(x)

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

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

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Sortowanie bąbelkowe

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

Algorytmy i struktury danych

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

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

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

Teoretyczne podstawy informatyki

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

Podstawy programowania

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

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

Podstawy Informatyki. Metody dostępu do danych

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

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

Algorytmy i struktury danych

OPERACJE NA PLIKACH. Podstawowe pojęcia:

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Tadeusz Pankowski


WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

Funkcje systemu Unix

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

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

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

PODSTAWY INFORMATYKI wykład 6.

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

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

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:

Sortowanie. Bartman Jacek Algorytmy i struktury

Abstrakcyjne struktury danych - stos, lista, drzewo

Grzegorz Mazur. Zak lad Metod Obliczeniowych Chemii UJ. 14 marca 2007

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

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

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

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Wyk lad 7: Drzewa decyzyjne dla dużych zbiorów danych

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Struktury danych (I): kolejka, stos itp.

Tablice i funkcje. Marcin Makowski. 26 listopada Zak lad Chemii Teoretycznej UJ

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

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

ALGORYTMY I STRUKTURY DANYCH

Lista 5 Typy dynamiczne kolejka

Podstawy Informatyki. Wykład 6. Struktury danych

Informatyka I. Wyk lad II Algorytm, podstawowe notacje, typy danych i wyrażenia

Przykładowe B+ drzewo

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

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

Informatyka I. Wykład 4. Tablice. Dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Wprowadzenie do programowania współbieżnego

Programowanie w VB Proste algorytmy sortowania

Rozdzia l 3. Laboratorium 3. danych zawierajac

INSTYTUT BADAŃ SYSTEMOWYCH PAN WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI WARSZAWSKIEJ. Algorytmy. i podstawy programowania

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

Java Collections Framework

TEORETYCZNE PODSTAWY INFORMATYKI

P. Urzyczyn: Materia ly do wyk ladu z semantyki. Uproszczony 1 j. ezyk PCF

Drzewa poszukiwań binarnych

Listy, kolejki, stosy

Podstawy programowania skrót z wykładów:

TEORETYCZNE PODSTAWY INFORMATYKI

Plan wyk ladu. Kodowanie informacji. Systemy addytywne. Definicja i klasyfikacja. Systemy liczbowe. prof. dr hab. inż.

Wstęp do programowania 2

Analiza algorytmów zadania podstawowe

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Wykład 4. Tablice. Pliki

Informatyka 1. Procedury i funkcje, struktura programu w Pascalu

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

Zmienne dynamiczne. nazwy; odwo lania do nich sa za pomoca być tworzone jawnie procedura zmienne dynamiczne maja

Poprawność semantyczna

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

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

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

Funkcje i instrukcje języka JavaScript

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

Transkrypt:

Drzewa wielokierunkowe trie Do zastosowań, w których kluczem sa napisy znakowe (stringi), takich jak na przyk lad budowa s lowników, przydatne sa specjalnego rodzaju drzewa, zwane tries. (Nie ma przyjetego polskiego odpowiednika tej nazwy). Tries sa drzewami uporzadkowanymi i wielokierunkowymi, czyli o rzedzie 2. W wez lach drzewa przechowywane sa pojedyncze znaki, a napisy odczytuje sie w ścieżkach drzewa biegnacych od korzenia. Dla s lów (stringów) zbudowanych z liter lacińskiego alfabetu, drzewa trie bed a mia ly rzad 26. Dla alfabetu polskiego rzad wyniesie 35. Przyk ladowe trie dla s lów: ja, ty, oko, on, ona, one, oni - F n 0 3 j F o F t F n 1 n 2 n 3 a T k F n T y T n 4 n 5 n 6 n 7 o T n 8 a T n 9 e T n 10 i T n 11 Drzewa trie 1

W oczywisty sposób, czas dostepu do każdego s lowa przechowywanego na takim drzewie, mierzony liczba porównań kolejnych liter, jest proporcjonalny do, i ograniczony d lugościa, najd luższego przechowywanego s lowa. Ponieważ dla wiekszości zastosowań istnieje maksymalna d lugość stringa, niezależnie od ich liczby, z punktu widzenia miary z lożoności obliczeniowej jest to procedura o sta lym czasie wykonania, czyli O(1). Widzimy wiec, że trie sa bardzo sprawnymi strukturami do szybkiego sprawdzania zbiorów s lów (ich wystepowania, i w lasności). Algorytmy tworzenia i modyfikacji drzew trie sa trywialne i polegaja, oprócz dodawania w razie potrzeby wez lów do drzewa, na ustawianiu i kasowaniu flag logicznych decydujacych o tym, czy w danym weźle jest zakończenie poprawnego stringa czy nie. Jak sie okazuje, pewne znaczenie ma za to zastosowany typ danych. Drzewa trie 2

Drzewa trie reprezentacja Deklaracja struktury danych dla takich drzew mog laby mieć postać wykorzystujac a podobny jak dla B-drzew mechanizm tablicy wskaźników do poddrzew: TYPE Trie = ^TrieElem; TrieElem = RECORD Znak: T_Info; Slowo: BOOLEAN; Potomki: ARRAY[ a.. z ] OF Trie; END; j a o -... F 3... t... F... F o F... T k... F n... T y... T... T a... T e... T i... T Drzewa trie 3

Drzewa trie wymagania pami eciowe Reprezentacja drzewa z wykorzystaniem tablicy wskaźników jest jednak wyjatkowo niekorzystna pamieciowo. Latwo obliczyć, że w dowolnym trie rzedu k bedzie k razy wiecej wskaźników niewykorzystanych, niż wykorzystanych, ponieważ wykorzystanych wskaźników jest tyle ile wez lów drzewa (minus korzeń), natomiast każdy weze l ma k wskaźników. Na przyk lad, chcac zbudować s lownik z 200 tysiacami s lów, maksymalnie 16-znakowych, trie rzedu 35 mog loby zajmować, przy za lożeniu, że co drugi weze l reprezentuje s lowo (a co drugi tylko strukture drzewa), oko lo 400, 000 35 = 14 milionów wskaźników czyli dla 32-bitowego komputera ponad 50 megabajtów. To nie jest wielkość astronomiczna, ale pamietajmy, że 97% tego bed a zajmowa ly same puste wskaźniki. Jednocześnie 200 tysiecy s lów można zapisać na oko lo 2 megabajtach pamieci, zak ladajac średnia d lugość s lowa oko lo 9 znaków. Trie sa zatem bardzo nieoszczedne pod wzgledem zużycia pamieci. A raczej, nieoszczedna jest tablicowa reprezentacja struktury drzewa. Drzewa trie 4

Drzewa trie reprezentacja (cd.) Aby zaoszczedzić pamieć należy zastapić statycznie alokowane tablice strukturami dynamicznymi, czyli listami. W każdym weźle drzewa możemy umieścić liste wskaźników do jego poddrzew. Jednak zawartość informacyjna i wskaźniki do elementów niższego poziomu musza być zwiazane ze wskaźnikami do poddrzew, a nie ze wskaźnikiem do listy elementów danego wez la. Prowadzi to do drzewa z lożonego z dwóch rodzajów wez lów. TYPE Trie = ^TrieList; TrieList = ^TrieElem; TrieElem = RECORD Znak: T_Info; Slowo: BOOLEAN; Potomki: Trie; Sasiady: TrieList; END;. j F... a T NIL NIL. k F.... o T NIL NIL. a T NIL. o F.. n T NIL t F. NIL e T NIL.. y T NIL NIL i T NIL NIL Drzewa trie 5

Widać jednak, że powyższa struktura jest dziwna, ponieważ zarówno zawartość informacyjna jak i wiekszość struktury trie jest ulokowana w elementach. Dodatkowe wskaźniki sa zbedne i można sie ich pozbyć, otrzymujac prostsza i bardziej naturalna reprezentacje, zwana lewy-skrajny-potomek/prawy-sasiad. W tej reprezentacji zbedny jest również dotychczas pusty korzeń trie: TYPE Trie = ^TrieElem; TrieElem = RECORD Znak: T_Info; Slowo: BOOLEAN; Potomek, Sasiad: Trie; END; a T NIL NIL. o T NIL NIL j F.. k F.. o F. a T NIL.. n T NIL e T NIL. t F. NIL y T NIL NIL i T NIL NIL Drzewa trie 6

Stogi definicja Stogiem nazywamy kompletne drzewo binarne, w którym każdy weze l zawiera element o wartości nie mniejszej od wartości w obydwu jego poddrzewach. Drzewo binarne jest kompletne, jeśli zawiera na wszystkich poziomach pe lne ilości wez lów, z wyjatkiem najniższego poziomu, na którym elementy sa u lożone od lewej strony bez żadnych luk. 96 77 58 33 24 62 41 58 83 44 36 67 Stogi 7

Tablicowa reprezentacja stogu 2 N == indeks lewego poddrzewa elementu N 2 N + 1 == indeks prawego poddrzewa elementu N N 2 == indeks rodzica elementu N 96 [1] 77 [2] 58 [4] 33 [8] 24 [9] 62 [5] 83 [3] 44 [6] 41 [10] 58 [11] 36 [12] 67 [7] indeks 1 2 3 4 5 6 7 8 9 10 11 12 zawartość 96 77 83 58 62 44 67 33 24 41 58 36 Stogi 8

Dodawanie elementu: Tworzenie stogów 1. wmontuj element na najniższym poziomie stogu (lub poniżej, jeżeli najniższy poziom jest pe lny), na pierwszej wolnej pozycji od lewej, 2. jeśli wmontowany element jest wi ekszy od swojego poprzednika (rodzica), to zamień go z poprzednikiem i powtórz ten krok. Usuwanie elementu: 1. znajdź na stogu element do usuniecia, co może wymagać pe lnego przegladu stogu, ponieważ stóg nie ma uporzadkowania pozwalajacego dowolny element latwo odszukać, 2. zastap element do usuniecia skrajnie prawym elementem ostatniego (najniższego) poziomu stogu, ten element jest w pewnym sensie ostatnim elementem stogu, choć nie musi być najmniejszym, 3. sprawdź, czy element ostatni wstawiony w miejsce elementu usuwanego nie jest wiekszy od swojego poprzednika (rodzica), albo mniejszy od któregoś ze swoich poddrzew (potomków); jeśli tak, to zamień go z tym rodzicem lub potomkiem i powtórz ten krok. Stogi 9

Czy nastepuj aca tablica jest stogiem: 100 99 98 97 96 95 94 93 92 91 90 Szybki test a ta: 100 100 90 100 100 65 75 100 100 100 100 25 35 45 55 a ta: 10 20 25 50 60 30 40 75 85 35 a ta: 100 90 80 70 Dla tych z powyższych tablic, które nie sa stogami, czy potrafisz pokazać operacje przekszta lcajace je na stogi? Stogi 10

Operacje na stogach Dodawanie i usuwanie elementów sa dla stogów operacjami O(log N), podobnie jak dla drzew zrównoważonych. Istnieje ponadto procedura pozwalajaca dowolne kompletne drzewo binarne przekszta lcić na stóg za pomoca O(N) operacji propagacji. Zatem budujac stóg z N elementów op laca sie umieścić elementy na stogu w dowolnym porzadku, a nastepnie zamienić tak powsta le drzewo na stóg. W ten sposób otrzymamy N-elementowy stóg w O(N) krokach, ponieważ O(N) kroków zajmuje zarówno zbudowanie drzewa jak i zamiana drzewa na stóg. Natomiast zbudowanie stogu z każdorazowym przywracaniem w lasności stogu może w ogólności zajać O(N log N) kroków. Jednak ze stogami coś jest nie w porzadku. Wyszukiwanie elementu na stogu wypada tak źle jak na drzewach nieuporzadkowanych, o których stwierdziliśmy, że z tego powodu nie op laca sie ich używać. Gorzej, elementy na stogach moga sie powtarzać, bo uporzadkowanie jest nieostre. O co tu chodzi? Stogi 11

Klucz do zagadki daje spostrzeżenie, że pewne operacje wypadaja dla stogów rewelacyjnie. Na przyk lad, znajdowanie elementu najwiekszego jest zawsze natychmiastowe. Stogi sa po prostu struktura danych wyspecjalizowana. Nie nadaja sie zbyt dobrze do przechowywania elementów z uporzadkowaniem wed lug klucza identyfikujacego dany element, ale świetnie mog lyby sie nadać do przechowywania elementów ze wzgledu na ich ważność (priorytet). Zw laszcza jeśli bedzie nas interesować tylko znajdowanie elementu o najwyższym priorytecie, i wtedy nawet nie przeszkadza, jeśli priorytety bed a sie powtarzać. Tego typu strukture nazywamy kolejka priorytetowa. Stogi 12

Abstrakcyjne typy danych Kolejka priorytetowa jest struktura bardziej abstrakcyjna niż stóg. Można ja zdefiniować przez podanie zestawu operacji, które chcemy na niej wykonywać: wprowadź do struktury nowy element razem z jego priorytetem znajdź w strukturze element o najwyższym priorytecie usuń ze struktury element o najwyższym priorytecie Struktura danych, która definiujemy nie podajac jej rzeczywistej struktury, a tylko zestaw operacji, które bed a na niej wykonywane, nazywamy abstrakcyjnym typem danych (ADT). ADT sa ważnym pojeciem w informatyce, ponieważ wprowadzaja pożyteczny poziom abstrakcji, pozwalajacy specyfikować systemy informatyczne bez decydowania o konkretnych użytych strukturach danych, i zarazem daja programiście wolność wyboru struktury danych implementujacej zadany ADT. Stogi 13

Kolejki priorytetowe specyfikacja ADT FUNCTION UtworzKolejkeP ( VAR K: KolejkaP ): BOOLEAN; EXTERN; (* Tworzy i inicjuje kolejke priorytetowa w zmiennej K. *) (* Funkcja musi byc wywolana przed pierwszym uzyciem kolejki. *) (* Zwraca wartosc TRUE gdy wynik operacji pomyslny. *) FUNCTION DodajDoKolejkiP ( VAR K: KolejkaP ; E: TypElementu ; P: TypPriorytetu): BOOLEAN; EXTERN; (* Dodaje element E o priorytecie P do kolejke priorytetowa K. *) (* Zwraca wartosc TRUE gdy wynik operacji pomyslny. *) FUNCTION ZnajdzMaxKolejkiP ( K: KolejkaP ; VAR E: TypElementu): BOOLEAN; EXTERN; (* Znajduje i zwraca maksymalny element kolejke priorytetowa K.*) (* Zwraca wartosc TRUE gdy wynik operacji pomyslny. *) FUNCTION UsunMaxKolejkiP ( VAR K:KolejkaP ): BOOLEAN; EXTERN; (* Usuwa maksymalny element kolejki priorytetowej K. *) (* Zwraca wartosc TRUE gdy wynik operacji pomyslny. *) Stogi 14

Kolejki priorytetowe lepsze sformu lowanie FUNCTION DodajDoKolejkiP ( VAR K: KolejkaP ; E: TypElementu ; FUNCTION wyzszy(e1,e2:typelementu):boolean ): BOOLEAN; EXTERN; (* Dodaje element E do kolejki priorytetowej K. *) (* Zwraca wartosc TRUE gdy wynik operacji pomyslny. *) FUNCTION ZnajdzMaxKolejkiP ( K: KolejkaP ; VAR E: TypElementu ; FUNCTION wyzszy(e1,e2:typelementu):boolean ): BOOLEAN; EXTERN; (* Znajduje i zwraca maksymalny element kolejki priorytetowej K.*) (* Zwraca wartosc TRUE gdy wynik operacji pomyslny. *) FUNCTION UsunMaxKolejkiP ( VAR K: KolejkaP ; FUNCTION wyzszy(e1,e2:typelementu):boolean ): BOOLEAN; EXTERN; (* Usuwa maksymalny element kolejki priorytetowej K. *) (* Zwraca wartosc TRUE gdy wynik operacji pomyslny. *) Stogi 15

Stogi 16

Implementacja kolejek priorytetowych CONST MaxElement = 100; TYPE WskElementu = ^TypElementu; KolejkaP = ^Stog; Stog = RECORD Elementy: ARRAY[0..MaxElement] OF WskElementu; Dlugosc: 0..MaxElement; END; FUNCTION UtworzKolejkeP( VAR K: KolejkaP ) : BOOLEAN; NEW(K); K^.Dlugosc := 0; UtworzKolejkeP := TRUE {tworzenie zawsze sie udaje} END; {UtworzKolejkeP} Stogi 17

FUNCTION DodajDoKolejkiP ( VAR K: KolejkaP ; E: TypElementu ; FUNCTION wyzszy(e1,e2: TypElementu):BOOLEAN ): BOOLEAN; IF K^.Dlugosc >= MaxElement {sprawdzamy tylko przepelnienie} THEN WRITELN( DodajDoKolejkiP -- kolejka pelna ); DodajDoKolejkiP := FALSE; END ELSE K^.Dlugosc := K^.Dlugosc + 1; NEW(K^.Elementy[K^.Dlugosc]); {nowy element stogu} K^.Elementy[K^.Dlugosc]^ := E; {kopiujemy caly element} PropagacjaWGore(K^,K^.Dlugosc,wyzszy); {przywracamy wlasn.stogu} DodajDoKolejkiP := TRUE; END END; {DodajDoKolejkiP} Stogi 18

FUNCTION ZnajdzMaxKolejkiP ( K: KolejkaP ; VAR E: TypElementu ; FUNCTION wyzszy(e1,e2:typelementu):boolean ): BOOLEAN; {sprawdzamy tylko dlugosc kolejki, nie zas istnienie czy poprawnosc} IF K^.Dlugosc <= 0 THEN WRITELN( ZnajdzMaxKolejkiP -- kolejka pusta ); ZnajdzMaxKolejkiP := FALSE; END ELSE E := K^.Elementy[1]^; ZnajdzMaxKolejkiP := TRUE; END END; {ZnajdzMaxKolejkiP} Stogi 19

FUNCTION UsunMaxKolejkiP ( VAR K: KolejkaP ; FUNCTION wyzszy(e1,e2:typelementu):boolean ): BOOLEAN; {sprawdzamy tylko dlugosc kolejki, nie zas istnienie czy poprawnosc} IF K^.Dlugosc <= 0 THEN WRITELN( UsunMaxKolejkiP -- kolejka pusta ); UsunMaxKolejkiP := FALSE; END ELSE DISPOSE(K^.Elementy[1]); {wyrzucamy najstarszy elem} K^.Elementy[1] := K^.Elementy[K^.Dlugosc]; {zastepujemy go ostat} K^.Dlugosc := K^.Dlugosc - 1; {skracamy stog} PropagacjaWDol(K^,1,wyzszy); {i przywracamy wlasn.stogu} UsunMaxKolejkiP := TRUE; END END; {UsunMaxKolejkiP} Stogi 20

PROCEDURE PropagacjaWGore(VAR S: Stog; I: INTEGER; FUNCTION wyzszy(e1,e2:typelementu): BOOLEAN); { procedura propaguje I-ty element stogu S w gore } { az osiagnie on wlasciwa sobie pozycje } VAR rodzic: INTEGER; S.Elementy[0] := S.Elementy[I]; rodzic := I DIV 2; WHILE wyzszy(s.elementy[0]^,s.elementy[rodzic]^) DO S.Elementy[I] := S.Elementy[rodzic]; I := rodzic; rodzic := rodzic DIV 2; END; S.Elementy[I] := S.Elementy[0]; END; {PropagacjaWGore} Stogi 21

PROCEDURE PropagacjaWDol ( VAR S: Stog; I: INTEGER ; FUNCTION wyzszy(e1,e2: TypElementu): BOOLEAN); { procedura propaguje I-ty element stogu S w dol az osiagnie wlasciwa pozycje } VAR poddrzewo : INTEGER; koniec: BOOLEAN; S.Elementy[0] := S.Elementy[I]; poddrzewo := 2 * I; koniec := FALSE; WHILE NOT koniec DO IF poddrzewo > S.Dlugosc THEN koniec := TRUE ELSE {wpierw wybieramy poddrzewo o wyzszym priorytecie} IF poddrzewo < S.Dlugosc THEN IF wyzszy(s.elementy[poddrzewo+1]^, S.Elementy[poddrzewo]^) THEN poddrzewo := poddrzewo + 1; {sprawdzamy czy element ma byc zamieniony z poddrzewem} IF wyzszy(s.elementy[0]^, S.Elementy[poddrzewo]^) THEN koniec := TRUE ELSE S.Elementy[I] := S.Elementy[poddrzewo]; I := poddrzewo; poddrzewo := 2 * poddrzewo; END; END; S.Elementy[I] := S.Elementy[0]; END; {PropagacjaWDol} Stogi 22