55
Algoritmy a programovací techniky Gymnázium, Brno, Vídeňská 47

Algoritmy a programovac í techniky

  • Upload
    urania

  • View
    48

  • Download
    5

Embed Size (px)

DESCRIPTION

Algoritmy a programovac í techniky. Gymnázium, Brno, Vídeňská 47. Třídící algoritmy (obecná charakteristika). tříděním (resp. řazením ) rozumíme uspořádání množiny dat podle zvolené klíčové položky (vzestupně nebo sestupně podle velikosti) - PowerPoint PPT Presentation

Citation preview

Page 1: Algoritmy a programovac í techniky

Algoritmy a programovací techniky

Gymnázium, Brno, Vídeňská 47

Page 2: Algoritmy a programovac í techniky

Třídící algoritmy(obecná charakteristika)

tříděnímtříděním (resp. (resp. řazenímřazením) rozumíme ) rozumíme uspořádání množiny dat podle zvolené uspořádání množiny dat podle zvolené klíčové položky (vzestupně nebo sestupně klíčové položky (vzestupně nebo sestupně podle velikosti)podle velikosti)

se setříděnými daty se lépe pracuje se setříděnými daty se lépe pracuje (především je (především je usnadněno usnadněno pozdější pozdější vyhledávánívyhledávání))

Page 3: Algoritmy a programovac í techniky

Třídící algoritmy(obecná charakteristika)

• v programech obvykle třídíme objekty, které lze v programech obvykle třídíme objekty, které lze popsat popsat datovou strukturou datovou strukturou typutypu záznam záznam (v Pascalu) (v Pascalu)

• v takové struktuře bývá označena jedna položka jako v takové struktuře bývá označena jedna položka jako klíčová (klíčová (klíčklíč))

• podle klíče sepodle klíče se pak pak záznamy řadí záznamy řadí (vzestupně nebo (vzestupně nebo sestupně)sestupně)

• ostatní položkyostatní položky jsou z hlediska třídění nevýznamné, jsou z hlediska třídění nevýznamné, pouze pouze se přemisťujíse přemisťují

Page 4: Algoritmy a programovac í techniky

Třídící algoritmy(základní rozdělení)

Vnitřní třídění

• použijeme tehdy, pokud lze množinu tříděných dat použijeme tehdy, pokud lze množinu tříděných dat umístit do vnitřní paměti počítačeumístit do vnitřní paměti počítače

• data jsoudata jsou uložena uložena v poliv poli a algoritmy využívají možnosti a algoritmy využívají možnosti přímého přístupu k jednotlivým prvkům (třídění polí)přímého přístupu k jednotlivým prvkům (třídění polí)

Vnější tříděníVnější třídění

• použijeme tehdy, kdy se tříděná data nevejdou do použijeme tehdy, kdy se tříděná data nevejdou do vnitřní pamětivnitřní paměti

• data jsoudata jsou umístěna umístěna v souborechv souborech na vnějším na vnějším paměťovém médiupaměťovém médiu

• třídění je založeno na opakovaném čtení a vytváření třídění je založeno na opakovaném čtení a vytváření souborůsouborů

Page 5: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění(definice typů a konstant)

const Max = … {maxim{maximální rozsah poleální rozsah pole}}

type TPolozka = integer; TPole = array [0..Max] of

TPolozka;

• pro jednoduchost budeme v třídit položky typu pro jednoduchost budeme v třídit položky typu integerinteger

• vstupní posloupnostvstupní posloupnost je do pole ukládána od pozice s je do pole ukládána od pozice s indexem indexem 11

• pozice s indexempozice s indexem 0 0 je využívána v některých je využívána v některých metodách metodách k pomocným účelůmk pomocným účelům

Page 6: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění(metody)

Třídění přímým výběrem (SelectSort)Třídění přímým výběrem (SelectSort)

Třídění přímým vkládáním (InsertSort)Třídění přímým vkládáním (InsertSort)

Třídění přímou výměnou (BubbleSort)Třídění přímou výměnou (BubbleSort)

Třídění přetřásáním (ShakerSort)Třídění přetřásáním (ShakerSort)

Třídění binárním vkládáním (Binary Třídění binárním vkládáním (Binary InsertSort)InsertSort)

Třídění rozdělováním (QuickSort)Třídění rozdělováním (QuickSort)

Page 7: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění

Třídění přímým výběrem (SelectSort)

Page 8: Algoritmy a programovac í techniky

SelectSort(popis metody)

tříděná posloupnost je rozdělená na dvě části

z nesetříděné části vybíráme minimální prvek

tento prvek je vložen na první místo nesetříděné části

velikost setříděné části se tak zvýší o jeden prvek

PříkladPříklad ImplementaceImplementace

Page 9: Algoritmy a programovac í techniky

754321 427135

hledání minima v nesetříděné části…hledání minima v nesetříděné části…setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnost

min

SelectSort(příklad)

min min min min min

Popis metodyPopis metody ImplementaceImplementace

Page 10: Algoritmy a programovac í techniky

SelectSort(implementace)

procedure SelectSort (var A : TPole; N : integer); {N…počet prvků pole}

var i,j,k : integer; {indexy prvků} X : TPolozka; {pomocná proměnná pro výměnu prvků}

beginfor i:=1 to N-1 do

begin k:=i; {k…index 1. prvku nesetříděné části}

j:=i+1 to N do if A[j]<A[k] then k:=j; if k>i then

begin X:=A[k]; A[k]:=A[i]; A[i]:=X end endend;

PříkladPříklad Popis metodyPopis metody

Page 11: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění

Třídění přímým vkládáním (InsertSort)

Page 12: Algoritmy a programovac í techniky

InsertSort(popis metody)

princip je podobný metodě, jakou si karetní hráč obvykle seřazuje karty v ruce, když po rozdání karet bere karty ze stolu jednu po druhé a vkládá je mezi už seřazené karty

posloupnost tříděných položek je opět rozdělena na setříděnou a nesetříděnou část

z nesetříděné části vybíráme prvky a zařazujeme je do setříděné části tak, aby tato část zůstala setříděná

tento postup opakujeme tak dlouho, dokud není nesetříděná část prázdná

PříkladPříklad ImplementaceImplementace

Page 13: Algoritmy a programovac í techniky

754321

nnesetesetříděná vstupní posloupnostříděná vstupní posloupnost

23714 427135

hledání pozice v setříděné části…hledání pozice v setříděné části…setsetříděná posloupnostříděná posloupnost

InsertSort(příklad)

zarážka

Popis metodyPopis metody ImplementaceImplementace

k zatříděník zatříděník zatříděník zatříděník zatřídění

Page 14: Algoritmy a programovac í techniky

InsertSort(implementace)

procedure InsertSort (var A : TPole; N : integer); {N…počet prvků pole}

var i, j : integer; {indexy prvků}

beginfor i:=2 to N do {zatřiďujeme číslo z pozice i}

begin A[0]:=A[i]; {A[0]… zarážka potřebná v případě, kdy

zatřiďovaný j:=i-1; prvek patří podle velikosti na začátek setříděné části}

while A[i]<A[j] do beginA[j+1]:=A[j] j:=j-1;

end A[j+1]:= A[i];

endend;

PříkladPříklad Popis metodyPopis metody

Page 15: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění

Třídění přímou výměnou (BubbleSort)

Page 16: Algoritmy a programovac í techniky

BubbleSort(popis metody)

PříkladPříklad ImplementaceImplementace

pole je opět rozděleno na část setříděnou a nesetříděnou

opakovaně porovnáváme sousední prvky v nesetříděné části pole

jestliže testovaná dvojice není uspořádaná, pak vyměníme pozice testovaných prvků

výsledkem je “probublání” minimálního prvku nesetříděné části na její začátek

velikost setříděné části se tak zvýší o jeden prvek

Page 17: Algoritmy a programovac í techniky

312315 754 427

setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnost

BubbleSort(příklad)

Popis metodyPopis metody ImplementaceImplementace

porovnávání a výměna sousedních porovnávání a výměna sousedních prvků...prvků...

Page 18: Algoritmy a programovac í techniky

BubbleSort(implementace)

procedure BubbleSort (var A : TPole; N : integer); {N…počet prvků pole}

var i, j : integer; {indexy prvků}

X : TPolozka; {pro výměnu prvků}

beginfor i:= 2 to N do

begin for j:= N downto i do

if A[j]<A[j-1] do begin {vyměnit sousední prvky?}

X:=A[j];A[i]:=A[j-1];A[j-1]:=X;

end; end

end;PříkladPříklad Popis metodyPopis metody

Page 19: Algoritmy a programovac í techniky

BubbleSort(možnosti optimalizace algoritmu)

321 457

vstupní posloupnost dat

po “probublání” prvního prvku (č. 4)

321 574

• velká část pole je už po prvním “probublání” setříděna • stačí tedy “zapamatovat” si pozici (index) poslední

výměny• část pole od tohoto indexu je setříděná• následující “probublávání” stačí tedy provádět k této

pozici

pozice poslední výměny prvků

Page 20: Algoritmy a programovac í techniky

BubbleSort(možnosti optimalizace algoritmu)

321 745

vstupní posloupnost dat

“probubláním” jediného prvku (4) se celá posloupnost setřídí

321 754

algoritmus lze tedy ukončit poté, co během “probublávání” libovolného prvku nenastane výměna

během následujícího “probublávání” prvku (7) nenastane žádná výměna

321 754

Page 21: Algoritmy a programovac í techniky

BubbleSort(implementace efektivního algoritmu)

procedure BubbleSort (var A : TPole; N : integer); {N…počet prvků pole}

var i, j, Pozice : integer; {i,j…indexy prvků, Pozice…index poslední výměny}

X : TPolozka; {pro výměnu prvků}

Vymena : boolean; {informace o tom, zda nastala během “probublávání” výměna}

begini:= 2;repeat

Vymena:=true; for j:= N downto i do

if A[j]<A[j-1] do begin {vyměnit sousední prvky?} X:=A[j]; A[i]:=A[j-1]; A[j-1]:=X; Vymena:=false; {nastala výměna} Pozice:=j; {pozice zatím poslední výměny} end;

i:=Pozice;until Vymena

end;

Page 22: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění

Třídění přetřásáním (ShakerSort)

Page 23: Algoritmy a programovac í techniky

ShakerSort(popis metody)

PříkladPříklad ImplementaceImplementace

modifikace bublinového třídění

metoda prochází pole střídavě zleva-doprava (na konec nesetříděné části pole “probublá” maximální prvek) a zprava-doleva (na začátek nesetříděné části pole “probublá” minimální prvek)

setříděné části jsou v průběhu třídění na obou koncích pole a při ukončení třídění se obě části spojí

Page 24: Algoritmy a programovac í techniky

71

porovnávání a výměna sousedních prvků porovnávání a výměna sousedních prvků zleva dopravazleva doprava ......

2

porovnávání a výměna sousedních prvků porovnávání a výměna sousedních prvků zprava dolevazprava doleva......

23 4 5 741

setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnost

5 3

ShakerSort(příklad)

Popis metodyPopis metody ImplementaceImplementace

Page 25: Algoritmy a programovac í techniky

ShakerSort(implementace)

procedure ShakerSort (var A : TPole; N : integer); {N…počet prvků pole}

var i, j : integer; {indexy prvků}

X : TPolozka; {pro výměnu prvků}

beginfor i:= 2 to N do

begin for j:= N downto i do {probublávání zleva doprava}

if A[j]<A[j-1] do begin {vyměnit sousední prvky?} X:=A[j]; A[i]:=A[j-1]; A[j-1]:=X; end;

for j:= i to N- i do {probublávání zprava doleva} if A[j]>A[j+1] do begin {vyměnit sousední prvky?}

X:=A[j]; A[i]:=A[j+1]; A[j+1]:=X; end;

endend;

PříkladPříklad Popis metodyPopis metody

Page 26: Algoritmy a programovac í techniky

ShakerSort(optimalizace)

Tuto metodu lze podobně jako bublinkové tříděníTuto metodu lze podobně jako bublinkové tříděníoptimalizovat dvěma způsoby:optimalizovat dvěma způsoby:

• pamatovat si pamatovat si index poslední výměny (v obou index poslední výměny (v obou směrech)směrech) a od této pozice začít probublávat a od této pozice začít probublávat opačným směremopačným směrem

• evidovat, zdaevidovat, zda během probublávání během probublávání nastala nějaká nastala nějaká výměnavýměna, pokud nenastala je pole setříděno a lze , pokud nenastala je pole setříděno a lze provádění algoritmu ukončitprovádění algoritmu ukončit

Page 27: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění

Třídění binárním vkládáním (Binary InsertSort)

Page 28: Algoritmy a programovac í techniky

Binary InsertSort(popis metody)

PříkladPříklad ImplementaceImplementace

Při třídění vkládáním je možné pozici zatřiďovaného prvku v nesetříděné části posloupnosti najít efektivněji metodou binárního vyhledávání (metoda půlení intervalů).

Page 29: Algoritmy a programovac í techniky

setsetříděná posloupnostříděná posloupnostnnesetesetříděná vstupní posloupnostříděná vstupní posloupnosthledání pozice v setříděné části…hledání pozice v setříděné části…

754321

k zatříděník zatříděník zatříděník zatříděník zatřídění MMM

Binary InsertSort(příklad)

Popis metodyPopis metody ImplementaceImplementace

L R L LLR RRR

M

3 1 7 2 45

Page 30: Algoritmy a programovac í techniky

Binary InsertSort(implementace)

procedure BinaryInsert (var A : TPole; N : integer); {N…počet prvků pole}

var i, j, m, l, r, x : integer;

beginfor i:=2 to N do {zatřiďujeme číslo z pozice i}

begin x:=A[i]; l:=1; r:=i-1; {nastavení levého a pravého ukazatele} while l<=r do begin {cyklus binárního vyhledání}

m:=(l+r) div 2; if x<A[m] then r:=m-1

else l:=m+1; end

for j:= i-1 downto l do A[j+1]:= A[i]; {posun části pole} A[l]:=x; {zařazení}

endend;

PříkladPříklad Popis metodyPopis metody

Page 31: Algoritmy a programovac í techniky

Algoritmy vnitřního třídění

Třídění na principu rozdělování (Quicksort)

Page 32: Algoritmy a programovac í techniky

• tato metoda je založena na principu rozdělení pole na dvě části

• pro každý prvek x z jedné části pole platí x<y, kde y je libovolný prvek z druhé části

• nejvýhodnější dělící hodnotou pole je medián (právě polovina prvků pole je menší než medián a polovina větší)

• nalezení mediánu je však časově náročné, proto se volí jiný prvek – střed pole

QuickSort(popis metody)

PříkladPříklad ImplementaceImplementace

Page 33: Algoritmy a programovac í techniky

7

poro

vnávám

e

poro

vnávám

e

169 10 922 135

QuickSort(příklad)

10

střed

1512 615 5312 7

střed

Stejný algoritmus dělení aplikujeme zvlášť na „žlutou“ a zvlášť na „červenou“ část.

Popis metodyPopis metody ImplementaceImplementace

Dělení provádíme tak dlouho nezískáme jednoprvkové úseky.

Page 34: Algoritmy a programovac í techniky

QuickSort(implementace)

PříkladPříklad Popis metodyPopis metody

procedure QuickSort (var A : TPole; L,R : integer); {N…počet prvků pole}var i, j, pom: integer;begin

i:=L; j:=R;x:=A[(i+j) div 2]; {určení dělící hodnoty}repeat

while A[i]<x do i:=i+1; {hledá zleva, nalezne nejblíže vyšší i, pro které platí A[i]>=x }

while A[j]<x do j:=j-1; {hledá zprava, nalezne nejblíže nižší j, pro které platí A[j]<=x } if i<=j then begin

pom:=A[i]; A[i]:=A[j];A[j]:=pom; i:=i+1; j:=j-1; end

until i>jif L<J then QuickSort (A,L,J);if I <R then QuickSort (A,i, ,R)

end;

Page 35: Algoritmy a programovac í techniky

Algoritmy vnějšího třídění

• slouží k uspořádání rozsáhlých souborů dat

• aplikujeme je tehdy, nevejdou-li se všechna tříděná data do operační paměti a nelze použít některou z metod vnitřního třídění

• tříděná data jsou uložena v souborech na nějakém vnějším paměťovém médiu

Page 36: Algoritmy a programovac í techniky

Algoritmy vnějšího třídění

• podstatou je přesouvání tříděných údajů mezi sekvenčními soubory dat

• při tomto přesouvání se data třídí po částech, vytvářejí se tak postupně delší a delší setřídění úseky (tzv. běhy), až jsou nakonec všechna data setříděna v jednom souboru

• při práci se sekvenčními soubory, na rozdíl od práce s polem, je v každém okamžiku přístupný pouze jediný prvek souboru

Page 37: Algoritmy a programovac í techniky

Algoritmy vnějšího třídění

Přímé slučování(3-pásková, 2-fázová metoda)

Přirozené slučování(3-pásková, 2-fázová metoda)

Vyvážené slučování (4-pásková, 1-fázová metoda)

Page 38: Algoritmy a programovac í techniky

Algoritmy vnějšího třídění

Přímé slučování

Page 39: Algoritmy a programovac í techniky

Přímé slučování (popis metody)

• nejjednodušší metoda, je však zbytečně pomalá a prakticky se nepoužívá

• ze všech tříděných čísel vytvoříme nejprve uspořádané dvojice, z nich pak sloučením vzniknou čtveřice, osmice,..., až budou všechna čísla setříděna

• obecně po k-tém kroku výpočtu získáme soubor setříděných úseků (běhů) délky 2k

• každý krok výpočtu se skládá ze dvou fází – z fáze rozdělovací a z fáze slučovací

Page 40: Algoritmy a programovac í techniky

Přímé slučování (popis metody – rozdělovací fáze)

• V této fázi rozdělíme setříděné úseky (běhy) ze vstupního souboru do 2 pomocných souborů.

• Do každého překopírujeme polovinu běhů ze vstupního souboru. Protože nevíme kolik běhů bude, zapisujeme je do pomocných souborů střídavě.

• Je-li počet setříděných úseků lichý, bude v jednom z pomocných souborů o jeden běh více.

Page 41: Algoritmy a programovac í techniky

Přímé slučování (popis metody – slučovací fáze)

• V této fázi vytváříme z pomocných souborů výsledný výstupní soubor.

• Nejprve sloučíme první běhy z pomocných souborů do jednoho běhu dvojnásobné délky a ten zapíšeme do výstupního souboru. Totéž uděláme s druhými běhy, atd.

• Pokud je v jednom pomocném souboru o 1 běh více, do výstupního souboru ho překopírujeme .

Page 42: Algoritmy a programovac í techniky

Přímé slučování (příklad)

287 6 49 1030 1 5soubor C :

soubor A :

soubor B :

7 6 49 31

28 100 5

fáze rozdělovací

fáze slučovací

soubor C : 7 6 49 31 28 100 5

Page 43: Algoritmy a programovac í techniky

Přímé slučování (příklad)

287 6 40 1039 1 5soubor C :

soubor A :

soubor B :

7 6 108 21

30 49 5

fáze rozdělovací

fáze slučovací

soubor C : 7 649 31 28 100 5

Page 44: Algoritmy a programovac í techniky

Přímé slučování (příklad)

270 4 108 639 1 5soubor C :

soubor A :

soubor B :

0 4 67 98

31

10

2 5

fáze rozdělovací

fáze slučovací

soubor C : 1 643 85 72 100 9

Page 45: Algoritmy a programovac í techniky

Přímé slučování (příklad)

710 4 102 683 5 9soubor C :

soubor A :

soubor B :

0 5 71 32

104

8

6

9

fáze rozdělovací

fáze slučovací

soubor C : 1 983 64 52 100 7

Page 46: Algoritmy a programovac í techniky

Algoritmy vnějšího třídění

Přirozené slučování

Page 47: Algoritmy a programovac í techniky

Přirozené slučování (popis metody)

• zefektivnění přímého slučování

• využijeme částečného uspořádání vstupního souboru

• setříděnými úseky (běhy) v tomto případě nejsou 2k-tice, ale nejdelší možné setříděné úseky

Page 48: Algoritmy a programovac í techniky

Přirozené slučování (příklad)

287 6 49 1030 1 5soubor C :

soubor A :

soubor B :

7

6

48

10

9

20 51 3

fáze rozdělovací

fáze slučovací

soubor C : 0 9 43 75 61 102 8

Page 49: Algoritmy a programovac í techniky

Přirozené slučování (příklad)

610 9 42 1073 5 8soubor C :

soubor A :

soubor B :

0 9

4

1 102 63 85 7

fáze rozdělovací

fáze slučovací

soubor C : 0 8 103 64 51 92 7

Page 50: Algoritmy a programovac í techniky

Přirozené slučování (optimalizace)

• data v souboru můžeme předtřídit

• takové množství dat ze vstupního souboru, které se nám vejde ještě do operační paměti, setřídíme některou z metod vnitřního třídění a zapíšeme zpět do souboru

• získáme tak soubor relativně dlouhých setříděných úseků

Page 51: Algoritmy a programovac í techniky

Algoritmy vnějšího třídění

Vyvážené slučování

Page 52: Algoritmy a programovac í techniky

Optimalizace (vyvážené slučování)

• rozdělovací fáze je zbytečná, přitom časová náročnost je přibližně stejná, jako u fáze slučovací

• spojením slučovací a rozdělovací fáze zdvojnásobíme rychlost výpočtu

• princip:sloučené běhy nezapisujeme do jednoho výstupního souboru, ale hned je rozdělujeme střídavě do dvou souborů

• rozdělovací fáze proběhne jen jednou, na začátku výpočtu

Page 53: Algoritmy a programovac í techniky

Vyvážené slučování (4-pásková, 1-fázová metoda)

287 6 49 1030 1 5soubor C :

soubor A :

soubor B :

7

6

48

10

9

20 51 3

fáze rozdělovací

Page 54: Algoritmy a programovac í techniky

Vyvážené slučování (4-pásková, 1-fázová metoda)

soubor C :

soubor A :

soubor B :

7

6

48

10

9

20 51 3

fáze slučovací i rozdělovací

soubor D :

0 21 3 65 7 8 9

4

10

Page 55: Algoritmy a programovac í techniky

Vyvážené slučování (4-pásková, 1-fázová metoda)

soubor A :

soubor C :

soubor D :

fáze slučovací i rozdělovací

0 21 3 65 7 8 9

4

10

0 21 3 65 7 8 94 100 21 3 65 7 8 94 10

setříděná posloupnost