Algorytmy i Struktury Danych.

Transkrypt

Algorytmy i Struktury Danych.
Algorytmy i Struktury Danych.
Problem Sortowania, cd.
dr hab. Bożena Woźna-Szcześniak
[email protected]
Jan Długosz University, Poland
Wykład 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
1 / 49
Jak szybko można sortować ?
Wszystkie do tej pory omówione algorytmy sortujace
˛ należa˛ do
grupy sortowania przez porównywanie - czyli podstawowa˛
operacja˛ ustalajaca
˛ porzadek
˛
pomiedzy
˛
elementami jest opercja
porównywania pary elementów (mniejsze niż, wieksze
˛
niż,
mniejsze lub równe, wieksze
˛
lub równe, równe).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
2 / 49
Jak szybko można sortować ?
Wszystkie do tej pory omówione algorytmy sortujace
˛ należa˛ do
grupy sortowania przez porównywanie - czyli podstawowa˛
operacja˛ ustalajaca
˛ porzadek
˛
pomiedzy
˛
elementami jest opercja
porównywania pary elementów (mniejsze niż, wieksze
˛
niż,
mniejsze lub równe, wieksze
˛
lub równe, równe).
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Sortowanie przez wybieranie (ang. selection sort))
Sortowanie szybkie (ang. quicksort)
Sortowanie przez kopcowanie (ang. heapsort) - omówione na
wykładach późniejszych
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
2 / 49
Jak szybko można sortować ?
Wszystkie do tej pory omówione algorytmy sortujace
˛ należa˛ do
grupy sortowania przez porównywanie - czyli podstawowa˛
operacja˛ ustalajaca
˛ porzadek
˛
pomiedzy
˛
elementami jest opercja
porównywania pary elementów (mniejsze niż, wieksze
˛
niż,
mniejsze lub równe, wieksze
˛
lub równe, równe).
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Sortowanie przez wybieranie (ang. selection sort))
Sortowanie szybkie (ang. quicksort)
Sortowanie przez kopcowanie (ang. heapsort) - omówione na
wykładach późniejszych
Najlepsza złożoność optymistyczna powyżej wymienionych
algorytmów jest O(n · log2 n).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
2 / 49
Jak szybko można sortować ?
Wszystkie do tej pory omówione algorytmy sortujace
˛ należa˛ do
grupy sortowania przez porównywanie - czyli podstawowa˛
operacja˛ ustalajaca
˛ porzadek
˛
pomiedzy
˛
elementami jest opercja
porównywania pary elementów (mniejsze niż, wieksze
˛
niż,
mniejsze lub równe, wieksze
˛
lub równe, równe).
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Sortowanie przez wybieranie (ang. selection sort))
Sortowanie szybkie (ang. quicksort)
Sortowanie przez kopcowanie (ang. heapsort) - omówione na
wykładach późniejszych
Najlepsza złożoność optymistyczna powyżej wymienionych
algorytmów jest O(n · log2 n).
Czy można mieć lepszy algorytm sortujacy
˛ ?
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
2 / 49
Jak szybko można sortować ?
Wszystkie do tej pory omówione algorytmy sortujace
˛ należa˛ do
grupy sortowania przez porównywanie - czyli podstawowa˛
operacja˛ ustalajaca
˛ porzadek
˛
pomiedzy
˛
elementami jest opercja
porównywania pary elementów (mniejsze niż, wieksze
˛
niż,
mniejsze lub równe, wieksze
˛
lub równe, równe).
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Sortowanie przez wybieranie (ang. selection sort))
Sortowanie szybkie (ang. quicksort)
Sortowanie przez kopcowanie (ang. heapsort) - omówione na
wykładach późniejszych
Najlepsza złożoność optymistyczna powyżej wymienionych
algorytmów jest O(n · log2 n).
Czy można mieć lepszy algorytm sortujacy
˛ ? W odpowiedzi na to
pytanie pomoga˛ drzewa decyzyjne.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
2 / 49
Drzewo decyzyjne - przykład
Każdy wierzchołek
wewnetrzny
˛
etykietowany jest przez
i : j, gdzie
i, j ∈ {1, . . . , n}.
Lewe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≤ aj
Prawe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≥ aj
Bożena Woźna-Szcześniak (AJD)
Sortowanie ciagu
˛
(a1 , a2 , . . . , an ):
1:2
1:3
2:3
123
1:3
132
Algorytmy i Struktury Danych.
2:3
213
312
231
321
Wykład 4
3 / 49
Drzewo decyzyjne - przykład
Każdy wierzchołek
wewnetrzny
˛
etykietowany jest przez
i : j, gdzie
i, j ∈ {1, . . . , n}.
Lewe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≤ aj
Prawe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≥ aj
Bożena Woźna-Szcześniak (AJD)
Sortowanie ciagu
˛
(a1 , a2 , . . . , an ) = (9, 4, 6):
1:2
9≥4
1:3
2:3
123
1:3
132
Algorytmy i Struktury Danych.
2:3
213
312
231
321
Wykład 4
4 / 49
Drzewo decyzyjne - przykład
Każdy wierzchołek
wewnetrzny
˛
etykietowany jest przez
i : j, gdzie
i, j ∈ {1, . . . , n}.
Lewe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≤ aj
Prawe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≥ aj
Bożena Woźna-Szcześniak (AJD)
Sortowanie ciagu
˛
(a1 , a2 , . . . , an ) = (9, 4, 6):
1:2
1:3
2:3
9≥6
123
1:3
132
Algorytmy i Struktury Danych.
2:3
213
312
231
321
Wykład 4
5 / 49
Drzewo decyzyjne - przykład
Każdy wierzchołek
wewnetrzny
˛
etykietowany jest przez
i : j, gdzie
i, j ∈ {1, . . . , n}.
Lewe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≤ aj
Prawe podrzewo
pokazuje kolejne
porównywania w
przypadku, gdy ai ≥ aj
Bożena Woźna-Szcześniak (AJD)
Sortowanie ciagu
˛
(a1 , a2 , . . . , an ) = (9, 4, 6):
1:2
1:3
2:3
123
1:3
2:3
213
4≤6
132
Algorytmy i Struktury Danych.
312
231
321
Wykład 4
6 / 49
Drzewo decyzyjne - przykład
Sortowanie ciagu
˛
(a1 , a2 , . . . , an ) = (9, 4, 6):
1:2
Każdy liść zawiera
permutacje˛
π(1), π(2), . . . , π(n)
wskazujac
˛ a˛
ustanowiony porzadek
˛
aπ(1) ≤ aπ(2) ≤ aπ(n) .
1:3
2:3
123
1:3
132
2:3
213
312
231
321
4≤6≤9
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
7 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Drzewo decyzyjne zawiera wszystkie możliwe wykonania
(porównywania) algorymu.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Drzewo decyzyjne zawiera wszystkie możliwe wykonania
(porównywania) algorymu.
Jest dokładnie jedno drzewo decyzyjne dla wejścia o rozmiarze n drzewo decyzyjne jest zależne od rozmiaru wejścia, tj. od n.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Drzewo decyzyjne zawiera wszystkie możliwe wykonania
(porównywania) algorymu.
Jest dokładnie jedno drzewo decyzyjne dla wejścia o rozmiarze n drzewo decyzyjne jest zależne od rozmiaru wejścia, tj. od n.
Rozmiar drzewa (ilość liści) jest wykładniczy ze wgledu
˛
na rozmiar
danych wejściowych.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Drzewo decyzyjne zawiera wszystkie możliwe wykonania
(porównywania) algorymu.
Jest dokładnie jedno drzewo decyzyjne dla wejścia o rozmiarze n drzewo decyzyjne jest zależne od rozmiaru wejścia, tj. od n.
Rozmiar drzewa (ilość liści) jest wykładniczy ze wgledu
˛
na rozmiar
danych wejściowych.
Z uwagi na powższe drzewa decyzyjne nie sa˛ dogodna˛ metoda˛
reprezentacji algorymów.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Drzewo decyzyjne zawiera wszystkie możliwe wykonania
(porównywania) algorymu.
Jest dokładnie jedno drzewo decyzyjne dla wejścia o rozmiarze n drzewo decyzyjne jest zależne od rozmiaru wejścia, tj. od n.
Rozmiar drzewa (ilość liści) jest wykładniczy ze wgledu
˛
na rozmiar
danych wejściowych.
Z uwagi na powższe drzewa decyzyjne nie sa˛ dogodna˛ metoda˛
reprezentacji algorymów.
Drzewo decyzjyne nie jest jednak zupełnie bezużyteczne - pozwala na
określenie dolnego ograniczenia dla optymistycznego czasu działania
algorymu.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Drzewo decyzyjne zawiera wszystkie możliwe wykonania
(porównywania) algorymu.
Jest dokładnie jedno drzewo decyzyjne dla wejścia o rozmiarze n drzewo decyzyjne jest zależne od rozmiaru wejścia, tj. od n.
Rozmiar drzewa (ilość liści) jest wykładniczy ze wgledu
˛
na rozmiar
danych wejściowych.
Z uwagi na powższe drzewa decyzyjne nie sa˛ dogodna˛ metoda˛
reprezentacji algorymów.
Drzewo decyzjyne nie jest jednak zupełnie bezużyteczne - pozwala na
określenie dolnego ograniczenia dla optymistycznego czasu działania
algorymu.
Czas działania algorytmu dla danego wejścia jest równy długości ścieżki
w drzewie decyzyjnym dla tego wejścia.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Drzewo decyzyjne
Drzewo decyzyjne może modelować dowolna˛ metode˛ sortujac
˛ a˛ oparta˛
na modelu porównywania elementów.
Drzewo decyzyjne zawiera wszystkie możliwe wykonania
(porównywania) algorymu.
Jest dokładnie jedno drzewo decyzyjne dla wejścia o rozmiarze n drzewo decyzyjne jest zależne od rozmiaru wejścia, tj. od n.
Rozmiar drzewa (ilość liści) jest wykładniczy ze wgledu
˛
na rozmiar
danych wejściowych.
Z uwagi na powższe drzewa decyzyjne nie sa˛ dogodna˛ metoda˛
reprezentacji algorymów.
Drzewo decyzjyne nie jest jednak zupełnie bezużyteczne - pozwala na
określenie dolnego ograniczenia dla optymistycznego czasu działania
algorymu.
Czas działania algorytmu dla danego wejścia jest równy długości ścieżki
w drzewie decyzyjnym dla tego wejścia.
Czas pesymistyczny algorymu jest równy wysokości drzewa.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
8 / 49
Ograniczenie dolne dla sortowania opartego o drzewo
decyzyjne
Twierdzenie
Każde drzewo decyzyjne, które może posortować n elementów ma
wysokość Ω(n · log2 (n)).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
9 / 49
Ograniczenie dolne dla sortowania opartego o drzewo
decyzyjne
Twierdzenie
Każde drzewo decyzyjne, które może posortować n elementów ma
wysokość Ω(n · log2 (n)).
Dowód
Ponieważ mamy n! permutacji dla danego ciagu
˛ wejściowego o
rozmiarze n, to drzewo powinno zawierać conajmniej n! liści.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
9 / 49
Ograniczenie dolne dla sortowania opartego o drzewo
decyzyjne
Twierdzenie
Każde drzewo decyzyjne, które może posortować n elementów ma
wysokość Ω(n · log2 (n)).
Dowód
Ponieważ mamy n! permutacji dla danego ciagu
˛ wejściowego o
rozmiarze n, to drzewo powinno zawierać conajmniej n! liści.
Drzewo binarne o wysokości h ma ≤ 2h liści.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
9 / 49
Ograniczenie dolne dla sortowania opartego o drzewo
decyzyjne
Twierdzenie
Każde drzewo decyzyjne, które może posortować n elementów ma
wysokość Ω(n · log2 (n)).
Dowód
Ponieważ mamy n! permutacji dla danego ciagu
˛ wejściowego o
rozmiarze n, to drzewo powinno zawierać conajmniej n! liści.
Drzewo binarne o wysokości h ma ≤ 2h liści.
Zatem mamy:
n! ≤ 2h
h ≤ log2 (n!) ≤ log2 ((n/e)n ) = n · log2 (n) − n · log2 (e)
h ≤ Ω(n · log2 (n))
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
9 / 49
Sortowanie stabilne
Dana metoda sortowania jest stabilna, jeśli zachowuje wzgledn
˛ a˛
kolejność elementów ze zdublowanymi kluczami.
Przykładowo, jeżeli ułożona˛ alfabetycznie liste˛ studentów posortujemy
według roku studiów, to metoda stabilna zwróci w wyniku alfabetycznie
ułożona˛ liste˛ osób podzielona˛ ze wzgledu na rok studiów.
Metoda niestabilna pozwala na sortowanie tylko wzgledem
˛
jednego
klucza.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
10 / 49
Sortowanie stabilne - przykład
Dane Wejściowe
Adams 1
Black 2
Brown 4
Jackson 2
Jones 4
Smith 1
Thompson 4
Washington 2
White 3
Wilson 3
Bożena Woźna-Szcześniak (AJD)
Sortowanie niestabilne
Adams 1
Smith 1
Washington 2
Jackson 2
Black 2
White 3
Wilson 3
Thompson 4
Brown 4
Jones 4
Algorytmy i Struktury Danych.
Sortowanie stabilne
Adams 1
Smith 1
Black 2
Jackson 2
Washington 2
White 3
Wilson 3
Brown 4
Jones 4
Thompson 4
Wykład 4
11 / 49
Sortowanie stabilne - algorytmy
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Sortowanie przez zliczanie (ang. counting sort)
Sortowanie pozycyjne (ang. radix sort) - omówione w nastepnej
˛
cz˛eści wykładu
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
12 / 49
Sortowanie niestabilne - algorytmy
Sortowanie przez wybieranie(ang. selection sort))
Sortowanie szybkie (ang. quicksort)
Sortowanie przez kopcowanie (ang. heapsort) - omówione na
wykładach późniejszych
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
13 / 49
Sortowanie przez zliczanie -idea
Zadanie: Posortujmy ciag:
˛ 3,6,3,2,7,1,7,1.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
14 / 49
Sortowanie przez zliczanie -idea
Zadanie: Posortujmy ciag:
˛ 3,6,3,2,7,1,7,1.
Po zliczeniu (w jednym korku) operujemy danymi na temat
liczności poszczególnych liczb:
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
14 / 49
Sortowanie przez zliczanie -idea
Zadanie: Posortujmy ciag:
˛ 3,6,3,2,7,1,7,1.
Po zliczeniu (w jednym korku) operujemy danymi na temat
liczności poszczególnych liczb:
Liczba 1 wystepuje
˛
2 razy
Liczba 2 wystepuje
˛
1 raz
Liczba 3 wystepuje
˛
2 razy
Liczba 4 wystepuje
˛
0 razy
Liczba 5 wystepuje
˛
0 razy
Liczba 6 wystepuje
˛
1 raz
Liczba 7 wystepuje
˛
2 razy
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
14 / 49
Sortowanie przez zliczanie -idea
Zadanie: Posortujmy ciag:
˛ 3,6,3,2,7,1,7,1.
Po zliczeniu (w jednym korku) operujemy danymi na temat
liczności poszczególnych liczb:
Liczba 1 wystepuje
˛
2 razy
Liczba 2 wystepuje
˛
1 raz
Liczba 3 wystepuje
˛
2 razy
Liczba 4 wystepuje
˛
0 razy
Liczba 5 wystepuje
˛
0 razy
Liczba 6 wystepuje
˛
1 raz
Liczba 7 wystepuje
˛
2 razy
Na podstawie tych danych tworzymy posortowany ciag:
˛
1,1,2,3,3,6,7,7.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
14 / 49
Sortowanie przez zliczanie - uwagi
Proces zliczania odbywa sie˛ w jednym kroku
Nie dochodzi do ani jednej zamiany elementów
Proces tworzenia tablicy wynikowej odbywa sie˛ w jednym kroku
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
15 / 49
Sortowanie przez zliczanie - algorytm
Wejście: A[1..n], gdzie A[j] ∈ {1, 2, ..., k }.
Wyjście: B[1..n], posortowana.
Tablica Pomocnicza: C[1..k ]. {A=[0,. . . ,n-1]}
Algorytm: Counting-sort(A,B,k)
1: for all i = 1 to k do
2:
C[i] := 0;
3: end for
4: for all j = 1 to n do
5:
C[A[j]] := C[A[j]] + 1;
6: end for{//C[i] zawiera teraz liczbe elementów równych i}
7: for all i = 2 to k do
8:
C[i] := C[i] + C[i − 1];
9: end for{//C[i] zawiera teraz liczbe˛ elementów mniejszych badź
˛ równych i}
10: for all j = n downto 1 do
11:
B[C[A[j]]] := A[j];
12:
C[A[j]] := C[A[j]] − 1;
13: end for
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
16 / 49
Sortowanie przez zliczanie -przykład
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
17 / 49
Sortowanie przez zliczanie - petla
˛ nr. 1
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
18 / 49
Sortowanie przez zliczanie - petla
˛ nr. 2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
19 / 49
Sortowanie przez zliczanie - petla
˛ nr. 2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
20 / 49
Sortowanie przez zliczanie - petla
˛ nr. 2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
21 / 49
Sortowanie przez zliczanie - petla
˛ nr. 2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
22 / 49
Sortowanie przez zliczanie - petla
˛ nr. 2
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
23 / 49
Sortowanie przez zliczanie - petla
˛ nr. 3
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
24 / 49
Sortowanie przez zliczanie - petla
˛ nr. 3
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
25 / 49
Sortowanie przez zliczanie - petla
˛ nr. 3
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
26 / 49
Sortowanie przez zliczanie - petla
˛ nr. 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
27 / 49
Sortowanie przez zliczanie - petla
˛ nr. 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
28 / 49
Sortowanie przez zliczanie - petla
˛ nr. 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
29 / 49
Sortowanie przez zliczanie - petla
˛ nr. 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
30 / 49
Sortowanie przez zliczanie - petla
˛ nr. 4
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
31 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Algorytm: Counting-sort(A,B,k)
1: for all i = 1 to k do
2:
C[i] := 0;
3: end for{Θ(k)}
4: for all j = 1 to n do
5:
C[A[j]] := C[A[j]] + 1;
6: end for{Θ(n)}
7: for all i = 2 to k do
8:
C[i] := C[i] + C[i − 1];
9: end for{Θ(k)}
10: for all j = n downto 1 do
11:
B[C[A[j]]] := A[j];
12:
C[A[j]] := C[A[j]] − 1;
13: end for{Θ(n)}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
32 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Algorytm: Counting-sort(A,B,k)
1: for all i = 1 to k do
2:
C[i] := 0;
3: end for{Θ(k)}
4: for all j = 1 to n do
5:
C[A[j]] := C[A[j]] + 1;
6: end for{Θ(n)}
7: for all i = 2 to k do
8:
C[i] := C[i] + C[i − 1];
9: end for{Θ(k)}
10: for all j = n downto 1 do
11:
B[C[A[j]]] := A[j];
12:
C[A[j]] := C[A[j]] − 1;
13: end for{Θ(n)}
Złożoność obliczeniowa “Counting-sort” = Θ(n + k)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
32 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Można sortować tylko wartości całkowite.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
33 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Można sortować tylko wartości całkowite.
Efektywnośc sortowania silnie zależy od zakresu k.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
33 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Można sortować tylko wartości całkowite.
Efektywnośc sortowania silnie zależy od zakresu k.
Jeżeli k jest małe, np. k = O(n), to czas sortowania jest bardzo
dobry, tzn. Θ(n).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
33 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Można sortować tylko wartości całkowite.
Efektywnośc sortowania silnie zależy od zakresu k.
Jeżeli k jest małe, np. k = O(n), to czas sortowania jest bardzo
dobry, tzn. Θ(n).
Przykładowo, dla danych kodowalnych na 1 bajcie, k = 28 = 256 pomocnicza tablica ma zatem rozmiar 256. Wówczas
counting-sort działa naprawde˛ szybko, tj. w czasie
(256 + n) = Θ(n).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
33 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Można sortować tylko wartości całkowite.
Efektywnośc sortowania silnie zależy od zakresu k.
Jeżeli k jest małe, np. k = O(n), to czas sortowania jest bardzo
dobry, tzn. Θ(n).
Przykładowo, dla danych kodowalnych na 1 bajcie, k = 28 = 256 pomocnicza tablica ma zatem rozmiar 256. Wówczas
counting-sort działa naprawde˛ szybko, tj. w czasie
(256 + n) = Θ(n).
Jeżeli k jest duże, to algorym już nie jest taki dobry !!!.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
33 / 49
Sortowanie przez zliczanie - Złożoność obliczeniowa
Można sortować tylko wartości całkowite.
Efektywnośc sortowania silnie zależy od zakresu k.
Jeżeli k jest małe, np. k = O(n), to czas sortowania jest bardzo
dobry, tzn. Θ(n).
Przykładowo, dla danych kodowalnych na 1 bajcie, k = 28 = 256 pomocnicza tablica ma zatem rozmiar 256. Wówczas
counting-sort działa naprawde˛ szybko, tj. w czasie
(256 + n) = Θ(n).
Jeżeli k jest duże, to algorym już nie jest taki dobry !!!.
Przykładowo, dla danych kodowalnych na 4 bajtach, k = 232 , czyli
okolo 4.2 biliona. Zatem k jest całkiem duże. Wymagana
pomocnicza tablica ma rozmiar 4.2 biliona, czyli zajmie około 16
giga-bajtów. Czyli na samym starcie już nie jest dobrze .....
potrzebny jest super komputer z conajmniej 16 gigabajtami
RAM-u.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
33 / 49
Sortowanie przez zliczanie jest stabilne
Sortowanie przez zliczanie jest stabilne: zachowuje wejściowy
porzadek
˛
wśród równych elementów.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
34 / 49
Herman Hollerith (1860-1929)
Wynalazca kart perforowanych. Ustalił
standardowy format karty perforowanej o
rozmiarze banknotu jednodolarowego.
W 1890 zbudował pierwszy tabulator -sorter
kart dziurkowanych - urzadzenie
˛
oparte na
idei Jacquarda, służace
˛ do mechanicznego
sporzadzania
˛
zestawień danych, ich
klasyfikowania, przetwarzania i powielania.
Pozwoliło ono przeprowadzić w USA (wtedy
60 milionów ludzi) spis powszechny w dwa i
pół roku.
Hollerith w 1911 założył firme˛ Tabulating
Machine Company, z której w 1924 wyłoniła
sie˛ firma IBM (International Business
Machines).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
35 / 49
Karta dziurkowana
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
36 / 49
Herman Hollerith (1860-1929)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
37 / 49
Geneza sortowania pozycyjnego
Oto cytat z roku 1889 opisujacy
˛ patent (maszyne˛ tabulacyjna)
˛
Hollerith’a
The most complicated combinations can readily be counted
with comparatively few counters or relays by first assorting
the cards according to the first items entering into the
combinations, then reassorting each group according to the
second item entering into the combination, and so on, and
finally counting on a few counters the last item of the
combination for each group of cards.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
38 / 49
Sortowanie pozycyjne
Pochodzenie: sorter kart dziurkowanych Herman Hollerith’a.
Sortowanie cyfra po cyfrze.
Niepoprawna idea Hollerith’a: sortowanie wzgledem najbardziej
znaczacej
˛ cyfry.
Właściwa idea: sortowanie stabilne – przy użyciu pomocniczego
algorytmy sortujacego
˛
– wzgledem najmniej znaczacej
˛ cyfry.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
39 / 49
Sortowanie pozycyjne
Pochodzenie: sorter kart dziurkowanych Herman Hollerith’a.
Sortowanie cyfra po cyfrze.
Niepoprawna idea Hollerith’a: sortowanie wzgledem najbardziej
znaczacej
˛ cyfry.
Właściwa idea: sortowanie stabilne – przy użyciu pomocniczego
algorytmy sortujacego
˛
– wzgledem najmniej znaczacej
˛ cyfry.
Idea
Sortowanie pozycyjne (ang. radix sort) porzadkuje
˛
stabilnie ciagi
˛
wartości (liczb, słów) wzgledem
˛
konkretnych cyfr, znaków itp., kolejno
od najmniej znaczacych
˛
do najbardziej znaczacych
˛
pozycji.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
39 / 49
Sortowanie pozycyjne - algorytm
Require: Zbiór n-elementowych ciagów
˛
A
Algorytm: RadixSort
1: for all i = n downto 1 do
2:
sortuj stabilnie ciagi
˛ według i-tej pozycji;
3: end for
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
40 / 49
Sortowanie pozycyjne - przykład
Wejście:
523 456 673 666 567
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
41 / 49
Sortowanie pozycyjne - przykład
Wejście:
523 456 673 666 567
I przebieg:
523 673 456 666 567
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
41 / 49
Sortowanie pozycyjne - przykład
Wejście:
523 456 673 666 567
I przebieg:
523 673 456 666 567
II przebieg:
523 456 666 567 673
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
41 / 49
Sortowanie pozycyjne - przykład
Wejście:
523 456 673 666 567
I przebieg:
523 673 456 666 567
II przebieg:
523 456 666 567 673
III przebieg:
456 523 567 666 673
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
41 / 49
Sortowanie pozycyjne - przykład
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
42 / 49
Sortowanie Pozycyjne -poprawność
Indukcja ze wzgledu
˛
na pozycje cyfry
Załóżmy, że liczby sa˛ posortowane
niemalejaco
˛ wzgledem
˛
t − 1 cyfry.
Sortujemy według cyfry t
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
43 / 49
Sortowanie Pozycyjne -poprawność
Sortujemy według cyfry t
Liczby różnia˛ sie˛ na t-tej cyfrze:
Ponieważ sortujemy wzgledem
˛
najbardziej znaczacej
˛ cyfry (w tym
przypadku jest to t−ta cyfra), to
wybrana przez nas metoda
sortowania (dowolna stabilna) ustawi
liczby o długości t we właściwym
porzadku.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
44 / 49
Sortowanie Pozycyjne -poprawność
Sortujemy według cyfry t
Liczby sa˛ równe na t-tej cyfrze:
Ponieważ z założenia wykonujemy
sortowanie stabilne na cyfrach, dwie
liczby równe na t-tej cyfrze pozostaja˛
w tym samym porzadku.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
45 / 49
Sortowanie pozycyjne - analiza
Złożoność algorymu zależy od wybranego pomocniczego
stabilnego algorytmu sortujacego.
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
46 / 49
Sortowanie pozycyjne - analiza
Złożoność algorymu zależy od wybranego pomocniczego
stabilnego algorytmu sortujacego.
˛
Zatem nie powinniśmy wybrać żadnego z poniższych, jeśli zależy
nam na sortowaniu w czasie liniowym:
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
46 / 49
Sortowanie pozycyjne - analiza
Złożoność algorymu zależy od wybranego pomocniczego
stabilnego algorytmu sortujacego.
˛
Zatem nie powinniśmy wybrać żadnego z poniższych, jeśli zależy
nam na sortowaniu w czasie liniowym:
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Właściwy wybór to:
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
46 / 49
Sortowanie pozycyjne - analiza
Złożoność algorymu zależy od wybranego pomocniczego
stabilnego algorytmu sortujacego.
˛
Zatem nie powinniśmy wybrać żadnego z poniższych, jeśli zależy
nam na sortowaniu w czasie liniowym:
Sortowanie babelkowe
˛
(ang. bubblesort)
Sortowanie przez wstawianie (ang. insertion sort)
Sortowanie przez scalanie (ang. merge sort)
Właściwy wybór to: sortowanie przez zliczanie
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
46 / 49
Sortowanie pozycyjne - analiza
Załóżmy, że wybranym sortowaniem pomocniczym jest
sortowanie przez zliczanie.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
47 / 49
Sortowanie pozycyjne - analiza
Załóżmy, że wybranym sortowaniem pomocniczym jest
sortowanie przez zliczanie.
Wiemy, że sortowanie przez zliczanie pracuje w czasie Θ(n + k),
aby posortować n liczb z zakresu od 0 do k − 1.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
47 / 49
Sortowanie pozycyjne - analiza
Załóżmy, że wybranym sortowaniem pomocniczym jest
sortowanie przez zliczanie.
Wiemy, że sortowanie przez zliczanie pracuje w czasie Θ(n + k),
aby posortować n liczb z zakresu od 0 do k − 1.
Zatem, jeśli b-bitowe słowo (b-bitowa liczba) zostanie podzielone
na r -bitowe kawałki, to każdy przebieg sortowania przez zlicznie
bedzie
˛
wykonany w czsie Θ(n + 2r ).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
47 / 49
Sortowanie pozycyjne - analiza
Załóżmy, że wybranym sortowaniem pomocniczym jest
sortowanie przez zliczanie.
Wiemy, że sortowanie przez zliczanie pracuje w czasie Θ(n + k),
aby posortować n liczb z zakresu od 0 do k − 1.
Zatem, jeśli b-bitowe słowo (b-bitowa liczba) zostanie podzielone
na r -bitowe kawałki, to każdy przebieg sortowania przez zlicznie
bedzie
˛
wykonany w czsie Θ(n + 2r ).
Ponieważ w sortowaniu pozycyjnym bedziemy
˛
mieli b/r
przebiegów, to czas wykonania sortowania bedzie:
˛
b
T (n, b) = Θ( (n + 2r ))
r
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
47 / 49
Wybór r
b
T (n, b) = Θ( (n + 2r ))
r
Aby algorym sortowania pozycyjnego pracował szybko (tzn. w
czasie liniowym ), należy odpowiednio dobrze dobrać r . W
szczególności duże r oznacza, że bedzie
˛
tylko kilka przebiegów.
Należy jednka zwrócić uwage,
˛ aby r nie było zbyć duże, gdyż jeśli
r > log2 (n), to czas sorowania pomocniczego (przez zliczanie) i
potrzebna mu pamieć
˛ bedzie
˛
zbyt duża !!!
Aby zminimalizować T (n, b), należy wybrać r = log2 (n), co
implikuje T (n, b) = Θ(b · n/log2 (n))).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
48 / 49
Wybór r
b
T (n, b) = Θ( (n + 2r ))
r
Aby algorym sortowania pozycyjnego pracował szybko (tzn. w
czasie liniowym ), należy odpowiednio dobrze dobrać r . W
szczególności duże r oznacza, że bedzie
˛
tylko kilka przebiegów.
Należy jednka zwrócić uwage,
˛ aby r nie było zbyć duże, gdyż jeśli
r > log2 (n), to czas sorowania pomocniczego (przez zliczanie) i
potrzebna mu pamieć
˛ bedzie
˛
zbyt duża !!!
Aby zminimalizować T (n, b), należy wybrać r = log2 (n), co
implikuje T (n, b) = Θ(b · n/log2 (n))).
Powyższe r można uzyskać poprzez zróżniczkowanie fukcji
T (n, b) wzgledem
˛
zmiennej r i podstawieniu pod powstała˛ funkcje˛
wartości 0.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
48 / 49
Uwagi końcowe
W praktyce sortowanie pozycyjne jest bardzo dobre dla dużych
danych.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
49 / 49
Uwagi końcowe
W praktyce sortowanie pozycyjne jest bardzo dobre dla dużych
danych.
Przykładowo dla liczb 32-bitowych przy sortowaniu 2000 danych
sortowanie pozycyjne wykona
(b · n/log2 (n))) = 32 · 2000/log2(2000) ≈ 3 ∗ 2000 operacji.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
49 / 49
Uwagi końcowe
W praktyce sortowanie pozycyjne jest bardzo dobre dla dużych
danych.
Przykładowo dla liczb 32-bitowych przy sortowaniu 2000 danych
sortowanie pozycyjne wykona
(b · n/log2 (n))) = 32 · 2000/log2(2000) ≈ 3 ∗ 2000 operacji.
Dla porównania, sortowanie szybkie wykona
n · log2 (n) = 2000 · log2 (2000) ≈ 11 ∗ 2000 operacji.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 4
49 / 49

Podobne dokumenty

Wstep do Informatyki - Dr hab. Bożena Woźna

Wstep do Informatyki - Dr hab. Bożena Woźna ˛ rejestracja za opłata˛ jeśli sie˛ je dłużej używa. Freeware - programy darmowe. Adware - programy darmowe, ale pokazujace ˛ reklamy. Middleware - oprogramowanie pośredniczace ˛ (np. spyware).

Bardziej szczegółowo