Algoritmy a programovací techniky Třídící algoritmy.

Slides:



Advertisements
Podobné prezentace
OZD: Hašování RNDr. Michal Žemlička.
Advertisements

Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Programování funkcí v Excelu (pole)
Vnitřní řazení v poli (in sito)
1 Vnitřní řazení s využitím dynamických struktur Tvorba spojového seznamu je vcelku triviální záležitostí: a)Vytvořím prázdný seznam příkazem LIST:=nil.
Cvičení Úloha 1: Rozhodněte zda posloupnost znaků v poli délky n tvoří palindrom (slovo, které je stejné při čtení zprava i zleva). Př.: [a,l,e,l,a] [a,n,n,a]
10. Dynamické datové struktury
ALGO – Algoritmizace 6. cvičení
Vyhodnocování dotazů slajdy k LS I155 Jaroslav Pokorný.
Algoritmy a datové struktury
Fraktálová komprese obrazu
ALGO – Algoritmizace 1. cvičení
Třídění Seminář IVT. Definice uspořádání skupiny dat (záznamů) dle daného klíče vzestupně (od nejmenší do největší hodnoty klíče) sestupně (od největší.
Architektury a techniky DS Tvorba efektivních příkazů I Přednáška č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Varianty Turingova stroje Výpočet funkcí pomocí TS
ADT Strom.
Medians and Order Statistics Nechť A je množina obsahující n různých prvků: Definice: Statistika i-tého řádu je i-tý nejmenší prvek, tj., minimum = statistika.
B-Strom.
FORMALIZACE PROJEKTU DO SÍŤOVÉHO GRAFU
1 Vyhledávání Principy vyhledávání Klasifikace klíče:  Interní klíč – je součástí prohlížených záznamů  Externí klíč – není jeho součástí, je jím např.
Algoritmizace a programování Podmíněné a cyklické příkazy- 08
SÍŤOVÁ ANALÝZA.
Informatika I 3. přednáška
ALGO – Algoritmizace 9. cvičení 1.ročník, ZS Ing. Zdena DOBEŠOVÁ, Ph.D.
Řadicí algoritmy autor: Tadeáš Berkman.
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
REDUKCE DAT Díváme-li se na soubory jako na text, pak je tento text redundantní. Redundance vyplývá z:  některé fráze nebo slova se opakují  existuje.
Informatika I 2. přednáška
Algoritmy a programovací techniky
Algoritmy vyhledávání a řazení
KIV/PPA1 cvičení 7 Cvičící: Pavel Bžoch. Osnova cvičení Zadání samostatné práce –Vysvětlení nejasností –Způsob odevzdání –Hodnocení Řazení Vyhledávání.
Algoritmizace a programování Třídící algoritmy - 12
Časová složitost algoritmů
ALGORITMIZACE A ZÁKLADY PROGRAMOVÁNÍ ŘAZENÍ PRVKŮ – OPAKOVANÝM VÝBĚREM NEJVĚTŠÍHO PRVKU (SELECTSORT) Vytvořila: RNDr. Ivanka Dvořáčková Gymnázium K. V.
ALGORITMIZACE A ZÁKLADY PROGRAMOVÁNÍ
ALGORITMIZACE A ZÁKLADY PROGRAMOVÁNÍ ŘAZENÍ PRVKŮ – PŘÍMOU VÝMĚNOU (BUBBLESORT) Vytvořila: RNDr. Ivanka Dvořáčková Gymnázium K. V. Raise, Hlinsko, Adámkova.
JavaScript Podmínky, cykly a pole.
3. Příkazy  Příkazy dělíme na jednoduché a strukturované.  Jednoduché příkazy - žádnou jejich dílčí částí neni příkaz - přiřazovací, vstupu a výstupu,
Pascal - cykly.
Sorty Bubble, Insert a Quick
STROMY Datová struktura sestávající z uzlů
10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Aplikační počítačové prostředky X15APP MATLAB Katedra elektroenergetiky, Fakulta elektrotechniky ČVUT, Technická 2, Praha 6 Ing. Zbyněk Brettschneider.
Algoritmizace a programování Textové soubory - 13 Mgr. Josef Nožička IKT Algoritmizace a programování
Kompresní metoda ACB Associative Coder of Buyanovsky autor: George Buyanovsky připravil Tomáš Skopal podle knihy „Data Compression“ od D. Salomona, 1997,
Kompresní algoritmus LZW Dokumentografické informační systémy.
Tento výukový materiál vznikl v rámci Operačního programu Vzdělávání pro konkurenceschopnost 1. KŠPA Kladno, s. r. o., Holandská 2531, Kladno,
Databázové systémy Přednáška č. 5 Datové typy a Fyzická organizace dat.
OSNOVA: a) Algoritmy třídění b) Třídění dynamických záznamů Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro obor EST.
doc. RNDr. Zdeněk Botek, CSc.
VISUAL BASIC PRALG.
doc. RNDr. Zdeněk Botek, CSc.
Úvod do databází zkrácená verze.
Algoritmizace a programování Pole – Příklady 3. Třídění polí V poli máme prvky a chceme je setřídit: V poli máme prvky a chceme je setřídit: od nejmenšího.
Algoritmy vyhledávání a řazení Zatím nad lineární datovou strukturou (polem) …
Výukový materiál zpracován v rámci projektu
Výška stromu - algoritmus
ZAL – 6. cvičení 2016.
Název projektu: Moderní výuka s využitím ICT
Strukturované typy proměnných v programovacím jazyce Pascal - 2.hodina
© Copyright Radim Štefan
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
ALG 07 Selection sort (Select sort) Insertion sort (Insert sort)
Různé algoritmy mají různou složitost
Algoritmizace a datové struktury (14ASD)
Algoritmizace Dynamické programování
ALG 14 Vícedimenzionální data Řazení vícedimenzionálních dat
Algoritmizace a datové struktury (14ASD)
Transkript prezentace:

Algoritmy a programovací techniky Třídící algoritmy

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

Třídící algoritmy (základní rozdělení) Vnitřní třídění 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 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í) 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í Vnější třídění použijeme tehdy, kdy se tříděná data nevejdou do vnitřní paměti 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 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ů třídění je založeno na opakovaném čtení a vytváření souborů

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

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

Třídící algoritmy (přímé metody) Nejjednodušší třídící algoritmy patří do skupiny přímých metod. Všechny mají několik společných rysů: jsou krátké a jednoduché a třídí se na místě v poli. Tyto algoritmy mají časovou složitost O(N 2 ). Z toho vyplývá, že jsou použitelné jen když tříděných dat není příliš mnoho. Nejjednodušší třídící algoritmy patří do skupiny přímých metod. Všechny mají několik společných rysů: jsou krátké a jednoduché a třídí se na místě v poli. Tyto algoritmy mají časovou složitost O(N 2 ). Z toho vyplývá, že jsou použitelné jen když tříděných dat není příliš mnoho. Tři nejznámější přímé metody: Tři nejznámější přímé metody: třídění přímým výběrem třídění přímým výběrem třídění přímým vkládáním třídění přímým vkládáním třídění přímou výměnou třídění přímou výměnou

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 InsertSort) Třídění binárním vkládáním (Binary InsertSort) Třídění rozdělováním (QuickSort) Třídění rozdělováním (QuickSort)

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

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

hledání minima v nesetříděné části… setříděná posloupnost nesetříděná vstupní posloupnost min SelectSort (příklad) min Popis metody Popis metody Implementace

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 Popis metody

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

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

nesetříděná vstupní posloupnost hledání pozice v setříděné části… setříděná posloupnost InsertSort (příklad) zarážka Popis metody Popis metody Implementace k zatřídění

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

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

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

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

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ů} begin for 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říklad Popis metody Popis metody

BubbleSort (možnosti optimalizace algoritmu) vstupní posloupnost dat po “probublání” prvního prvku (č. 4) 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ů

BubbleSort (možnosti optimalizace algoritmu) vstupní posloupnost dat “probubláním” jediného prvku (4) se celá posloupnost setřídí 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

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} begin i:= 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;

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

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

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

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 for 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; end end; Příklad Popis metody Popis metody

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

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

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

setříděná posloupnost nesetříděná vstupní posloupnost hledání pozice v setříděné části… k zatřídění MMM Binary InsertSort (příklad) Popis metody Popis metody Implementace L R L L LR R R R M

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:=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í} end end; Příklad Popis metody Popis metody

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

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

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

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

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

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

Algoritmy vnějšího třídění Přímé slučování Přímé slučování (3-pásková, 2-fázová metoda) Přirozené slučování Přirozené slučování (3-pásková, 2-fázová metoda) Vyvážené slučování Vyvážené slučování (4-pásková, 1-fázová metoda)

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

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 2 k každý krok výpočtu se skládá ze dvou fází – z fáze rozdělovací a z fáze slučovací

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.

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.

Přímé slučování ( příklad ) soubor C : soubor A : soubor B : fáze rozdělovací fáze slučovací soubor C :

Přímé slučování ( příklad ) soubor C : soubor A : soubor B : fáze rozdělovací fáze slučovací soubor C :

Přímé slučování ( příklad ) soubor C : soubor A : soubor B : fáze rozdělovací fáze slučovací soubor C :

Přímé slučování ( příklad ) soubor C : soubor A : soubor B : fáze rozdělovací fáze slučovací soubor C :

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

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 2 k -tice, ale nejdelší možné setříděné úseky

Přirozené slučování ( příklad ) soubor C : soubor A : soubor B : fáze rozdělovací fáze slučovací soubor C :

Přirozené slučování ( příklad ) soubor C : soubor A : soubor B : fáze rozdělovací fáze slučovací soubor C :

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ů

Algoritmy vnějšího třídění Vyvážené slučování

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

Vyvážené slučování ( 4-pásková, 1-fázová metoda ) soubor C : soubor A : soubor B : fáze rozdělovací

Vyvážené slučování ( 4-pásková, 1-fázová metoda ) soubor C : soubor A : soubor B : fáze slučovací i rozdělovací soubor D :

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í setříděná posloupnost