Algorytmy (6) 2000/2001

Transkrypt

Algorytmy (6) 2000/2001
• Jednym z najprostszych sposobów porządkowania jest technika stosowana
przy sortowaniu listów:
– Listy rozkładane są do różnych przegródek.
– O tym, do której z nich trafi koperta, decydują różne fragmenty adresu.
– Na przykład dla listów zagranicznych są przeznaczone przegródki oznaczone
nazwami państw.
– Przy obecnie obowiązującym systemie oznaczania adresów kodami, ten sposób
sortowania przesyłek krajowych jest bardzo uciążliwy - liczba różnych kodów
jest tak duża, że nie można pozwolić sobie na sortowanie tą metodą, przyjmując
za "nazwę przegródki" numer kodowy odbiorcy.
– Naszkicowana metoda nazywa się porządkowaniem kubełkowym lub
koszykowym, w zależności od tego, jak są nazwane pojemniki, do których
wrzuca się porządkowane elementy (obiekty).
• By zbiór został całkowicie uporządkowany, kubełki wypełnione w
pierwszym etapie, muszą być opróżniane w następnym według kolejności
przypisanych im nazw, dając kolejność elementów rozważanego zbioru.
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
1
• Zastosujemy teraz algorytm kubełkowy do uporządkowania liter tworzących
słowo ABRAKADABRA.
• To słowo ma pięć różnych liter: A, B, D, K i R. Zakładamy więc pięć
kubełków, oznaczamy je tymi literami i ustawiamy w takiej kolejności, w
jakiej te litery występują w alfabecie.
• W pierwszym kroku algorytmu przeglądamy to słowo i rozdzielamy jego
litery do kubełków.
• W drugim kroku tworzymy już uporządkowany ciąg, opróżniając kubełki w
kolejności ich ustawienia.
• Kolejne wystąpienia tej samej litery są oznaczone kolejnymi indeksami, by
można było łatwo odnaleźć poszczególne litery w kubełkach, a później w
uporządkowanym ciągu.
• Litery są umieszczane w kubełkach w kolejności występowania w słowie.
• Kubełki nie są domknięte od dołu - są one opróżniane od dołu. Dzięki temu
litery opuszczają kubełki w takiej samej kolejności, w jakiej do nich trafiają.
• Przypomina to znaną z życia kolejkę, w której nie obowiązują żadne
przywileje.
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
2
• Kolejka jest jedną z podstawowych struktur danych występujących w
algorytmach. Jest to struktura FIFO: First Input First Output.
• Ten sposób opróżniania kubełków gwarantuje, że poszczególne wystąpienia
danej litery są w takiej samej kolejności w słowie ABRAKADABRA i w
uporządkowanym ciągu liter.
A1B1R1A2K1A3D1A4B2R2A5
A1A2A3A4A5B1B2D1K1R1R2
A5
A4
A3
A2
A1
A
Luty 2001
B2
B1
B
D1
D
Algorytmy (6) 2000/2001
K1
K
R2
R1
R
[email protected]
3
Porządkowanie pozycyjne
• Czy można rozszerzyć kubełkowe porządkowanie liter na porządkowanie
całych słów? Aby porządkować słowa, należy najpierw określić, które z
dwóch danych słów powinno wystąpić wcześniej.
• Najprościej jest przyjąć naturalny porządek między słowami, nazywamy
porządkiem leksykograficznym lub słownikowym, czyli taki, jaki jest w
słownikach i w encyklopediach. Można go zdefiniować następująco:
– jeśli dwa słowa mają jednakową długość, to szukamy w nich pierwszej pozycji,
na której się różnią i wcześniejsze jest to słowo, które ma na tej pozycji
wcześniejszą literę - np. ARAB jest wcześniejsze od ARAK, gdyż B występuje w
alfabecie przed K, a DRAB jest wcześniejsze niż KRAB, gdyż D poprzedza K w
alfabecie;
– jeśli słowa mają nierówną długość, to albo szukamy pierwszej pozycji, na której
się różnią i litera na tej pozycji decyduje o miejscu ustawienia słowa (podobnie
jak w przypadku słów o równej długości) - np. słowo BAR jest wcześniejsze od
BRDA, gdyż A poprzedza R, albo jedno słowo jest częścią drugiego, wtedy
występuje w słowniku przed każdym słowem, w którym jest zawarte na początku
np. BAR poprzedza BARD i BARK.
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
4
•
•
•
•
•
Porządkowanie słów o jednakowej długości
Jeśli słowa są jednakowej długości i różnią się jedynie na ostatniej pozycji to
ich pozycja w słowniku jest wyznaczona przez kolejność ostatnich liter.
Kolejność słów różniących się na dwóch ostatnich pozycjach jest
wyznaczona przez kolejność par liter na tych pozycjach.
Porządkowanie słów o jednakowej długości polega na porządkowaniu ich od
końca, pozycja po pozycji, z zastosowaniem do każdej pozycji algorytmu
kubełkowego.
Takie postępowanie nosi nazwę algorytmu porządkowania pozycyjnego:
porządkowane obiekty występują w postaci pozycyjnej i porządkowanie
odbywa się względem każdej pozycji.
Ideę porządkowania pozycyjnego wprowadził Herman Hollerith, który pod
koniec XIX wieku budował maszyny do automatyzacji przetwarzania
wyników spisu ludności. Założona wtedy firma przekształciła się w koncern
IBM (International Business Machines).
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
5
•
•
•
•
•
Porządkowanie słów nierównej długości
W tym przypadku słowa należy także przeglądać od ostatnich liter.
Należy jedynie rozstrzygnąć, gdzie względem dłuższych słów należy
umieścić krótsze.
W algorytmie najpierw powinny być zrównane pierwsze litery wszystkich
słów - wszystkie słowa należy jakby „dosunąć” do lewej strony.
W przypadku „krótszego” słowa, gdy porządkujemy względem pozycji, która
wykracza poza jego prawą skrajną literę dopisujemy to słowo do tworzonego
w danej iteracji ciągu wszystkich słów.
Krótsze słowa, czyli takie, które nie zawierają litery na analizowanej pozycji
w danej iteracji są cyklicznie przepisywane na koniec ciągu słów podczas
jego przeglądania.
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
6
• niebieski: litery, według których będzie przebiegać następna iteracja.
• czerwony: te same litery (w następnej kolumnie!!!) po uporządkowaniu
względem nich.
BAR
PO
RADAR
BARD
Luty 2001
BAR
PO
BARD
RADAR
BAR
PO
RADAR
BARD
PO
BAR
BARD
RADAR
Algorytmy (6) 2000/2001
BAR
BARD
RADAR
PO
BAR
BARD
PO
RADAR
[email protected]
7
Algorytm porządkowania pozycyjnego
Dane: Ciąg elementów, z których każdy jest układem pozycji wypełnionych
znakami, dozwolonymi dla poszczególnych pozycji.
Wynik: Uporządkowanie danego ciągu zgodnie z leksykograficzna relacją,
zdefiniowaną odpowiednio do kolejności pozycji i porządku znaków,
które mogą wypełniać poszczególne pozycje.
• Krok 1:
Dla kolejnych pozycji w elementach, w kolejności od najmniej
znaczącej do najbardziej znaczącej, wykonaj kroki 2, 3 i 4.
• Krok 2:
Załóż kubełki dla każdego możliwego znaku, jaki może
wystąpić na bieżącej pozycji w porządkowanych elementach.
Ustaw te kubełki zgodnie z porządkiem tych znaków.
• Krok 3:
Dla wszystkich elementów z porządkowanego ciągu wykonaj:
– jeśli rozważana pozycja w elemencie jest pusta, to dopisz ten
element do końca porządkowanego ciągu,
– w przeciwnym razie - włóż ten element do kubełka oznaczonego
znakiem stojącym na rozważanej pozycji.
• Krok 4:
Luty 2001
Dla kolejnych kubełków: przenieść elementy z kubełka na
koniec porządkowanego ciągu w takiej samej kolejności, w
jakiej były w nim umieszczane.
Algorytmy (6) 2000/2001
[email protected]
8
Złożoność porządkowania pozycyjnego
• Zarówno w algorytmach porządkowania kilku liczb, jak i w algorytmach
porządkowania bąbelkowego i przez wybór, podstawową operacją
wykonywaną na elementach jest ich porównywanie parami .
• Dlatego ocenę efektywności tych algorytmów pod względem liczby
wykonywanych operacji podajemy w zależności od liczby porównań.
• W algorytmach porządkowania kubełkowego i pozycyjnego nie są
wykonywane żadne operacje porównywania między porządkowanymi
elementami. Podstawową operacją jest natomiast przemieszczenie elementu,
z porządkowanego ciągu do kubełka (w kroku 3) lub na koniec ciągu (w
krokach 3 i 4).
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
9
• Oznaczmy przez l maksymalną długość porządkowanych elementów, przez
m liczbę różnych znaków, jakie mogą wystąpić na pozycji i w
porządkowanych elementach (i=1, 2, ..., l), przez n - liczbą porządkowanych
elementów, a przez kj - liczbę znaków w j-tym elemencie (j=1, 2, ..., n). Z
dyskusji powyżej wynika, że w algorytmie porządkowania pozycyjnego
wykonujemy:
– K=k1+k2+...+kn umieszczeń porządkowanych elementów;
– M=2(m1+m2+...+ml) operacji na kubełkach: otwierania kubełków w kroku 2 i
dołączania kubełków do ciągu porządkowanych elementów w kroku 4.
• Załóżmy, ze porządkujemy słowa języka polskiego. Wtedy złożoność
algorytmu porządkowania pozycyjnego wynosi K+2*32l wszystkich działań,
gdzie K jest sumaryczną długością słów, a l jest maksymalną długością
słowa.
• Dla uproszczenia przyjęliśmy tutaj, że na każdej pozycji w słowie może
wystąpić każda z 32 liter alfabetu polskiego.
• Algorytm pozycyjnego porządkowania jest optymalny w tym sensie, że każda
pozycja w każdym elemencie jest sprawdzana tylko raz.
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
10
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
11
Luty 2001
Algorytmy (6) 2000/2001
[email protected]
12

Podobne dokumenty