100 likes | 349 Views
Sortowanie. Algorytmy o liniowej złożoności obliczeniowej ( O (x) ). Countsort (sortowanie licznikowe).
E N D
Sortowanie Algorytmy o liniowej złożoności obliczeniowej ( O(x) )
Countsort(sortowanie licznikowe) Algorytmy takie jak Mergesort, Combsort czy Quicksort w każdym z kroków „zbliżają się”do rozwiązania. Countsort po zgromadzeniu informacji na temat wystąpień elementówwstawia je od razu na odpowiednie miejsce. Algorytm polega na zliczaniu wystąpień każdego z elementów, a następniewykorzystaniu tej informacji do określenia ilości elementów znajdujących się przedkażdym elementem, co jednoznacznie określa jego pozycje w uporządkowanym ciągu.Dodatkowe dane gromadzone są w tablicy, której liczba elementów odpowiada wielkościnajwiększego elementu w sortowanym ciągu. Można zarezerwować tablicę o ilości elementów odpowiadającej maksymalnej wartości,jaką może przyjąć typ składowy tablicy wejściowej, co przy typie 4 bajtowym uniemożliwiauruchomienie algorytmu na komputerze domowym (> 4GB pamięci) Rozsądną metodą jest wyznaczenie maksimum ciągu wejściowego i zarezerwowanietylko potrzebnej pamięci. Tu z kolei może wystąpić problem „elementów rzadkich”, któryrozwiązać możemy implementując tablicę na liście (najlepiej dwukierunkowej).
Countsort c.d. Symulacja sortowania • Złożoność obliczeniowa: O(n+k)(k – maksimum ciągu wejściowego) • Dodatkowa pamięć: n*typ1+ k*typ2 B(typ1, typ2 – rozmiar zmiennych: wejściowej, licznika wystąpień) • Stabilność: TAK • Implemetacja wielowątkowa: NIE • Ograniczenia i wady: • możliwość sortowania wyłącznie liczb całkowitych • duża ilość niezbędnej dodatkowej pamięci np. dla 500 liczb z zakresu (0; 10.000) >128 KB
Radixsort(sortowanie pozycyjne) Idea polega na podzieleniu sortowanych wartości (kluczy sortowanych rekordów) na mniejsze „porcje” (np. po 4 bity, po literze), a następnie wykorzystaniu jakiegokolwiek STABILNEGO algorytmu sortującego do posortowania według kolejnych „porcji” w ODWROTNEJ kolejności. Metodę tą wykorzystujemy także przy sortowaniu rekordów na zhierarchizowanych kluczach częściowych. Określamy to wtedy mianem strategii LSD (Least Significant Digit first) Radixsort w połączeniu z Countsort umożliwia obejście głównej wady tego drugiego: dużej ilości pamięci potrzebnej do liczenia wystąpień elementów.Np. Po podzieleniu wartości na „porcje” 8 bajtowe, możemy posortować ciąg 32 bitowych wartości w 4 krokach, używając tylko 256 dodatkowych komórek pamięci. (sam countsort: 1 krok i do 4.294.967.296 komórek pamięci)Dzięki ściśle określonej zależności między ilością kroków a pamięcią możemy dowolnie „skonfigurować” ten algorytm w zależności od dostępnych zasobów pamięci i oczekiwanej prędkości działania.
Radixsort c.d. Symulacja sortowania • /przy wykorzystaniu countsort jako algorytmu sortowania/ • Złożoność obliczeniowa: O(dn+dk)(k – maksimum ciągu wejściowego, d – ilość kroków) • Dodatkowa pamięć: n*typ1+ p*typ2 B(typ1, typ2 – rozmiar zmiennych: wejściowej, licznika wystąpieńp – 2^ilość_bitów_w_porcji) • Stabilność: TAK • Implemetacja wielowątkowa: NIE • Ograniczenia i wady: • możliwość sortowania wyłącznie liczb całkowitych (i słów)
Bucketsort(sortowanie kubełkowe) Sortowanie to posiada ŚREDNIĄ złożoność obliczeniową O(n). Zależność ta w rzeczywistości będzie tym bliższa liniowej im sortowane elementy będą bardziej równomiernie wypełniały przedział od 0 do maksimum. Metoda polega na „rozrzuceniu” n wartości do n „kubełków”, gdzie każdemu kubełkowi przydzielamy wąski przedział wartości elementów, które do niego mogą wpadać. Wartości te z założenia muszą należeć do przedziału [0; 1). Kiedy tak nie jest, musimy je najpierw znormalizować (dzieląc każdą przez maksimum+1). Następną czynnością jest posortowanie wartości w każdym z kubełków metodą prostą. Ponieważ sortujemy wtedy jednorazowo 1/n całego znioru: czas składowego sortowania to (n/n)^2 czyli 1 ! Po n krokach uzyskujemy złożoność O(n) (to oczywiście tylko oczekiwana złożoność).
Bucketsort c.d. Symulacja sortowania • Złożoność obliczeniowa: zmierza do O(n) • Dodatkowa pamięć: n*4 + n*(4 + typ)przy założeniu, że użyjemy tablicy list na platformie 32 bitowej • Stabilność: ?Zależy od użytego sortowania prostego • Implemetacja wielowątkowa: ?? • Ograniczenia i wady: • w pesymistycznym przypadku złożonośc może spaść do O(n^2)
Podsumowanie algorytmów liniowych Zalety i Wady