1 / 55

Algoritmy a programovac í techniky

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)

urania
Download Presentation

Algoritmy a programovac í techniky

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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) • se setříděnými daty se lépe pracuje (především je usnadněno pozdější vyhledávání)

  3. Třídící algoritmy(obecná charakteristika) • v programech obvykle třídíme objekty, které lze popsat datovou strukturou typu záznam (v Pascalu) • v takové struktuře bývá označena jedna položka jako klíčová (klíč) • podle klíče se pak záznamy řadí (vzestupně nebo sestupně) • ostatní položky jsou z hlediska třídění nevýznamné, pouze se přemisťují

  4. 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 umístit do vnitřní paměti počítače • data jsou uložena v poli a algoritmy využívají možnosti přímého přístupu k jednotlivým prvkům (třídění polí) Vnější třídění • použijeme tehdy, kdy se tříděná data nevejdou do vnitřní paměti • data jsou umístěna v souborech na vnějším paměťovém médiu • třídění je založeno na opakovaném čtení a vytváření souborů

  5. Algoritmy vnitřního třídění(definice typů a konstant) const Max = … {maximální rozsah pole} typeTPolozka =integer; TPole = array[0..Max] of TPolozka; • pro jednoduchost budeme v třídit položky typu integer • vstupní posloupnost je do pole ukládána od pozice s indexem 1 • pozice s indexem 0 je využívána v některých metodách k pomocným účelům

  6. Algoritmy vnitřního třídění(metody) 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římou výměnou (BubbleSort) Třídění přetřásáním (ShakerSort) Třídění binárním vkládáním (Binary InsertSort) Třídění rozdělováním (QuickSort)

  7. Algoritmy vnitřního třídění Třídění přímým výběrem (SelectSort)

  8. 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říklad Implementace

  9. min min min min min min SelectSort(příklad) 1 2 3 3 4 7 5 2 7 5 1 4 nesetříděná vstupní posloupnost setříděná posloupnost hledání minima v nesetříděné části… Popis metody Implementace

  10. 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ů} begin for 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 end end; Příklad Popis metody

  11. Algoritmy vnitřního třídění Třídění přímým vkládáním (InsertSort)

  12. 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říklad Implementace

  13. zarážka k zatřídění k zatřídění k zatřídění k zatřídění k zatřídění InsertSort(příklad) 5 1 3 2 3 7 4 2 7 5 1 4 3 7 1 2 4 setříděná posloupnost nesetříděná vstupní posloupnost hledání pozice v setříděné části… Popis metody Implementace

  14. InsertSort(implementace) procedure InsertSort (var A:TPole; N : integer);{N…počet prvků pole} var i,j:integer; {indexy prvků} begin for i:=2to 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] dobegin A[j+1]:=A[j] j:=j-1; end A[j+1]:= A[i]; end end; Příklad Popis metody

  15. Algoritmy vnitřního třídění Třídění přímou výměnou (BubbleSort)

  16. BubbleSort(popis metody) • 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 Příklad Implementace

  17. BubbleSort(příklad) 1 2 3 3 4 7 5 2 7 5 1 4 nesetříděná vstupní posloupnost porovnávání a výměna sousedních prvků... setříděná posloupnost Popis metody Implementace

  18. BubbleSort(implementace) procedureBubbleSort (var A:TPole; N : integer);{N…počet prvků pole} var i,j:integer; {indexy prvků} X : TPolozka;{pro výměnu prvků} begin fori:= 2 to N do begin forj:= N downtoido 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říklad Popis metody

  19. BubbleSort(možnosti optimalizace algoritmu) vstupní posloupnost dat 2 7 5 1 3 4 po “probublání”prvního prvku (č. 4) pozice poslední výměny prvků 2 4 7 1 3 5 • velká část pole je už po prvním “probublání” setříděna • stačí tedy “zapamatovat” sipozici (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

  20. BubbleSort(možnosti optimalizace algoritmu) vstupní posloupnost dat 2 5 4 1 3 7 “probubláním” jediného prvku (4) se celá posloupnost setřídí 2 4 5 1 3 7 během následujícího “probublávání” prvku (7)nenastane žádná výměna 2 4 5 1 3 7 algoritmus lze tedy ukončit poté, co během “probublávání” libovolného prvku nenastane výměna

  21. BubbleSort(implementace efektivního algoritmu) procedureBubbleSort (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} begin i:= 2; repeat Vymena:=true; forj:= N downtoido 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;

  22. Algoritmy vnitřního třídění Třídění přetřásáním (ShakerSort)

  23. ShakerSort(popis metody) • 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í Příklad Implementace

  24. ShakerSort(příklad) 1 2 3 3 4 7 5 2 7 5 1 4 porovnávání a výměna sousedních prvků zleva doprava... porovnávání a výměna sousedních prvků zprava doleva... nesetříděná vstupní posloupnost setříděná posloupnost Popis metody Implementace

  25. 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ů} begin fori:= 2 to N do begin forj:= N downtoido{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; forj:= 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; end end; Příklad Popis metody

  26. ShakerSort(optimalizace) Tuto metodu lze podobně jako bublinkové třídění optimalizovat dvěma způsoby: • pamatovat si index poslední výměny (v obou směrech) a od této pozice začít probublávat opačným směrem • evidovat, zda během probublávání nastala nějaká výměna, pokud nenastala je pole setříděno a lze provádění algoritmu ukončit

  27. Algoritmy vnitřního třídění Třídění binárním vkládáním (Binary InsertSort)

  28. Binary InsertSort(popis metody) 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ů). Příklad Implementace

  29. R R R R R L L L L k zatřídění k zatřídění k zatřídění k zatřídění k zatřídění M M M M Binary InsertSort(příklad) 5 1 2 3 7 4 2 7 5 1 4 3 setříděná posloupnost nesetříděná vstupní posloupnost hledání pozice v setříděné části… Popis metody Implementace

  30. Binary InsertSort(implementace) procedure BinaryInsert (var A:TPole; N : integer);{N…počet prvků pole} var i,j, m, l, r, x:integer; begin for i:=2to 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} whilel<=rdobegin {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í} end end; Příklad Popis metody

  31. Algoritmy vnitřního třídění Třídění na principu rozdělování (Quicksort)

  32. QuickSort(popis metody) • 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 Příklad Implementace

  33. porovnáváme porovnáváme střed střed QuickSort(příklad) Stejný algoritmus dělení aplikujeme zvlášť na „žlutou“ a zvlášť na „červenou“ část. 5 3 12 10 15 6 2 2 9 15 12 1 7 1 3 10 5 6 7 9 Dělení provádíme tak dlouho nezískáme jednoprvkové úseky. Popis metody Implementace

  34. QuickSort(implementace) 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 } whileA[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>j if L<J then QuickSort (A,L,J); if I <R then QuickSort (A,i, ,R) end; Příklad Popis metody

  35. 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

  36. Algoritmy vnějšího třídění • podstatou je přesouvání tříděných údajů mezi sekvenčnímisoubory 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ýpouzejediný prvek souboru

  37. 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)

  38. Algoritmy vnějšího třídění Přímé slučování

  39. 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í

  40. 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.

  41. 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 .

  42. Přímé slučování (příklad) fáze rozdělovací 7 8 9 0 1 2 3 5 6 10 4 soubor C : 7 9 1 3 6 4 soubor A : 8 0 2 5 10 soubor B : fáze slučovací 7 8 0 9 1 2 3 5 6 10 4 soubor C :

  43. Přímé slučování (příklad) fáze rozdělovací 7 8 0 9 1 2 3 5 6 10 4 soubor C : 7 8 1 2 6 10 soubor A : 0 9 3 5 4 soubor B : fáze slučovací 4 8 6 0 7 9 1 2 3 5 10 soubor C :

  44. Přímé slučování (příklad) fáze rozdělovací 0 7 8 9 1 2 3 5 4 6 10 soubor C : 10 0 7 8 9 4 6 soubor A : 1 2 3 5 soubor B : fáze slučovací 4 2 6 0 1 3 5 7 8 9 10 soubor C :

  45. Přímé slučování (příklad) fáze rozdělovací 0 1 2 3 5 7 8 9 4 6 10 soubor C : 9 8 0 1 2 3 5 7 soubor A : 4 6 10 soubor B : fáze slučovací 8 2 9 0 1 3 4 5 6 7 10 soubor C :

  46. Algoritmy vnějšího třídění Přirozené slučování

  47. 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

  48. Přirozené slučování (příklad) fáze rozdělovací 7 8 9 0 1 2 3 5 6 10 4 soubor C : 4 7 8 9 soubor A : 6 10 0 1 2 3 5 soubor B : fáze slučovací 4 0 1 2 3 5 6 7 8 9 10 soubor C :

  49. Přirozené slučování (příklad) fáze rozdělovací 0 1 2 3 5 6 7 8 9 10 4 soubor C : 0 1 2 3 5 6 7 8 9 10 soubor A : 4 soubor B : fáze slučovací 10 0 1 2 3 4 5 6 7 8 9 soubor C :

  50. 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ů

More Related