Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

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

Algorytmy i Struktury Danych

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

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

PODSTAWY INFORMATYKI wykład 6.

Porządek symetryczny: right(x)

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Algorytmy i struktury danych. wykład 5

Algorytmy i struktury danych

Algorytmy i struktury danych

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

Struktury danych: stos, kolejka, lista, drzewo

Sortowanie - wybrane algorytmy

Kolejka Priorytetowa. Algorytmy i Struktury Danych. (c) Marcin Sydow. Kolejka priorytetowa. implementacja. Kopiec Binarny. Tablicowa.

Laboratoria nr 1. Sortowanie

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

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

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

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Teoretyczne podstawy informatyki

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

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Algorytmy i struktury danych

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

Programowanie w VB Proste algorytmy sortowania

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

ALGORYTMY I STRUKTURY DANYCH

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

2:8,7 3:9,4 / \ / \ / \ / \ 4:7,3 5:8 6:9,2 7:4

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

Drzewa poszukiwań binarnych

Sortowanie bąbelkowe

Tadeusz Pankowski

KOPCE KOLEJKI PRIORYTETOWE - PRZYPOMNIENIE KOPCE WYSOKOŚĆ KOPCA KOPCE I KOLEJKI PRIORYTETOWE PROJEKTOWANIE ALGORYTMÓW I METODY SZTUCZNEJ INTELIGENCJI

Wstęp do programowania

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

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

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

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:

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

Sortowanie. Bartman Jacek Algorytmy i struktury

Drzewa AVL definicje

Drzewa poszukiwań binarnych

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Teoretyczne podstawy informatyki

Algorytm selekcji Hoare a. Łukasz Miemus

Stos LIFO Last In First Out

ALGORYTMY I STRUKTURY DANYCH

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

Algorytmy i Struktury Danych.

Analiza algorytmów zadania podstawowe

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

Algorytmy i Struktury Danych

Laboratorium nr 7 Sortowanie

Krzysztof Jakubczyk. Zadanie 2

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

Podstawy Informatyki. Sprawność algorytmów

ALGORYTMY I STRUKTURY DANYCH

TEORETYCZNE PODSTAWY INFORMATYKI

TEORETYCZNE PODSTAWY INFORMATYKI

Podstawowe struktury danych

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

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Algorytmy i Struktury Danych.

Lista liniowa dwukierunkowa

Algorytmy i Struktury Danych, 9. ćwiczenia

Algorytmy i Struktury Danych

Podstawy Informatyki. Metody dostępu do danych

Algorytmy i struktury danych

Problem 1 prec f max. Algorytm Lawlera dla problemu 1 prec f max. 1 procesor. n zadań T 1,..., T n (ich zbiór oznaczamy przez T )

Struktury Danych i Złożoność Obliczeniowa

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

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

Wstęp do Programowania potok funkcyjny

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

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

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

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

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

wstęp do informatyki i programowania część testowa (25 pyt. / 60 min.)

Algorytmy przeszukiwania

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Efektywna metoda sortowania sortowanie przez scalanie

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

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

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Zasady analizy algorytmów

Laboratoria nr 1. Sortowanie

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Programowanie Proceduralne

Dynamiczne struktury danych

Przykładowe B+ drzewo

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

Teoretyczne podstawy informatyki

Algorytmy i struktury danych Matematyka III sem.

Sortowanie przez scalanie

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

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

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

Transkrypt:

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 operacje: (a) construct(q, S): utworzenie multi-zbioru S = {a_1,..a_n} dla danej listy q = [a_1,..,a_n]; (b) insert(x,s): S := S u {x}; (c) deletmax(s) - usunięcie z S największego elementu (dualną operacją jest deletemin(s): usunięcie z S najmniejszego elementu); (*) zakładamy Ŝe elementy zbioru S pochodzą z pewnego uniwersum U, które jest liniowo uporządkowane.

Strukturę danych będącą rozwiązaniem dynamicznego problemu sortowania nazywamy kolejką priorytetową. Elementarne implementacje kolejki priorytetowej: 1) lista nieuporządkowana, w której: construct ma złoŝoność O(n), insert - 0(1), deletemax - O(n); polecana wtedy, kiedy w ciągu wejściowym operacji jest duŝo operacji insert, a mało deletemax; 2) lista uporządkowana, w której: construct ma złoŝoność O(nlog n), insert - O(n), deletemax - 0(1); polecana wtedy, kiedy w ciągu wejściowym operacji jest duŝo operacji deletemax, a mało insert (na przykład O(log n)). 3) kopiec, dla którego operacja construct ma złoŝoność czasową O(n), insert i deletemax - O(logn).

Kopiec - drzewo binarne, w węzłach którego znajdują się elementy reprezentowanego multi-zbioru S i jest spełniony tzw. warunek kopca: jeśli węzeł x jest następnikiem węzła y, to key(x) <= key(y) Elementy są wpisane do węzłów kopca zgodnie z porządkiem kopcowym, a drzewo ma uporządkowanie kopcowe. Obserwacje: (a) w korzeniu kopca znajduje się największy element (bądź jeden z największych elementów, jeśli jest ich kilka); (b) na ścieŝkach w kopcu, od korzenia do liścia, elementy są uporządkowane w porządku nierosnącym.

Algorytm heapsort - algorytm sortowania przez kopcowanie, moŝna zapisać za pomocą operacji kolejki priorytetowej. Ogólny schemat algorytmu sortowania za pomocą kolejki priorytetowej: dana jest lista q = [a_1,...,a_n]; wykonaj: (a) construct(q, S); (b) powtórz n-1 razy deletemax(s).

Kopiec zupełny kopiec będący zupełnym drzewem binarnym, tzn. takim, w którym: wszystkie poziomy są wypełnione całkowicie, z wyjątkiem co najwyŝej ostatniego - spójnie wypełnionego od strony lewej. ZaleŜność między wysokością h a liczbą węzłów n w kopcu zupełnym jest następująca: 2 h - l < n <= 2 h+1 - l Czyli 2 h <= n < 2 h+1 Zatem: h = _logn_

RozwaŜmy numerację węzłów kopca zupełnego poziomami (od strony lewej do prawej). Z definicji kopca zupełnego jest ona spójna. Obliczmy numer poprzednika i następnika węzła o numerze k. Przykład: W kopcu, w którym kaŝdy węzeł wewnętrzny ma dwa następniki: j = 2k. Fakty: Następniki węzła k, gdy istnieją, mają numery2k i 2k+1. Poprzednik węzła k (róŝnego od korzenia) ma numer _ k/2_.

Operacja insert(x,s) - wstawienie elementu x do kopca zupełnego S, polega na: umieszczeniu x w pierwszym wolnym miejscu ostatniego poziomu (lub następnego poziomu, gdy ostatni poziom jest całkowicie wypełniony) i przywróceniu zachodzenia warunku kopca, jeśli wstawiony element jest większy niŝ element znajdujący się w poprzedniku. Aby przywrócić zachodzenie warunku kopca, idziemy w górę w stronę korzenia, szukając miejsca, gdzie pasowałby wstawiany element. Insert: wstawienie elementu do liścia i dokonywanie później na ścieŝce do korzenia zamian w celu przywrócenia zachodzenia warunku kopca - procedura pomocnicza upheap.

procedure upheap(k : in teger); var l, v : integer; begin v:= a[k]; a[0] := + ; l :=k div 2; {warunek kopca jest zaburzony co najwyŝej tylko dla v} while a[l] < v do begin {węzeł l jest poprzednikiem węzła k} a[k] := a[l]; k := l; l := l div 2 end; a[k] := v end upheap; procedure insert (v : integer); begin n:=n+l; a[n] := v; upheap(n) end insert; T(n) = O(logn)

Operacja deletemax(s) - usunięcie z kopca największego elementu, usuwamy ten element z korzenia, usuwamy prawy skrajny liść z ostatniego poziomu, element znajdujący się w tym liściu wstawiamy do korzenia. Po tym wstawieniu warunek kopca moŝe być zaburzony w jednym węźle, tym razem w korzeniu, wtedy: naleŝy tak opuścić w dół element wstawiony do korzenia, Ŝeby przywrócić zachodzenie warunku kopca.

procedure downheap(k : integer); label L; var i, i, v: integer; begin v:= a[k]; while k <= n div 2 do begin j := 2 * k; {j jest następnikiem k} if j < n then if a[j] < a[j + l] then j : = j + l ; if v >= a[j] then goto L; a[k] : = a[j]; k := j end; L: a[k]:= v end downheap;

function deletemax : integer; begin deletemax := a[1]; a[1] := a[n]; n := n - l; downheap(1) end deletemax; T(n) = 2 _ log n_ = O(log n)

Operacja construct. Realizowana za pomocą n operacji insert, to jej złoŝoność czasowa byłaby O(nlog n). MoŜna wykonać ją w czasie liniowym. Trzeba konstrukcję kopca rozpocząć od dołu drzewa, tworzyć małe podkopce i łączyć je w większe - aŝ do powstania całego kopca. ZałóŜmy, Ŝe kopce o korzeniach 2i i 2i + l zostały juŝ skonstruowane. Aby połączyć je i wstawić kolejny element x w węźle i, wystarczy wywołać downheap(i) (warunek kopca jest zaburzony tylko dla węzła i).

procedure construct; {elementy listy q= [a_1,...,a_n] znajdują się w tablicy a[1.. n]} var i : integer; begin for i : = n div 2 downto 1 do downheap (i) end construct; T(n) = O(n)

procedure heapsort; {a[l.. n] - lista do posortowania} var m,i : integer; begin m := n; construct; for i : = m downto 2 do ali] := deletemax n := m end heapsort T(n) = 2nlog n + O(n) A(n) -? S(n) = O(1) Jeśli kopiec reprezentujemy w tablicy, to kaŝdą operację z wyjątkiem Union moŝna wykonać w czasie O(log n). DRZEWA TURNIEJOWE kolejny wykład