Sortowanie liniowe - PLD Linux Distribution

Download Report

Transcript Sortowanie liniowe - PLD Linux Distribution

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ów wstawia je od razu na odpowiednie miejsce. Algorytm polega na zliczaniu wystąpień każdego z elementów, a następnie wykorzystaniu tej informacji do określenia ilości elementów znajdujących się przed każ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ści najwię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żliwia uruchomienie algorytmu na komputerze domowym (> 4GB pamięci)  Rozsądną metodą jest wyznaczenie maksimum ciągu wejściowego i zarezerwowanie tylko potrzebnej pamięci. Tu z kolei może wystąpić problem „elementów rzadkich”, który rozwiązać możemy implementując tablicę na liście (najlepiej dwukierunkowej).

Countsort c.d.

Symulacja sortowania

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

Bucketsort

(sortowanie kubełkowe)

Sortowanie to posiada ŚREDNIĄ złożoność obliczeniową równomiernie wypełniały przedział od 0 do maksimum.

O

(n). Zależność ta w rzeczywistości będzie tym bliższa liniowej im sortowane elementy będą bardziej 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

Podsumowanie algorytmów liniowych Countsort

Zalety i Wady  bardzo szybki  stabilny • bardzo duże zapotrzebowanie na pamięć przy sortowaniu wartości >16-bitowych • sortowanie wyłącznie liczb całkowitych

Radixsort Bucketsort

 stabilny  bardzo dobre rozwiązanie w połączeniu z countsort  zastosowanie przy sortowaniu rekordów o zhierarchizowanych kluczach częściowych • sortowanie wyłącznie liczb całkowitych  sortowanie liczb zmiennoprzecinkowych (w przeciwieństwie do poprzednich) • zmienna złożoność obliczeniowa oraz wysoka jej zależność od danych wejściowych: rozpiętość

O

(n) –

O

(n^2) !