ALGORYTMY I STRUKTURY DANYCH

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

Algorytmy i struktury danych. wykład 5

Struktury danych: stos, kolejka, lista, drzewo

Podstawy Informatyki. Wykład 6. Struktury danych

Algorytmy i Struktury Danych

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

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY I STRUKTURY DANYCH

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

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

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

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

ALGORYTMY I STRUKTURY DANYCH

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

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Algorytmy sortujące i wyszukujące

Struktury danych (I): kolejka, stos itp.

Algorytmy i struktury danych

Struktury Danych i Złożoność Obliczeniowa

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

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

Sortowanie. Bartman Jacek Algorytmy i struktury

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

Porządek symetryczny: right(x)

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

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

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

PODSTAWY INFORMATYKI wykład 5.

Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie)

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

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

Wstęp do programowania

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

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Abstrakcyjne struktury danych - stos, lista, drzewo

Analiza algorytmów zadania podstawowe

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

Algorytmy i Struktury Danych, 9. ćwiczenia

Listy, kolejki, stosy

Algorytmy i struktury danych

INFORMATYKA DANE.

Język programowania PASCAL

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

Podstawy Informatyki. Metody dostępu do danych

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

Laboratorium nr 7 Sortowanie

PODSTAWY INFORMATYKI wykład 10.

Lista, Stos, Kolejka, Tablica Asocjacyjna

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK

Sortowanie bąbelkowe

Typy danych. 2. Dane liczbowe 2.1. Liczby całkowite ze znakiem i bez znaku: 32768, -165, ; 2.2. Liczby rzeczywiste stało i zmienno pozycyjne:

Dynamiczne struktury danych

Programowanie obiektowe

Twój wynik: 4 punktów na 6 możliwych do uzyskania (66,67 %).

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

Programowanie w VB Proste algorytmy sortowania

Podstawy Informatyki Metody dostępu do danych

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

Stos LIFO Last In First Out

Obliczenia iteracyjne

Kompresja danych Streszczenie Studia Dzienne Wykład 10,

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

Rozdział 4. Algorytmy sortowania 73 Rozdział 5. Typy i struktury danych 89 Rozdział 6. Derekursywacja i optymalizacja algorytmów 147

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Tadeusz Pankowski

Teoretyczne podstawy informatyki

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

WSTĘP DO INFORMATYKI. Struktury liniowe

Definicja pliku kratowego

Sztuczna Inteligencja i Systemy Doradcze

Haszowanie. dr inż. Urszula Gałązka

Haszowanie (adresowanie rozpraszające, mieszające)

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

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Drzewa poszukiwań binarnych

Podstawowe struktury danych

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Literatura. 1) Pojęcia: złożoność czasowa, rząd funkcji. Aby wyznaczyć pesymistyczną złożoność czasową algorytmu należy:

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

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

Algorytmy i struktury danych. Wykład 4

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

Tablice z haszowaniem

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

1. Znajdowanie miejsca zerowego funkcji metodą bisekcji.

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

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

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

dr inŝ. Jarosław Forenc

dr inż. Jarosław Forenc

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

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Transkrypt:

ALGORYTMY I STRUKTURY DAYCH Temat 2: Typy i struktury danych. Modele danych oparte na drzewach. Wykładowca: dr inż. Zbigniew TARAPATA e-mail: Zbigniew.Tarapata@isi.wat.edu.pl http://www.tarapata.strefa.pl/p_algorytmy_i_struktury_danych/ Treść wykładu Typy proste Typy złożone Definicja struktury danych Liniowe struktury danych Tablice z haszowaniem Struktury drzewiaste Realizacje struktur 2

Proste typy danych Type T=(c 1,c 2,...,c n ) Moc typu T wartość funkcji moc(t)=n Type kształt= (prostokąt, kwadrat,elipsa,okrąg) Integer Boolean Char Real 3 Definicja struktury danych Definicja 2.1: Strukturą danych nazywamy trójkę uporządkowaną S=(D, R, e), gdzie: D oznacza zbiór danych elementarnych d i, i = 1,.., D (i jest indeksem poszczególnych danych), R={r we, } jest zbiorem dwóch relacji określonych na strukturze danych: r e Drelacja wejścia do struktury danych S, we { } relacja następstwa (porządkująca) strukturę S, D D e jest elementem wejściowym do struktury danych S (nie jest to dana wchodząca w skład struktury danych S). 4

Zbiór danych elementarnych D Jak widać z definicji struktury danych, zbiór danych elementarnych jest skończony i dla wygody operowania oznaczeniem jego elementów poszczególne dane są indeksowane od wartości 1 w kierunku wartości większych. Weźmy zatem dla przykładu pięcioelementową strukturę danych S. Zapis zbioru jej danych elementarnych może wyglądać następująco: D = { d 1, d 2, d 3, d 4, d 5 } Liczność zbioru danych elementarnych wynosi 5, co zapisujemy: D =5 5 Dana elementarna, zmienna programowa Dana elementarna d i jest pojęciem abstrakcyjnym, rozumianym jako tzw. nazwana wartość. Jest ona określana jako uporządkowana dwójka elementów: d = n, w i i i, gdzie: n i nazwa danej, w i aktualna wartość danej z określonej dziedziny wartości. Zmienna programowa jest pojęciem związanym z realizacją danej w konkretnym środowisku programistycznym. Posiada ona zdefiniowaną etykietę (nazwę zmiennej), wraz z określeniem dziedziny wartości, którą może przyjmować dana reprezentowana przez zmienną, a także zdefiniowaną dla tej dziedziny wartości dziedziną algorytmiczną. 6

Relacja r we wskazanie korzenia struktury S Relacja r we, jest opisywana poprzez jedno- lub wieloelementowy zbiór dwójek uporządkowanych elementów, z których pierwszym jest zawsze element wejściowy e, natomiast drugim elementem jest jedna z danych elementarnych ze zbioru D. W sytuacji opisanej powyżej mówimy, że element e należy do dziedziny relacji r we - Dz(r we ), dana d i należy do przeciwdziedziny r we PDz(r we ) Element (elementy) należące do PDz(r we ) są nazywane korzeniem (korzeniami) struktury danych S. Struktura musi mieć zdefiniowany co najmniej jeden korzeń. Przykład: Załóżmy, że struktura S posiada dwa korzenie, według opisu: r we = { e, d, e d } 2, 5 7 Relacja ustalenie porządku struktury S Relacja następstwa opisuje wzajemne uporządkowanie elementów w strukturze danych S. Porządek struktury opisujemy w postaci zestawów dwójek uporządkowanych elementów. Przykład: Opiszmy porządek naszej pięcioelementowej struktury danych S: { } = d2, d1, d1, d3, d1, d4, d3, d4, d5, d3 UWAGA: Korzenie struktury S nie mogą być elementami należącymi poprzednik następnik do PDz() 8

Model grafowy struktury danych Aby łatwiej zobrazować strukturę danych i w ten sposób lepiej ją zrozumieć, można zbudować dla niej model grafowy. W modelu tym: węzły (kółka) oznaczają poszczególne dane elementarne, łuki (strzałki) służą do odwzorowania następstw poszczególnych danych elementarnych w strukturze S. Przykład: Model grafowy dla opisywanej do tej pory struktury S: e d 2 d 5 d 3 korzeń liść D= d r we = { 1, d 2, d 3, d 4, d 5 } { e, d, e d } 2, 5 korzeń d 1 d 4 = { d, d, d, d, d, d, d, d, d d } 2 1 1 3 1 4 3 4 5, 3 9 Definicja liniowej struktury danych Definicja 2.2: Liniową strukturą danych nazywamy strukturę danych S=(D, R, e), w której relacja porządkująca opisuje powiązania pomiędzy elementami odpowiednio dla poszczególnych rodzajów list. Wyróżniamy cztery rodzaje list (jednopoziomowych): jednokierunkowe listy niecykliczne dwukierunkowe listy niecykliczne jednokierunkowe listy cykliczne (pierścienie jednokierunkowe) dwukierunkowe listy cykliczne (pierścienie dwukierunkowe) 10

Jednokierunkowe listy niecykliczne Model grafowy listy jednokierunkowej: e d 1 d 2 d 3 d n Relacja następstwa dla listy jednokierunkowej L: L = = d L { :,, i = 1... 1} d d d, i i+ 1 i i+ 1 D D 11 Dwukierunkowe listy niecykliczne Model grafowy listy dwukierunkowej: e d 1 d 2 d 3 d n Relacja następstwa dla listy dwukierunkowej Ld: Ld L W = = = d L W {, :,, i = 1... } i 1 L d d d D D 1 i + 1 i i + 1 12

Pierścień jednokierunkowy Model grafowy pierścienia jednokierunkowego: e d 1 d 2 d 3 d n Relacja następstwa dla pierścienia jednokierunkowego P: { :,, n } d d d d D P = L n, 1 n 1 = D 13 Pierścienie dwukierunkowe Model grafowy pierścienia dwukierunkowego: e d 1 d 2 d 3 d n Relacja następstwa dla pierścienia dwukierunkowego Pd: PD Pw = = P 1 P Pw 14

Definicja tablicy rozproszonej (z haszowaniem) Definicja 2.3: Tablicą rozproszoną nazywamy trójkę uporządkowaną ( K, D h) T, =, gdzie K = {k 1, k 2, k 3,..., k n } - zbiór kluczy, D = {d 1, d 2, d 3,..., d n } - zbiór adresów, h - funkcja mieszająca (haszująca) zdefiniowana następująco: Tradycyjnym obszarem zastosowań tablic rozproszonych są zagadnienia związane z przetwarzaniem danych. h : K D 15 Tablice rozproszone, funkcja haszująca Zadaniem funkcji haszującej h jest w miarę równomierne obciążanie tablicy rozproszonej (jej komórek). Zagadnienie definiowania funkcji mieszającej jest istotne dla efektywności obliczeń realizowanych na bazie tablic rozproszonych. Ma to szczególnie duże znaczenie dla tablic rozproszonych przetwarzanych bezpośrednio w nośnikach zewnętrznych (taśmach, dyskach) ie można jednak wykluczyć powstawania tzw. konfliktów w tablicach rozproszonych. 16

Konflikty w tablicach rozproszonych Kolizją (konfliktem) w tablicy rozproszonej nazywamy sytuację powstałą wtedy, gdy: k i, k j K, k i k j ( h( ) = h( ) k Elementy k i, k j biorące udział w kolizji nazywamy synonimami Dużo więcej o listach i tablicach rozproszonych będziemy mówić na wykładzie 3 i 4 i k j 17 Drzewiaste struktury danych Definicja 2.4: Drzewiastą strukturą danych nazywamy strukturę danych S=(D, R, e), w której relacja porządkująca opisuje kolejne, rekurencyjne powiązania pomiędzy danymi elementarnymi drzewa, tworzącymi kolejne poddrzewa. Wniosek: Drzewo ze swojej natury jest strukturą hierarchiczną (rekurencyjną). iezwykle istotne jest tutaj odpowiednie przypisanie danych elementarnych ze zbioru D do kolejnych poziomów drzewa i opisanie porządku w relacji. 18

Drzewiaste struktury danych kilka pojęć podstawowych Korzeń drzewa jest tylko i wyłącznie jeden dla drzewa. Jest to dana wskazywana przez element wejściowy e, Liść drzewa jest to dana elementarna, która nie posiada swojego następnika w w sensie relacji, Stopień drzewa maksymalna liczba możliwych następników dla dowolnego elementu drzewa. ajczęściej przyjmuje się, że stopień drzewa jest potęgą liczby 2 (drzewa dwójkowe, czwórkowe, ósemkowe, szesnastkowe), Droga w drzewie kolejne łuki pomiędzy wskazanymi dwoma elementami drzewa, które trzeba pokonać, aby dojść od jednego elementu drzewa do innego Poziom drzewa elementy ułożone w tej samej odległości (długości drogi) od korzenia drzewa, Drzewo zupełne takie drzewo, którego wszystkie elementy (oprócz liści) mają taką liczbę następników, ile wynosi stopień drzewa 19 Przykład modelu grafowego drzewa dwójkowego (binarnego) e d1 poziom 1 d2 d4 poziom 2 d3 d5 d6 poziom 3 d7 d8 poziom 4 Dla powyższego drzewa: wskaż korzeń, liście, opisz zbiór D, relacje r we i 20

Rekurencja w drzewie lewe podrzewo e d1 prawe podrzewo d2 d4 prawe podrzewo prawego podrzewa d3 d5 d6 d7 d8 prawe podrzewo prawego podrzewa prawego podrzewa lewe podrzewo prawego podrzewa Dalsze informacje o drzewach będą treścią kolejnych wykładów. 21 Realizacje struktur danych Realizacje sekwencyjne (statyczne) - wtedy, gdy z góry znamy maksymalny rozmiar przetwarzanej struktury liniowej i z góry chcemy zarezerwować dla niej określony zasób (pamięć operacyjne, pamięć zewnętrzna. W czasie wytwarzania programów komputerowych bazujemy wtedy na zmiennych statycznych, Realizacje łącznikowe (dynamiczne) - wtedy, gdy rozmiar struktury nie jest z góry znany i w czasie jej przetwarzania może istnieć konieczność dodawania do niej nowych elementów lub ich usuwania. W czasie wytwarzania programów komputerowych bazujemy wtedy na zmiennych dynamicznych (wskaźnikowych), Realizacje łącznikowo-sekwencyjne (hybrydowe) -połączenie obu powyższych metod - wtedy gdy konieczny jest odpowiedni balans pomiędzy zmiennymi statycznymi i dynamicznymi 22

Przykłady liniowych struktur danych Definicja listy stanowi podstawę dla zdefiniowania struktury liniowej. Wszystkie przypadki struktur liniowych można zdefiniować bazując na ich odpowiednich reprezentacjach listowych Bazując na pojęciu listy powiemy sobie o innych liniowych strukturach danych, będą to: kolejki, stosy, napisy, tablice sekwencyjne tablice rzadkie tablice rozproszone (z haszowaniem). 23 Kolejki Kolejka (queue) jest strukturą danych wykorzystywaną najczęściej jako bufor przechowujący dane określonych typów. Dyscypliny kolejek: FIFO (First In First Out) - pierwszy element wchodzący staje się pierwszym wychodzącym Round-Robin - cykliczna kolejka z dyscypliną czasu obsługi komunikatu przechowywanego w kolejce (w systemach operacyjnych, sieciach komputerowych) LIFO (Last In First Out) - ostatni wchodzący staje się pierwszym wychodzącym (tak działa stos) kolejki priorytetowe - dodatkowo w standardowym mechanizmie kolejki uwzględnia się wartości priorytetów przechowywanych danych 24

Kolejki FIFO Dyscyplina First In First Out: We d 1 Wy We d 2 d 1 Wy We d 6 d 5 d 4 d 3 d 2 d 1 Wy 25 Stos (kolejka LIFO) Dyscyplina Last In First Out: We Wy d 1 We Wy d 2 d 1 We Wy d 6 d 5 d 4 d 3 d 2 d 1 26

apisy apis (ang. string) może byś realizowany na trzy sposoby: w postaci sekwencyjnej (np. tablica statyczna) w postaci łącznikowej (każdy znak jest oddzielnym elementem) listy dynamicznej, w postaci łącznikowo-sekwencyjnej (paczki napisów sekwencyjnych połączone łącznikami): e I F O R M A T Y K A. Łącznikowo - sekwencyjna realizacja napisu 27 Tablice sekwencyjne W praktyce programowania najczęściej spotykamy się z tablicami: jednowymiarowymi (wektory), dwuwymiarowymi (macierze) trójwymiarowymi (prostopadłościany) Bardzo często używa się pojęcia tablica dla określenia implementacji macierzy Liczna grupa metod numerycznych wykorzystuje pojęcie tablicy (ciągu, sekwencji liczb) Zajmiemy się teraz bardzo ważnymi dla praktyki programowania algorytmami sortowania tablic 28

Algorytmy sortowania tablic sekwencyjnych Omówimy ideę czterech algorytmów sortowania tablic (wg..wirth: Algorytmy + struktury danych = programy ): sortowanie przez wstawianie (ang. insertion sort) sortowanie przez wybieranie (selekcję) (ang. selection sort) sortowanie przez zamianę (ang. exchange sort). Sortowanie to nosi również nazwę sortowania bąbelkowego (ang. bubble sort), sortowanie mieszane (ang. shake sort) We wszystkich przypadkach, w których sortujemy rosnąco, posłużymy się następującym przykładem tablicy liczb naturalnych: Klucze początkowe 44 55 12 42 94 18 06 67 29 Sortowanie przez wstawianie K r o k i a l g o r y t m u Klucze początkowe i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 44 55 12 42 94 18 06 67 44 55 12 42 94 18 06 67 12 44 55 42 94 18 06 67 12 42 44 55 94 18 06 67 12 42 44 55 94 18 06 67 12 18 42 44 55 94 06 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 30

Sortowanie przez wybieranie K r o k i a l g o r y t m u Klucze początkowe i = 2 i = 3 i = 4 i = 5 i = 6 44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 12 55 42 94 18 44 67 06 12 18 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 31 Sortowanie przez zamianę (bąbelkowe) Klucze początkowe 44 i = 2 06 K r o k i i = 3 i = 4 06 06 a l g o r y t m u i = 5 i = 6 06 06 i = 7 06 i = 8 06 55 44 12 12 12 12 12 12 12 55 44 18 18 18 18 18 42 12 55 44 42 42 42 42 94 42 18 55 44 44 44 44 18 94 42 42 55 55 55 55 06 18 94 67 67 67 67 67 67 67 67 94 94 94 94 94 32

Sortowanie mieszane Klucze początkowe i = 2 44 06 K r o k i i = 3 06 a l g o r y t m u i = 4 06 06 55 44 44 12 12 12 55 12 44 18 42 12 42 18 42 94 42 55 42 44 18 94 18 55 55 06 18 67 67 67 67 67 94 94 94 33 Przykład implementacji algorytmu sortowania przez wybieranie iteracyjnie -język Pascal 1 2 3 4 5 6 7 8 9 10 12 21 44 51 11 2 34 56 43 8 od_el = 3 do_el = 7 sortowanie rosnąco elementów w przedziale tablicy: 1. dla każdego elementu począwszy od numeru od_el aż do numeru do_el - 1: 1.1. znajdź najmniejszy z pozostałych tzn. od_el+1, od_el+2,...,do_el 1.2. jeśli znaleziony jest mniejszy od bieżącego: 1.2.1. zamień miejscami znaleziony z bieżącym 34

Przykład implementacji algorytmu sortowania przez wybieranie - iteracyjnie, cd. procedure sort _ros( var t ab : array[ 1.. ] of i nt eger; od_el,do_el : integer); var i,rob,pom: integer; 1) begi n f or i : = od_el t o do_el - 1 do begin 2) rob := nr_najm( t ab, i +1, do_el ) ; if tab[rob] < tab[i] then begin pom:= tab[rob]; 3) tab[rob] := tab[i]; tab[i] := pom; end; 4) end; end; IE procedura sort_ros tab[] od_el, do_el i od_el...do_el-1 rob nr_najm(tab, i+1,do_el) tab[rob]<tab[i] tab[rob] tab[i] STOP TAK 35 Przykład implementacji algorytmu sortowania przez wybieranie - iteracyjnie, cd. funkcja nr_najm tab [ ] od_el, do_el 1) rob od_el 2) i od_el +1... do_el 3) IE tab[i] < tab[rob] 4) rob i TAK 5) nr_najm rob 36

Przykład implementacji algorytmu sortowania przez wybieranie rekurencyjnie -język Pascal 1 2 3 4 5 6 7 8 9 10 12 21 44 51 11 2 34 56 43 8 od_el = 3 do_el = 7 sortowanie rekurencyjne malejąco elementów w przedziale tablicy: 1. dla elementu bieżącego znajdź największy z pozostałych tzn. od_el+1,...,do_el 2. jeśli znaleziony jest mniejszy od bieżącego: 2.1. zamień miejscami znaleziony z bieżącym 3. posortuj pozostałe tzn. od_el+1,...,do_el 37 Przykład implementacji algorytmu sortowania przez wybieranie - rekurencyjnie, cd. procedure sort_mal_rek(var tab : array[1..] of integer; od_el,do_el : integer); procedura sort_mal_rek var tab [ ] rob,pom : integer; od_el do_el begin if od_el < do_el then begin rob := nr_najw_rek(tab,od_el+1,do_el); if tab[rob] > tab[od_el] then 2) begin pom := tab[rob]; tab[rob] := tab[od_el]; tab[od_el] := pom; end; 4) sort_mal_rek(tab,od_el+1,do_el); end; end; 5) 1) od_el < do_el rob nr_najw_rek (tab, od_el +1 do_el) 3) tab[rob] > tab[od_el] tab[rob] tab [od_el] sort_mal_rek(tab, od_el + 1 do_el) IE IE STOP 38

Przykład implementacji algorytmu sortowania przez wybieranie - rekurencyjnie, cd. funkcja nr_najw_rek tab [] od_el, do_el 1) IE od_el < do_el TAK 2) rob nr_najw_rek (tab, od_el +1, do_el) 3) tab[rob] > tab[od_el] IE TAK 4) 5) nr_najw_rek rob nr_najw_rek od_el 6) nr_najw_rek od_el STOP 39 Przykład implementacji algorytmu sortowania przez wybieranie - złożona struktura danych const M_il_graczy = 10; type T_il_graczy = 0..M_il_graczy; T_pozycje = (srodkowy, skrzydlowy, rozgrywajacy); T_gracz = record imie, nazwisko : string; wzrost : integer; gra_jako : set of T_pozycje; end; T_lista_graczy = array [1..M_il_graczy] of T_gracz; T_druzyna = record ilosc : T_il_graczy; lista : T_lista_graczy; end; procedure sort_druzyny_ros (var d : T_druzyna; od_el, do_el : integer); var i, rob : integer; pom : T_gracz; begin if (od_el < d.ilosc) and (do_el <= d.ilosc) then begin for i := od_el to do_el-1 do begin rob := nr_najm_gracza (d, i+1, do_el); if d.lista[rob].wzrost < d.lista[i].wzrost then begin pom := d.lista[rob]; d.lista[rob] := d.lista[i]; d.lista[i] := pom; end; end; end; end; 40

Złożoność obliczeniowa algorytmów sortowania Sortowanie przez wstawianie P Omin = n - 1 P Rmin = 2 (n - 1) P Ośr = 0.25 (n 2 + n - 2) P Rśr = 0.25 (n 2 + 9n - 10) P Omax = 0.5 (n 2 + n) - 1 P Rmax = 0.5 (n 2 + 3n - 4) n - ilość elementów w tablicy, P Oi - liczba porównań klucza, P Ri - liczba przesunięć elementów w tablicy 41 Złożoność obliczeniowa algorytmów sortowania, cd. Sortowanie przez wybieranie P O = 0.5 (n 2 -n) P Rmin = 3 (n - 1) n - ilość elementów w tablicy, P Rśr = n (ln n + γ) γ = 0.577216... stała Eulera P Rmax = trunc (n 2 /4) + 3 (n - 1) P O - liczba porównań klucza ( niezależna od liczności elementów), P Ri - liczba przesunięć elementów w tablicy 42

Złożoność obliczeniowa algorytmów sortowania, cd. Sortowanie przez zamianę (bąbelkowe) P O = 0.5 (n 2 -n) P Rmin = 0 P Rśr = 0.75 (n 2 -n) P Rmax = 1.5 (n 2 -n) n - ilość elementów w tablicy, P O - liczba porównań klucza, P Ri - liczba przesunięć elementów w tablicy 43 Złożoność obliczeniowa algorytmów sortowania, cd. Sortowanie mieszane P Omin = n - 1 P Rmin = 0 P Ośr = 0.5 (n 2 -n (k 2 + ln n)) P Rśr = n - k 1 sqrt(n) n - ilość elementów w tablicy, k 1 - indeks poniżej którego tablica jest posortowana k 2 - indeks powyżej którego tablica jest posortowana P O - liczba porównań klucza, P Ri - liczba przesunięć elementów w tablicy 44

Pojęcie, zastosowania tablic rzadkich Tablice rzadkie są jednym z przypadków liniowych struktur danych. Ich cechą charakterystyczną jest to, że przechowują one jedynie tzw. wartości niezerowe, Po prostu pozycja tablicy z wartością zerową nie występuje (brak pozycji w macierzy oznacza wartość zerową), W tablicy są więc przechowywane wyłącznie wartości znaczące (tzn. różne od ustalonej z góry wartości domyślnej) Tablice rzadkie realizujemy wyłącznie w postaci łącznikowej (dynamiczne struktury danych) 45 Pojęcie, zastosowania tablic rzadkich, cd. Przykład realizacji tablic rzadkich (tablica dynamiczna): 0 0 0 1 IL 0 2 0 3 IL 0 K IL 1 0 IL 2 0 2.13 IL W 0 IL 0.01 IL -50.2 IL IL 46

Pojęcie, zastosowania tablic rzadkich, cd. Przykład realizacji tablic rzadkich (lista dwupoziomowa): Pocz 1 2 3 17 IL 2 3.24 1 5.00 IL 5 2.01 IL 7 0.01 IL 5 7.04 IL 47 Pojęcie, zastosowania tablic rzadkich, cd. Macierze rzadkie mogą być wykorzystywane do implementacji macierzy incydencji grafów Częstym zastosowaniem jest przechowywanie obrazów rastrowych (szczególnie wtedy, gdy na obrazie jest mało zapalonych punktów)? Czy potrafisz wyobrazić sobie inne zastosowania macierzy rzadkich? Wymień kilka Twoich propozycji w tym zakresie. 48

Konflikty w tablicach rozproszonych Kolizją (konfliktem) w tablicy rozproszonej nazywamy sytuację powstałą wtedy, gdy: k i, k j K, k i k j ( h( ) = h( ) k i k j Elementy k i, k j biorące udział w kolizji nazywamy synonimami. 49 Metody haszowania w tablicach rozproszonych Omówimy przykłady funkcji niezależnych od rozkładu klucza. Pierwszy z nich, to randomizacja: d i = randomize(k i ) Jest ona dość prosta, ale rzadko wykorzystywana 50

Metody haszowania w tablicach rozproszonych Metoda kwadratu środka: K O W A L S K I - klucz 21 25 33 11 22 29 21 19 - kody znaków 3 11 22 2 -wycięty środek 6 8 5 9 1 3 3 2 8 4 - kwadrat wyciętej liczby 9 1 3 - wyliczony adres d 51 Metody haszowania w tablicach rozproszonych, cd. K O W A L S K I - klucz 21 25 33 11 22 29 21 19 - kody znaków 29 21 19 21 25 33 11 22 29 21 19 21 25 00 d = 212500 + 331122 + 292119 = 834741 - wyliczony adres 52

Metody haszowania w tablicach rozproszonych, cd. Metoda dzielenia adres wyliczany według formuły: d = wart(k) mod p, gdzie: d - adres w tablicy rozproszonej (czasami: indeks) wart(k) -wartość wyliczona na podstawie klucza - inną metodą, np. metodą składania lub kwadratu środka p - liczba pozycji w tablicy w zastosowaniach praktycznych metoda ta jest bardzo efektywna 53 Metody haszowania w tablicach rozproszonych, cd. Przykład zastosowania metody dzielenia tablica ma 1000 pozycji zakończenie przykładu przedstawionego dla metody kwadratu środka: d 1 = 913 mod 1000 = 913 zakończenie przykładu przedstawionego dla metody składania: d 2 = 834741 mod 1000 = 741 54

Organizacja tablic rozproszonych Tablice rozproszone bez obszaru nadmiarowego - tutaj dane znajdują się wyłącznie w obszarze bazowym Tablice rozproszone z obszarami nadmiarowymi: z listami synonimów rozproszone tablice indeksowe 55 Organizacja tablic rozproszonych, przykład Rozproszone tablice indeksowe 0 1 2 * wart wart wart wart wart * * * = IL p-1 Obszar bazowy wart * Obszar nadmiarowy 56

Usuwanie konfliktów w tablicach rozproszonych Bez obszarów nadmiarowych - szukanie liniowe d i = (d 0 + a * i) mod p, gdzie d0 = h(k) - wynik początkowego haszowania klucza di - nowy adres, wyliczany wtedy, gdy w (i-1)-szym kroku wystąpił konflikt a - stały współczynnik empiryczny i - numer kolejnego kroku szukania (0 <= i <= p) p - liczba pozycji w tablicy 57 Usuwanie konfliktów w tablicach rozproszonych, cd. Bez obszarów nadmiarowych - szukanie kwadratowe d i = (d 0 + a * i + b * i 2 ) mod p, lub wzór uproszczony: d i = (d 0 + i 2 ), gdzie d0 = h(k) - wynik początkowego haszowania klucza di - nowy adres, wyliczany wtedy, gdy w (i-1)-szym kroku wystąpił konflikt a, b - stałe współczynniki empiryczny i - numer kolejnego kroku szukania (0 <= i <= p) p - liczba pozycji w tablicy 58

Usuwanie konfliktów w tablicach rozproszonych, cd. Bez obszarów nadmiarowych - szukanie sześcienne d i = (d 0 + i 3 ), gdzie d 0 = h(k) - wynik początkowego haszowania klucza d i -nowy adres, wyliczany wtedy, gdy w (i-1)-szym kroku wystąpił konflikt i - numer kolejnego kroku szukania (0 <= i <= p) p - liczba pozycji w tablicy 59 Usuwanie konfliktów w tablicach rozproszonych, cd. Z wykorzystaniem obszarów nadmiarowych: listy synomimów : pierwsze wstawienie do wolnego miejsca w obszarze bazowym. Kiedy wyliczona w haszowaniu pozycja z obszaru bazowego jest zajęta, to wstawiamy nowy element do listy synonimów podwieszonej pod tą pozycję w obszarze bazowym. Listy synonimów tworzą obszary nadmiarowe rozproszona tablica indeksowa - wszystkie dane są wstawiane do obszaru nadmiarowego Obszary nadmiarowe są organizowane w postali zestawu posortowanych wykazów liniowych lub posortowanych i zrównoważonych wykazów leksykograficzych 60

Dziękuję za uwagę 61