Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Materiały pochodzą z Platformy Edukacyjnej Portalu www.szkolnictwo.pl Wszelkie treści i zasoby edukacyjne publikowane na łamach Portalu www.szkolnictwo.pl.

Podobne prezentacje


Prezentacja na temat: "Materiały pochodzą z Platformy Edukacyjnej Portalu www.szkolnictwo.pl Wszelkie treści i zasoby edukacyjne publikowane na łamach Portalu www.szkolnictwo.pl."— Zapis prezentacji:

1 Materiały pochodzą z Platformy Edukacyjnej Portalu Wszelkie treści i zasoby edukacyjne publikowane na łamach Portalu mogą być wykorzystywane przez jego Użytkowników wyłącznie w zakresie własnego użytku osobistego oraz do użytku w szkołach podczas zajęć dydaktycznych. Kopiowanie, wprowadzanie zmian, przesyłanie, publiczne odtwarzanie i wszelkie wykorzystywanie tych treści do celów komercyjnych jest niedozwolone. Plik można dowolnie modernizować na potrzeby własne oraz do wykorzystania w szkołach podczas zajęć dydaktycznych.

2 Sortowanie kubełkowe, sortowanie grzebieniowe Algorytmy sortujące

3 Sortowanie kubełkowe (bucket sort) Jest to jeden z najbardziej popularnych algorytmów sortowania. Został wynaleziony w 1956 r. przez E.J. Issaca i R.C. Singletona. Algorytm działa w czasie liniowym O(n). Algorytm najlepiej się sprawdza dla zbiorów zawierających dużą liczbę elementów, liczb całkowitych jednak o małym zakresie ich wartości. W przypadku ogólnym pesymistyczna złożoność obliczeniowa tego algorytmu wynosi O(n²). Zazwyczaj przyjmuje się, że sortowane liczby należą do przedziału od 0 do 1. Jeśli tak nie jest, to można podzielić każdą z nich, przez największą możliwą (jeśli znany jest przedział) lub wyznaczoną. Algorytm ma klasę czasowej złożoności obliczeniowej O(m+n), gdzie m oznacza ilość możliwych wartości, które mogą przyjmować elementy zbioru, a n to ilość sortowanych elementów. Jeśli m jest małe w porównaniu z n (sortujemy dużo elementów o małym zakresie wartości), to na czas sortowania będzie miała wpływ głównie ilość elementów n i klasa złożoności uprości się do postaci O(n). Dla osiągnięcia optymalnej złożoności liczba kubełków powinna być rzędu liczby elementów.

4 Zasada działania algorytmu: 1. Na początku określamy zakres wartości jakie mogą przyjmować elementy sortowanego zbioru. 2. Dla każdej liczby występującej w sortowanym zbiorze tworzymy kubełek (licznik), do którego będziemy przyporządkowywać poszczególne elementy zbioru. Kubełek zlicza nam ilość wystąpień konkretnego elementu w zbiorze sortowanym. Na początku, każdy kubełek – licznik ma wartość zero. 3. Następnie rozpoczynamy przeglądanie sortowanego zbioru od początku do końca. Poszczególne elementy wrzucamy do kubełków oznaczonych daną cyfrą. W rezultacie kubełki będą nas informować o ilości wystąpień każdej z możliwych wartości w sortowanym zbiorze. 4. Ostatnim etapem jest spisanie do zbioru wynikowego liczb przypisanych do poszczególnych kubełków, tyle razy ile wynosi wartość licznika. W ten sposób zbiór wyjściowy będzie posortowany.

5 Przykład 1 Posortujemy algorytmem kubełkowym zbiór [ ]. W pierwszej kolejności określamy zakres wartości jakie mogą przyjmować elementy sortowanego zbioru. W naszym przypadku sortowane liczby nie należą do przedziału od 0 do 1, dlatego wyszukujemy w zbiorze element najmniejszy i największy – będzie to w min =2 i w max =9,. Teraz obliczmy liczbę potrzebnych kubełków. w max - w min +1 = 9 – = 8 Będziemy potrzebowali 8 kubełków (liczników). Dla każdego z nich przypiszemy wartość, którą będą zliczały i ustawimy wartość licznika na zero: [2:0] [3:0] [4:0] [5:0] [6:0] [7:0] [8:0] [9:0]

6 Przykład 1 cd. W następnym kroku przeglądamy kolejne elementy zbioru od początku do końca, zliczając ilość ich wystąpień i zapisując to w odpowiednich kubełkach: [ ] [2:4] [3:2] [4:0] [5:3] [6:2] [7:1] [8:2] [9:1] Podobnie jak w sortowaniu przez zliczanie, zapis [2:4] oznacza że, kubełek (licznik) liczby 2 zawiera 4 elementy – czyli liczba 2 występuje 4 razy w zbiorze. Jeżeli zbiór ma być posortowany rosnąco, rozpoczynamy przeglądanie kolejnych kubełków od tego o najmniejszym numerze, w przeciwnym wypadku posortujemy zbiór malejąco. W zbiorze wynikowym zapisujemy poszczególne liczby tyle razy ile wystąpiły w liczniku. Zbiór jest posortowany: [ ]

7 Specyfikacja problemu Dane wejściowe d[ ] - sortowany zbiór liczb całkowitych. Indeksy elementów rozpoczynają się od 1 n - liczba elementów w zbiorze, n N w min - minimalna wartość elementów zbioru, w min C w max - maksymalna wartość elementów zbioru, w max C Dane wyjściowe d[ ] - posortowany zbiór liczb całkowitych. Zmienne pomocnicze T w [ ] - tablica liczników wartości o indeksach od w min do w max. Każdy licznik przechowuje liczbę całkowitą i, j - zmienne licznikowe pętli, i,j C

8 Lista kroków K01: Dla i = w min, w min + 1,...,w max : wykonuj T w [i] 0 K02: Dla i = 1,2,...,n: wykonuj T w [ d[i] ] T w [ d[i] ] + 1 K03: j 1 K04: Dla i = w min, w min + 1,...,w max : wykonuj K05 K05: Dopóki l w [i] > 0 wykonuj: d[j] i l w [i] l w [i] - 1 j j + 1 K06: Zakończ

9 Schemat blokowy Algorytm, tak jak wcześniej opisany schemat działania, realizowany jest w czterech pętlach. W pętli nr 1 zerujemy kolejne liczniki T w [i]. W pętli nr 2 przeglądamy kolejne elementy zbioru, od pierwszego do ostatniego. Dla każdego elementu zwiększamy licznik o numerze równym danym wartościom elementów. Po tej pętli w kubełkach znajduje się określona liczba poszczególnych wartości elementów w sortowanym zbiorze. Zmienna j ma za zadanie umieszczać w zbiorze wyjściowym kolejnych elementów – zaczynamy od początku zbioru dlatego j->1. W pętli 3 przeglądane są kolejne liczniki. Jeśli jego wartość jest większa od zera, to pętla 4 umieści w zbiorze wyjściowym odpowiednią ilość sortowanych liczb. Po zakończeniu pętli 3 elementy w zbiorze wyjściowym są posortowane. Koniec algorytmu. START KONIEC TAK

10 Przykład 2 Algorytm sortowania kubełkowego często jest stosowany do alfabetycznego katalogowania wyrazów. W celu posortowania takiego zbioru, w pierwszym kroku należy odnaleźć najdłuższe wyrazy i porównać ich ostatnie litery. Dzięki temu porównaniu możemy ustalić ich kolejność. W ten sposób porównujemy kolejne litery – zawsze istotna jest litera z określonej pozycji – dla nowo porównywanych ostatnia. Uporządkujmy zbiór 3 wyrazów: rak, akt, mak. W zbiorze występuje pięć różnych liter – tyle potrzebujemy kubełków. [a:0] [k:0] [m:0] [r:0] [t:0] mak rak akt akmrt Kolej na opróżnienie kubełków - dokonujemy tego zaczynając od MAK AKT lewej od dołu - otrzymamy ciąg: MAK, RAK, AKT Ponownie napełniamy kubełki makrakmakrak aktakt akmrt Po opróżnieniu kubełków kolejność jest identyczna jak poprzednio, przejdźmy zatem do ostatniego etapu (według pierwszych liter). aktmakrak akmrt Opróżnienie kubełków ustanawia ostateczną kolejność. Posortowany ciąg to: AKT MAK RAK

11 Sortowanie grzebieniowe (combsort) Włodzimierz Dobosiewicz Sortowanie grzebieniowe należy do algorytmów niestabilnych - czyli kolejność wynikowa elementów równych jest nieokreślona (zwykle nie zostaje zachowana). Algorytm został wynaleziony w 1980 roku przez Włodzimierza Dobosiewicza, wybitnego specjalistę techniki komputerowej. W 1991 roku ponownie odkryta i opisana przez Stephena Lacey'a i Richarda Boxa metoda sortowania tablicowego. Sortowanie grzebieniowe należy do metod o złożoności liniowo-logarytmicznej. Złożoności obliczeniowej algorytmu dotychczas nie udało się dowieść formalnie. Prawdopodobnie wynosi ona O(n log n), statystycznie gorsza niż quicksort (sortowanie szybkie). Metoda oparta na metodzie sortowania bąbelkowego. W algorytmie włączono empirię – współczynnik 1.3 wyznaczony doświadczalnie.

12 Sortowanie grzebieniowe zasada działania Ogólna zasada działania algorytmu opiera się, jak sama nazwa wskazuje na analogii czesania. Ze zbioru wyczesujemy najpierw duże elementy "z grubsza", podobnie jak najpierw czeszemy się grzebieniem o rzadszym rozmieszczeniu ząbków a dopiero później grzebieniem o ząbkach umieszczonych gęściej. Sortowanie grzebieniowe dla wariantu podstawowego: za rozpiętość przyjmuje się długość tablicy, dzieli się rozpiętość przez 1.3, odrzuca część ułamkową bada się kolejno wszystkie pary obiektów odległych o rozpiętość (jeśli są ułożone niemonotonicznie - zamienia się je miejscami) wykonuje się powyższe w pętli dzieląc rozpiętość przez 1.3 do czasu, gdy rozpiętość osiągnie wartość 1 Gdy rozpiętość spadnie do 1 metoda zachowuje się tak jak sortowanie bąbelkowe. Tylko wtedy można określić, czy dane są już posortowane czy nie. W tym celu można użyć zmiennej typu bool, która jest ustawiana po zamianie elementów tablicy miejscami. Przerywane jest wykonywanie algorytmu, gdy podczas przejścia przez całą tablicę nie nastąpiła zamiana.

13 Sortowanie grzebieniowe Algorytm sortowania grzebieniowego należy do grupy algorytmów intensywnych (in situ – sortujących w miejscu), co oznacza, że wszystkie operacje realizowane są w jednej tablicy. Nie wykorzystujemy żadnej tablicy pomocniczej. Algorytm nie jest stabilny (jak w przypadku większości algorytmów szybkich). Oznacza to, że elementy o tej samej wartości mogą być przestawiane w stosunku do siebie. Interesującym elementem metody jest liczba 1.3, przez którą dzieli się kolejne odległości. Poprawność algorytmu nie jest uzależniona od wartości tego współczynnika, jednak jest on czynnikiem krytycznym jeśli chodzi o jego szybkość. Idea algorytmu opiera się na obserwacji, że w metodzie bąbelkowej można porównywać elementy nie sąsiadujące ze sobą, lecz oddalone od siebie o pewną wartość.

14 Przykład Posortować tablicę 10 elementową algorytmem sortowania grzebieniowego: [ ] Wielkość tablicy jest równa 10 - jest dzielona całkowitoliczbowo (bez reszty) przez 1.3 co daje (10/1.3)=7. W pierwszym przebiegu pętli porównywane są elementy oddalone od siebie o 7. Najpierw porównujemy element na pozycji 1 z elementem na pozycji 8. Podobnie jak w metodzie bąbelkowej zamieniamy je jeśli element na pozycji 8 jest mniejszy od elementu na pozycji 1 – w naszym przykładzie nie przestawiamy elementów Postępujemy tak aż porównamy element na pozycji 3 z elementem 10-tym - następuje zamiana miejsc 3 z

15 Przykład cd. Następnie ponownie dzielimy aktualną odległość (7 dla 10-elementowej tablicy) przez 1.3. Otrzymujemy odległość równą 5. Porównujemy elementy 1 z 6 i przestawiamy jeśli 1-ka jest większa od 6-ki, itd. aż do porównania elementu 5-go z 10-tym Element z pozycji 1 jest większy od elementu z pozycji 6 – zamieniamy je miejscami, podobnie postępujemy z elementami 4 i

16 Przykład cd. Ponownie ustalamy aktualną odległość pomiędzy porównywanymi elementami - ustalamy go na 3. Element z pozycji 6 jest większy od elementu z pozycji 9 więc je zamieniamy miejscami Element z pozycji 7 jest większy od elementu z pozycji 10 więc zamieniamy je miejscami

17 Przykład cd. Odległość pomiędzy porównywanymi elementami ustalamy na Ponownie porównujemy elementy zbioru. Element z pozycji 3 jest większy od elementu na pozycji 5 dlatego zamieniamy je miejscami. Podobnie z elementami nr 7 i 9 – je także zamieniamy miejscami. Zbiór po przestawieniach będzie przedstawiał się następująco:

18 Przykład cd. Odległość pomiędzy porównywanymi elementami ustalamy na 1. Algorytm przekształca się w ten sposób w algorytm bąbelkowy, lecz istnieje dodatkowy warunek zatrzymania go (brak inwersji, przestawień elementów), który statystycznie pozwala na zakończenie algorytmu szybciej niż algorytm bąbelkowy. Globalnym warunkiem stop jest koniunkcja warunku braku inwersji i odległości równej 1, co zapewnia właściwy porządek w tablicy wynikowej Ponownie porównujemy elementy zbioru. Element z pozycji 1 jest większy od elementu na pozycji 2 dlatego zamieniamy je miejscami. Podobnie z elementami nr 3 i 4 oraz 5 i 6 – je także zamieniamy miejscami. Zbiór po przestawieniach będzie przedstawiał się następująco: Odległość pomiędzy porównywanymi elementami ustalona na 1. Odległość między poszczególnymi elementami wynosi 1 i żaden nie został przestawiony co oznacza, że tablica jest posortowana

19 Sortowanie grzebieniowe - modyfikacje Algorytm ten posiada ciekawą odmianę zwaną Combsort11. Zmiana jest niewielka, sprowadza się do zmiany odległości między porównywanymi elementami na 11 jeśli wynosi ona 9 lub 10. Widać, że nie zapętla ona algorytmu bo całkowitoliczbowe dzielenie 11 div 1.3 daje 8. Podobnie jak wersja podstawowa algorytmu, również to ulepszenie nie posiada formalnej analizy, która dowodziłaby jego poprawności, zasadza się jedynie na wynikach pomiarów.

20 Bibliografia Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, "Wprowadzenie do algorytmów", WNT 2001 W. Dobosiewicz, An efficient variation of bubble sort, Information processing letters 11(1):5-6, 1980 Richard Box and Stephen Lacey, A fast, easy sort, Byte, 16(4):315-ff, April 1991 Sysło M.: Algorytmy, WSiP, Warszawa 1997 Wróblewski P.: Algorytmy, struktury danych i techniki programowania, Wyd. Helion,


Pobierz ppt "Materiały pochodzą z Platformy Edukacyjnej Portalu www.szkolnictwo.pl Wszelkie treści i zasoby edukacyjne publikowane na łamach Portalu www.szkolnictwo.pl."

Podobne prezentacje


Reklamy Google