Algorytmy i Struktury Danych. Problem Sortowania, cd. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 pomiędzy elementami jest opercja porównywania pary elementów (mniejsze niż, większe niż, mniejsze lub równe, większe lub równe, równe). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 pomiędzy elementami jest opercja porównywania pary elementów (mniejsze niż, większe niż, mniejsze lub równe, większe 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 3 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 pomiędzy elementami jest opercja porównywania pary elementów (mniejsze niż, większe niż, mniejsze lub równe, większe 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 log 2 n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 pomiędzy elementami jest opercja porównywania pary elementów (mniejsze niż, większe niż, mniejsze lub równe, większe 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 log 2 n). Czy można mieć lepszy algorytm sortujacy? Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 pomiędzy elementami jest opercja porównywania pary elementów (mniejsze niż, większe niż, mniejsze lub równe, większe 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 log 2 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 3 2 / 49
Drzewo decyzyjne - przykład Każdy wierzchołek wewnętrzny etykietowany jest przez i : j, gdzie i, j {1,..., n}. Lewe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j Prawe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j 1 2 3 Sortowanie ciagu (a 1, a 2,..., a n ): 1:2 2:3 1:3 1:3 2 1 3 2:3 1 3 2 3 1 2 2 3 1 3 2 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 3 / 49
Drzewo decyzyjne - przykład Każdy wierzchołek wewnętrzny etykietowany jest przez i : j, gdzie i, j {1,..., n}. Lewe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j Prawe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j 1 2 3 Sortowanie ciagu (a 1, a 2,..., a n ) = (9, 4, 6): 1:2 2:3 1:3 1:3 2 1 3 2:3 1 3 2 3 1 2 9 4 2 3 1 3 2 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 4 / 49
Drzewo decyzyjne - przykład Każdy wierzchołek wewnętrzny etykietowany jest przez i : j, gdzie i, j {1,..., n}. Lewe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j Prawe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j 1 2 3 Sortowanie ciagu (a 1, a 2,..., a n ) = (9, 4, 6): 1:2 2:3 1:3 1:3 2 1 3 2:3 1 3 2 3 1 2 9 6 2 3 1 3 2 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 5 / 49
Drzewo decyzyjne - przykład Każdy wierzchołek wewnętrzny etykietowany jest przez i : j, gdzie i, j {1,..., n}. Lewe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j Prawe podrzewo pokazuje kolejne porównywania w przypadku, gdy a i a j 1 2 3 Sortowanie ciagu (a 1, a 2,..., a n ) = (9, 4, 6): 1:2 2:3 1:3 1:3 2 1 3 2:3 1 3 2 3 1 2 4 6 2 3 1 3 2 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 6 / 49
Drzewo decyzyjne - przykład Każdy liść zawiera permutację π(1),π(2),...,π(n) wskazujac a ustanowiony porzadek a π(1) a π(2) a π(n). 1 2 3 Sortowanie ciagu (a 1, a 2,..., a n ) = (9, 4, 6): 1:2 2:3 1:3 1:3 2 1 3 2:3 1 3 2 3 1 2 2 3 1 3 2 1 4 6 9 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 7 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę sortujac a oparta na modelu porównywania elementów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 8 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę 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 3 8 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę 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 3 8 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę 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 wględu na rozmiar danych wejściowych. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 8 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę 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 wględu 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 3 8 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę 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 wględu 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 3 8 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę 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 wględu 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 3 8 / 49
Drzewo decyzyjne Drzewo decyzyjne może modelować dowolna metodę 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 wględu 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 3 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 log 2 (n)). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 log 2 (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 3 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 log 2 (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 2 h liści. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 log 2 (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 2 h liści. Zatem mamy: n! 2 h h log 2 (n!) log 2 ((n/e) n ) = n log 2 (n) n log 2 (e) h Ω(n log 2 (n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 9 / 49
Sortowanie stabilne Dana metoda sortowania jest stabilna, jeśli zachowuje względna kolejność elementów ze zdublowanymi kluczami. Przykładowo, jeżeli ułożona alfabetycznie listę studentów posortujemy według roku studiów, to metoda stabilna zwróci w wyniku alfabetycznie ułożona listę osób podzielona ze wzgledu na rok studiów. Metoda niestabilna pozwala na sortowanie tylko względem jednego klucza. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 10 / 49
Sortowanie stabilne - przykład Dane Wejściowe Sortowanie niestabilne Sortowanie stabilne Adams 1 Adams 1 Adams 1 Black 2 Smith 1 Smith 1 Brown 4 Washington 2 Black 2 Jackson 2 Jackson 2 Jackson 2 Jones 4 Black 2 Washington 2 Smith 1 White 3 White 3 Thompson 4 Wilson 3 Wilson 3 Washington 2 Thompson 4 Brown 4 White 3 Brown 4 Jones 4 Wilson 3 Jones 4 Thompson 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 następnej części wykładu Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 3 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 3 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 3 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 występuje 2 razy Liczba 2 występuje 1 raz Liczba 3 występuje 2 razy Liczba 4 występuje 0 razy Liczba 5 występuje 0 razy Liczba 6 występuje 1 raz Liczba 7 występuje 2 razy Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 występuje 2 razy Liczba 2 występuje 1 raz Liczba 3 występuje 2 razy Liczba 4 występuje 0 razy Liczba 5 występuje 0 razy Liczba 6 występuje 1 raz Liczba 7 występuje 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 3 14 / 49
Sortowanie przez zliczanie - uwagi Proces zliczania odbywa się w jednym kroku Nie dochodzi do ani jednej zamiany elementów Proces tworzenia tablicy wynikowej odbywa się w jednym kroku Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 liczbę 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 3 16 / 49
Sortowanie przez zliczanie -przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 17 / 49
Sortowanie przez zliczanie - pętla nr. 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 18 / 49
Sortowanie przez zliczanie - pętla nr. 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 19 / 49
Sortowanie przez zliczanie - pętla nr. 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 20 / 49
Sortowanie przez zliczanie - pętla nr. 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 21 / 49
Sortowanie przez zliczanie - pętla nr. 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 22 / 49
Sortowanie przez zliczanie - pętla nr. 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 23 / 49
Sortowanie przez zliczanie - pętla nr. 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 24 / 49
Sortowanie przez zliczanie - pętla nr. 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 25 / 49
Sortowanie przez zliczanie - pętla nr. 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 26 / 49
Sortowanie przez zliczanie - pętla nr. 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 27 / 49
Sortowanie przez zliczanie - pętla nr. 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 28 / 49
Sortowanie przez zliczanie - pętla nr. 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 29 / 49
Sortowanie przez zliczanie - pętla nr. 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 30 / 49
Sortowanie przez zliczanie - pętla nr. 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 3 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 3 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 3 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 3 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 3 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 = 2 8 = 256 - pomocnicza tablica ma zatem rozmiar 256. Wówczas counting-sort działa naprawdę szybko, tj. w czasie (256+n) = Θ(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 = 2 8 = 256 - pomocnicza tablica ma zatem rozmiar 256. Wówczas counting-sort działa naprawdę 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 3 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 = 2 8 = 256 - pomocnicza tablica ma zatem rozmiar 256. Wówczas counting-sort działa naprawdę 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 = 2 32, 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 3 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 3 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ł firmę Tabulating Machine Company, z której w 1924 wyłoniła się firma IBM (International Business Machines). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 35 / 49
Karta dziurkowana Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 36 / 49
Herman Hollerith (1860-1929) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 37 / 49
Geneza sortowania pozycyjnego Oto cytat z roku 1889 opisujacy patent (maszynę 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 3 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 3 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) względem 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 3 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 3 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 3 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 3 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 3 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 3 41 / 49
Sortowanie pozycyjne - przykład Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 42 / 49
Sortowanie Pozycyjne -poprawność Indukcja ze względu na pozycje cyfry Załóżmy, że liczby sa posortowane niemalejaco względem t 1 cyfry. Sortujemy według cyfry t Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 43 / 49
Sortowanie Pozycyjne -poprawność Sortujemy według cyfry t Liczby różnia się na t-tej cyfrze: Ponieważ sortujemy względem 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 3 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 3 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 3 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 3 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 3 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 3 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 3 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 3 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 będzie wykonany w czsie Θ(n+2 r ). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 będzie wykonany w czsie Θ(n+2 r ). Ponieważ w sortowaniu pozycyjnym będziemy mieli b/r przebiegów, to czas wykonania sortowania będzie: T(n, b) = Θ( b r (n+2r )) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 47 / 49
Wybór r T(n, b) = Θ( b r (n+2r )) 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 będzie tylko kilka przebiegów. Należy jednka zwrócić uwagę, aby r nie było zbyć duże, gdyż jeśli r > log 2 (n), to czas sorowania pomocniczego (przez zliczanie) i potrzebna mu pamięć będzie zbyt duża!!! Aby zminimalizować T(n, b), należy wybrać r = log 2 (n), co implikuje T(n, b) = Θ(b n/log 2 (n))). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 48 / 49
Wybór r T(n, b) = Θ( b r (n+2r )) 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 będzie tylko kilka przebiegów. Należy jednka zwrócić uwagę, aby r nie było zbyć duże, gdyż jeśli r > log 2 (n), to czas sorowania pomocniczego (przez zliczanie) i potrzebna mu pamięć będzie zbyt duża!!! Aby zminimalizować T(n, b), należy wybrać r = log 2 (n), co implikuje T(n, b) = Θ(b n/log 2 (n))). Powyższe r można uzyskać poprzez zróżniczkowanie fukcji T(n, b) względem zmiennej r i podstawieniu pod powstała funkcję wartości 0. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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 3 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/log 2 (n))) = 32 2000/log 2 (2000) 3 2000 operacji. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 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/log 2 (n))) = 32 2000/log 2 (2000) 3 2000 operacji. Dla porównania, sortowanie szybkie wykona n log 2 (n) = 2000 log 2 (2000) 11 2000 operacji. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 3 49 / 49