algoritmy

31
Algoritmy Přednáška z předmětu Počítače I Dana Nejedlová Katedra informatiky EF TUL 1

Upload: bruno-mclean

Post on 01-Jan-2016

24 views

Category:

Documents


4 download

DESCRIPTION

Algoritmy. Přednáška z předmětu Počítače I Dana Nejedlová Katedra informatiky EF TUL. Efektivita algoritmu. Programy s částmi typu vstup n hodnot, zpracování, výstup. Zajímá nás složitost části zvané zpracování . Složitost je počet instrukcí jako funkce n . - PowerPoint PPT Presentation

TRANSCRIPT

1

Algoritmy

Přednáška z předmětu Počítače IDana Nejedlová

Katedra informatiky EF TUL

2

Efektivita algoritmu• Programy s částmi typu

– vstup n hodnot,– zpracování,– výstup.

• Zajímá nás složitost části zvané zpracování.• Složitost je počet instrukcí jako funkce n.• Potřebujeme metodu, která porovná různé algoritmy nezávisle

na hardwaru.– Počet vykonaných instrukcí programu.– Nebude nás zajímat to, že různé instrukce mohou trvat různou dobu.

• Porovnání výkonnosti hardwaru pro stejné programy se nazývá benchmarking.– Měří se v časových jednotkách.

• Počet instrukcí vyjadřuje časovou složitost. Kromě ní je ještě možné analyzovat paměťovou složitost.

3

Hledání největší položky1 #include <stdio.h>2 #define MAX_POCET_POLOZEK 10

3 int main()4 {5 int x[MAX_POCET_POLOZEK];6 int pocet_polozek, i, nejvetsi, index_nejvetsiho;7 printf("Zadej pocet polozek mensi nez %d: ", MAX_POCET_POLOZEK + 1);8 scanf("%d", &pocet_polozek);9 for (i = 0; i < pocet_polozek; i++) { /* Čtení */10 printf("Zadej %d. polozku: ", i);11 scanf("%d", &x[i]);12 }

13 nejvetsi = x[0];14 index_nejvetsiho = 0;15 i = 1;16 while (i < pocet_polozek) { /* Hledání největšího */17 if (x[i] > nejvetsi) {18 nejvetsi = x[i];19 index_nejvetsiho = i;20 }21 i++;22 }

23 printf("Nejvetsi polozka je %d a ma index %d.", nejvetsi, index_nejvetsiho);24 return 0;25 }

4

Efektivita algoritmu pro hledání největší položky

• Řádky č. 1 – 15, 23 – 25 se provedou jen jednou.– Budeme je považovat za 8 instrukcí.– Řádky 9 – 12 se sice provedou n-krát, ale

• vstupní operace nás z hlediska efektivity nezajímá,• její rychlost je závislá na interakci uživatele a systému.• Budeme je celkově považovat za 1 instrukci.

– Je to konstantní faktor v programu (nezávislý na n).• Řádek č. 16 se provede n-krát.• Řádky č. 17 a 21 se provedou n – 1 krát.– 2 instrukce * (n – 1)

• Řádky č. 18 a 19 se provedou v počtu závislém na datech.– Přehození položek se provádí jen někdy.

5

Nejlepší, průměrný a nejhorší případ• Počet instrukcí je závislý na uspořádání dat.• Nejlepší případ– Položky jsou seřazené od největší do nejmenší.– 8 + n + 2 * (n – 1) instrukcí

• Průměrný případ– Položky přehodíme v polovině případů.– 8 + n + 2 * (n – 1) + 2 * (n – 1) / 2 instrukcí

• Nejhorší případ– Položky jsou seřazené od nejmenší do největší.– 8 + n + 2 * (n – 1) + 2 * (n – 1) instrukcí

6

Asymptotická analýza algoritmu• Asymptota funkce f(x) je přímka, jejíž vzdálenost od f(x)

se blíží nule, když se x blíží nekonečnu.• Počet instrukcí jako funkce n, když se n blíží nekonečnu• Vychází z matematického pojmu limita.

• Počet instrukcí je často ve formě polynomiální funkce.– Záleží jen na členech nejvyššího řádu.– se zredukuje na nebo častěji na .

• Omikron notace (velká O notace) a další varianty– Formální způsob zápisu složitosti, například O(n3)– Asymptota v tomto smyslu je funkce vynásobená konstantou,

která se funkci vracející počet instrukcí blíží pro nekonečně velké n.

• Složitost hledání největší položky je řádu n.

7

Vyhledávání• Sekvenční

– Seznam se prohledává od začátku, dokud se nenalezne položka nebo se nedojde na konec.

– Nejlepší případ = 1 porovnání– Průměrný případ = n / 2 porovnání– Nejhorší případ = n porovnání

• Binární– Prohledávaný seznam musí být setříděn!– Porovnáme položku uprostřed seznamu.– Podle toho, jestli je větší nebo menší než hledaná položka, budeme

stejně pokračovat v jedné z polovin seznamu.• Rekurze

– Algoritmus volá sám sebe na jednodušší problém.

– Nejlepší případ = 1 porovnání– Průměrný případ závisí na datech. Lze zjistit statisticky.– Nejhorší případ = log2n

• Seznam můžeme dělit tolikrát, kolikrát je v něm alespoň 1 položka.• n / 2x = 1, n = 2x, x = log2n = počet dělení

8

Třídění neboli řazení• Třídění uspořádává položky seznamu do určitého pořadí.• Třídění je jedním z nejvíce studovaných algoritmů, protože

– je součástí mnoha jiných algoritmů,– připravuje vstupní data pro jiné algoritmy.

• například pro binární vyhledávání

• Třídění je dobrým tématem pro úvod do základních pojmů z oblasti algoritmů jako jsou:– analýza nejlepšího, nejhoršího a průměrného případu,– analýza složitosti,

• Jejím příkladem je asymptotická analýza.

– výměna spotřeby času za spotřebu paměti (time-space trade-off).– metoda rozděl a panuj (divide and conquer),

• rekurzivní algoritmy

– datové struktury,• například pole, struktura, dynamické datové struktury

– randomizace dat.• využití náhodných hodnot pro výpočty

9

Výběr optimálního třídícího algoritmu• Počet položek• Datový typ položek

– Dají se položky považovat za celá čísla reprezentovaná stejným počtem bitů?• Čísla se stejným znaménkem ve formátu IEEE 754 se dají třídit jako celá čísla.

– Jsou data ve formě pole (array), haldy (heap) nebo lineárního spojového seznamu (linked list)?

– Jak výpočetně náročné je porovnání dvou položek?• Uspořádání nebo statistické rozložení položek

– Je seznam v náhodném pořadí nebo částečně setříděný?– Je v seznamu mnoho položek se stejnou hodnotu?

• Výpočetní zdroje– Kolik máme procesorů?– Vejde se celý seznam do paměti?– Jaká je cena za přehození položek vzhledem k povaze paměťového média?

• Paměti mají různou rychlost přístupu k položce a mohou mít omezený počet zápisů.

• Požadavky na rychlost výstupu– Má se setříděný výstup tvořit postupně, aby měl uživatel rychle k dispozici alespoň

začátek setříděného seznamu, nebo se má vše nejdřív setřídit a potom jít do výstupu najednou?

• Dají se výše uvedené vlastnosti dat a další podmínky očekávat vždy nebo jen někdy?

10

Řazení přímým výběremSelection Sort

• V cyklu s (n – 1) iteracemi:– Nalezneme největší položku seznamu a vyměníme ji s

položkou na jeho konci.– Seznam zkrátíme o poslední položku.

• Výhody– Počet zápisů do paměti (výměna položek) je řádu n.

• Nevýhody– Počet porovnání dle asymptotické analýzy je řádu n2.

• (n – 1) krát zkracujeme seznam a přitom v něm pokaždé hledáme největší položku, což má složitost řádu n.

• Přesněji– Seznam je na začátku dlouhý n a na konci 1, tedy v průměru n / 2.– Takže počet porovnání je (n – 1) ∙ n / 2 = 0,5n2 – 0,5n.

11

Řazení vkládánímInsertion Sort

• Seznam rozdělíme na seřazenou a neseřazenou část tak, že seřazená obsahuje první položku seznamu.

• V cyklu s (n – 1) iteracemi:– Vezmeme první položku neseřazeného seznamu a zařadíme ji do seřazené části

seznamu, která se tvoří na začátku seznamu.• Seřazenou část seznamu prohledáváme od konce.

– Nesetříděný seznam zkrátíme o první položku.• Výhody

– Počet porovnání je řádu n2 / 4.• Seřazená část seznamu je v průměru dlouhá n / 2.• Při zařazování položky do seřazené části seznamu v průměru potřebujeme dojít do jeho poloviny.• Řazení přímým výběrem má počet porovnání řádu n2 / 2.

– Počet porovnání i přesouvání položek je nižší pro částečně setříděný seznam.• Proto je většinou v praxi řazení vkládáním preferováno před řazením přímým výběrem.• Algoritmus s touto vlastností se nazývá adaptivní.

• Nevýhody– Počet zápisů do paměti (posouvání položek v seřazené části) dle asymptotické analýzy

je řádu n2.• n krát zařazujeme položku a přitom posuneme n / 2 položek.• Řazení přímým výběrem má počet zápisů do paměti řádu n.

12

Bublinkové řazeníBubble Sort, Sinking Sort

• V cyklu s (n – 1) iteracemi– je vnořen cyklus s (n – 1) iteracemi, ve kterém:

• Porovnáme sousední položky na začátku seznamu a jsou-li ve špatném pořadí, tak je přehodíme.

• Posuneme se o jednu položku.

– Nesetříděný seznam zkrátíme o poslední položku.• Při každém průchodu seznamem se nejvyšší položka přesune

(potopí se) na jeho konec.• Nejnižší položky probublávají na začátek seznamu pomalu.

– o jedinou pozici.

• Nevýhody– Počet zápisů do paměti (přehození položek) i porovnání dle

asymptotické analýzy je řádu n2.• To znamená, že bublinkové řazení nemá žádnou výhodu před

řazením přímým výběrem ani vkládáním.

13

V čem může být bublinkové řazení výhodné?

• Snadná algoritmizace a analýza• Může pomoci při ladění porovnávací funkce.

– Porovnáváme mezi sebou víc dvojic než při ostatních algoritmech.• Algoritmus může skončit, když při průchodu seznamem nedošlo k žádnému

přehození.– adaptivnost

• Může být efektivní pro velmi krátké seznamy (2, 3 položky) a pro seznamy, ve kterých je malá vzdálenost mezi položkami ve špatném pořadí.

• Může být nezbytné pro hardware se sekvenčním přístupem do paměti.– Data jsou na magnetické pásce a do operační paměti se vejdou jen 2 položky.– Převíjení pásky trvá dlouho, takže po projití seznamem uděláme následující průchod z

konce na začátek.• Tím se navíc řeší i pomalé probublávání nejnižších položek.• Tato varianta třídění se jmenuje Cocktail (shaker) sort.

– Nedostupnost náhodného přístupu do paměti je i u dat dostupných přes síť.• Vykreslování pohybujících se objektů v grafických programech

– Třídí se podle vzdálenosti objektů (bližší objekty musí překrývat vzdálenější).– Při kontinuálně měnící se scéně jsou objekty v nesprávném pořadí blízko sebe.– Přehrávání videa nesmí být trhané, takže by nemuselo být výhodné kompletně objekty

setřídit a potom teprve zobrazit další frame videa.

14

Řazení rozdělovánímQuicksort

• Vybereme ze seznamu jednu položku zvanou pivot neboli mezník.

• Projdeme jednou seznam a všechny položky menší než pivot dáme na začátek seznamu a všechny položky větší než pivot dáme na konec seznamu.– Seznam procházíme současně od začátku i konce a při tom

přehazujeme špatně umístěné položky.• Seznam rozdělíme na 2 poloviny.

– 1. polovina obsahuje položky menší nebo rovné pivotu.– 2. polovina obsahuje položky vyšší než pivot.

• Na každou z polovin seznamu opět uplatníme Quicksort.– Rekurze

15

Efektivita řazení rozdělováním• Seznam dělíme log2n krát.

– Viz binární vyhledávání.• Při každém dělení seznamu porovnáme případně

přehodíme n položek.– Přesněji počet položek v dané části seznamu – 1.

• Celkem se tedy provede n log∙ 2n porovnání.– Při uvádění složitosti algoritmu obsahujícího logaritmus se

často vynechává základ logaritmu, protože převod logaritmu na jiný základ se provádí násobením konstantou, tedy , protože .

• Řazení přímým výběrem, vkládáním nebo bublinkové mají složitost řádu n2.

• Řazení rozdělováním je tedy pro dlouhé seznamy výrazně efektivnější než kvadratické algoritmy.

16

Nejlepší, průměrný a nejhorší případ• Záleží na hloubce dělení seznamu.• Nejlepší případ

– Seznam dělíme pokaždé na 2 stejně velké půlky.• Průměrný případ

– Pro seznam s náhodnými a neseřazenými hodnotami a velkým n se příliš neliší od nejlepšího případu.

• Nejhorší případ– Pivot je vybrán vždy tak, že je nejmenší položkou seznamu,

protože jej třeba bereme vždy ze začátku seznamu.• To se může stát u již setříděného seznamu.• Řeší se vhodnou, například náhodnou, volbou pivotu.

– Seznam se tak rozdělí na část s pivotem a část s počtem položek v dané části seznamu – 1.• Počet dělení seznamu je roven hloubce dělení, tedy (n – 1).

– Složitost algoritmu je řádu n2.

17

Nevýhody řazení rozdělováním• Quicksort není efektivní u malých seznamů,

protože má velkou režii.– volání podprogramů v rekurzi– pomocné proměnné

• Při opakovaném dělení seznamu vznikají nakonec malé seznamy.

• Quicksort by měl pro malé seznamy (asi pod 10 položek) přepnout na nějakou variantu třídění s kvadratickou složitostí, například insertion sort, protože tyto algoritmy mají menší konstantní faktor.

18

Co je třeba umět do testu• Znát algoritmus sekvenčního a binárního vyhledávání.

– Data mohou vypadat třeba takto: 1, 2, 3, 4, 5, 6, 7.– V jakém pořadí je procházíme?– Kolik porovnání provedeme při hledání určité hodnoty?

• Jaké podmínky musí splňovat seznam, ve kterém chceme vyhledat určitou položku binárním vyhledáváním?

• Jaké třídící algoritmy jsou vhodné pro krátké seznamy?• Jaké třídící algoritmy jsou vhodné pro dlouhé seznamy?• Pro jaké úlohy může být vhodné bublinkové řazení?• Rozumět nejlepšímu, průměrnému a nejhoršímu případu

probraných algoritmů.– Pro jaká data může nastat?– Jakou má výpočetní složitost?

• Pokud se neuvádí konkrétní algoritmus, jde o složitost nejefektivnějšího známého algoritmu.

• Čím se vyznačují rekurzívní algoritmy? Uveďte jejich příklady.

19

Další typické algoritmy: Iterace• Cyklus (iterace) má v programech klíčová slova například for nebo while.• Jakou složitost má algoritmus, ve kterém se v m-krát vnořeném cyklu

vykoná n operací? 1 #include <stdio.h> 2 int main() 3 { 4 int i1, i2, i3, i4, n = 3, pocet = 0; 5 for (i1 = 0; i1 < n; i1++) 6 for (i2 = 0; i2 < n; i2++) 7 for (i3 = 0; i3 < n; i3++) 8 for (i4 = 0; i4 < n; i4++) 9 pocet++; 10 printf("Pocet iteraci je %d.\n", pocet); 11 return 0; 12 }

• Cyklus v tomto příkladu budeme považovat za 4 krát vnořený, i když je spíše 3 krát vnořený, tedy m = 4, n = 3.

• Počet iterací je nm = 81.

20

Hledání podřetězce v řetězci

Hledaný řetězec

A A C L A J K A

Prohledávaný řetězec

A A A C B A L A L A J K A

Počet posunutí

0 1 2 3 1

1 4 5 6 2

2 3 4 5

3 6

4 7 8 9 10 11

• Počítáme počet porovnání jednotlivých znaků.

21

Hledání podřetězce v řetězci• Hledaný řetězec má m znaků.• Prohledávaný řetězec má n znaků.• Počet znaků, od kterých se začíná porovnávat

v prohledávaném řetězci = 1 až n.– Hledaný řetězec posouváme 0 až (n – 1) krát.

• Počet porovnávaných znaků pro každé posunutí hledaného řetězce = 1 až m.

• Celkový počet porovnání znaků = 1 až n ∙m.• Složitost algoritmu = n ∙m.

22

Algoritmy polynomiální a ty ostatní• Dosud probrané algoritmy mají složitost s funkcí n, n log ∙ n, n2, n ∙m.• Tyto algoritmy se nazývají polynomiální.

– V polynomech je konstantní faktor, n krát konstanta, n na konstantní exponent.– Funkce n log ∙ n roste pomaleji než n2, takže se také řadí mezi polynomiální

algoritmy.• V praxi je však často třeba řešit i úlohy typu

– vyber nejlepší permutaci n prvků,– vyber nejlepší výběr z množiny n prvků.

• To jsou funkce n! a 2n, které s růstem n rostou podstatně rychleji než funkce nm.– Funkce nm pro velké m také roste rychle, ale v algoritmech je exponent m

obvykle maximálně 4 (4 vnořené cykly).– Proto se algoritmy s těmito funkcemi odlišují od polynomiálních a nazývají se

nepolynomiální, nebo úlohy s exponenciální složitostí.– Algoritmy s exponenciální složitostí jsou řešením pro NP úlohy.

• Kromě časové náročnosti, na kterou se v přednáškách omezíme, existují i studie paměťové (prostorové) náročnosti.

23

Problém obchodního cestujícíhoTravelling Salesman Problem (TSP)

• Máme n měst.• Počet možných průchodů městy je n! (faktoriál).

A

B

C

D

E

F

G

• Máme najít nejkratší cestu, která projde každé město jen jednou a vrátí se do výchozího města.

24

Problém batohuKnapsack (Rucksack) Problem

• Naplňte batoh nejhodnotnějšími věcmi, když nemůžete unést všechny z nich.

• Máme n věcí a každá z nich má svoji cenu a hmotnost.• Počet možných výběrů

– Každá věc je buďto vybrána nebo nevybrána.• To je informace o hodnotě 1 bit.

– Příklad pro 3 věci vyžaduje 3 bity informace pro 1 výběr.• 000 – Nic není vybráno.• 001 – Vybrána 1 věc.• 010 – Vybrána jiná 1 věc.• 011 – Vybrány 2 věci.• 100• 101• 110• 111 – Vybrány všechny věci.• Celkem to bylo 23 možností, obecně 2n.

25

Úrovně složitosti algoritmu• Problém obchodního cestujícího může mít různé formulace:

– Vypočti délku určité trasy.• Trasa je určitá permutace n měst.

– Najdi trasu kratší, než je limit k.– Rozhodni, zda existuje trasa kratší, než je limit k.– Najdi nejkratší trasu.

• Chceme vědět, jak těžké jsou tyto typy úloh.• Úlohu řešíme ve dvou fázích:

1. Navrhneme řešení.2. Ověříme řešení.

• Předpokládá se hypotetický abstraktní stroj zvaný orákulum (oracle), který v polynomiálním čase navrhne správné řešení.– Koncept teoretické informatiky (teorie složitosti)– Tento stroj používá nedeterministický algoritmus.

• Dělá paralelně větvení do všech možností.• Nebo uhodne hned napoprvé správné řešení (možnost).

26

Redukovatelnost úloh• Pokud bychom uměli řešit v polynomiálním čase jeden typ úloh, ovlivnilo by to

naši schopnost řešit jiný typ úloh.• Úloha A je „Najdi trasu kratší, než je limit k.“• Úloha B je „Rozhodni, zda existuje trasa kratší, než je limit k.“• Řešením úlohy A je určitá trasa a ověřit se dá v polynomiálním čase.

– Při ověřování se n-krát vypočte vzdálenost mezi 2 následujícími městy v navržené trase.

– Kdyby řešení navrhlo orákulum, byla by úloha řešitelná v polynomiálním čase.• Odtud termín NP úloha – NP jako Nondeterministic Polynomial time.

• Jak složitá je úloha B oproti úloze A?– Řešením úlohy B je odpověď „ano“ nebo „ne“.– Pokud by řešením byla odpověď „ne“, nešla by nalézt určitá trasa kratší než k.– Proto se řešení nedá vždy snadno (to jest v polynomiálním čase ověřit).– Kdybychom uměli úlohu B řešit v polynomiálním čase, uměli bychom snadno řešit i

úlohu A.• Rozhodnutí musí být podloženo nalezením cesty kratší než k nebo ověřením všech možných cest.

• Úloha A není těžší než rozhodovací úloha B.• Úloha A se redukuje na rozhodovací úlohu B.• Úloha B je těžká (is hard) pro třídu úloh A. Ale B není NP-hard.

– Když přitom úloha B patří do třídy A, tak B je kompletní (is complete) pro A.

27

NP úlohy• Najdi trasu kratší, než je limit k.• Najdi množinu věcí lehčí než k a dražší než l.• Nalezení řešení není v praxi obvykle možné v

polynomiálním čase.• Ověření správnosti řešení (verifying) v

polynomiálním čase možné je.– Délka určité trasy– Hmotnost a cena určité podmnožiny věcí– Počet operací je přímo úměrný počtu měst nebo

věcí n.

28

NP-úplné (NP-complete) úlohy• Rozhodovací varianty NP úloh.• Odpověď je „ano“ nebo „ne“.• Existuje trasa kratší, než je limit k?• Existuje množina věcí lehčí než k a dražší než l?• Nalezení řešení není ve všech případech možné v

polynomiálním čase.• Ověření správnosti řešení také v polynomiálním

čase nemusí být možné.– Řešením není určitá permutace nebo podmnožina,

ale odpověď „ano“ nebo „ne“.– Ta se dá potvrdit jen nalezením konkrétní permutace

nebo podmnožiny, neboli svědka (certifikátu).

29

NP-těžké (NP-hard) úlohy• Optimalizační varianty NP úloh, které nemusí mít řešení „ano“/„ne“.• Jaká je nejkratší trasa?• Jaká nejdražší množina věcí je lehčí než k?• Nalezení ani ověření řešení nejsou možná v polynomiálním čase.• U úloh s dostatečně malým n jsou v řešení lidé obvykle lepší než

počítače.• Nejjednodušší algoritmy z hlediska algoritmizace generují všechny

permutace nebo kombinace, pro každou z nich vypočtou potřebnou funkci a vyberou z nich tu s maximální nebo minimální hodnotou.– To je algoritmus hrubé síly (brute-force algorithm).

• Exponenciální složitost NP úloh a jejich tříd může být i užitečná.– Prvočíselný rozklad (Integer factorization) je využíván v počítačové kryptografii.

• Je to stěžejní předpoklad fungování e-businessu, kdy jde o prokázání identity komunikující osoby a utajení přenášených dat.

– Heslo• Počet možných hesel = mn, kde• m je počet možných znaků neboli abeceda a n je počet znaků v hesle.• Například 3-místné heslo z 10 číslic má 103 možných hodnot (000-999).• Stačí heslo udělat o několik znaků delší a stane se mnohem bezpečnější.

30

NP-těžké (NP-hard) úlohy v praxi• V praxi se musí řešit mnoho úloh s vysokým n.– Pro ně se musí hledat heuristické algoritmy.

• Jsou složité na algoritmizaci, ale nemají exponenciální složitost.• Zaručují pouze suboptimální řešení (blízké optimu) ve většině

případů na určitých typech dat.– To znamená, že není matematicky dokazatelné, že tyto algoritmy

vedou k nejlepšímu (optimálnímu) řešení.» Pro algoritmy hrubé síly je matematicky dokazatelné, že vedou k

optimálnímu řešení, ale v praxi je nelze uplatnit.

• Proto je při hodnocení v praxi využitelných algoritmů nejdůležitější jejich složitost (komplexita) daná počtem instrukcí (ze kterých vyplývá čas potřebný na zpracování dat) a potřebnou pamětí namísto matematické dokazatelnosti, že vedou k výběru nejlepšího řešení.

31

Co je třeba umět do testu• Jakou složitost má

– algoritmus s několikrát vnořeným cyklem?– hledání podřetězce v řetězci?– výčet všech permutací (všech možných seřazení)?– výčet všech podmnožin?

• Určit k dané formulaci úlohy, zda se jedná o úlohu polynomiální, NP úlohu, NP-úplnou úlohu nebo NP-těžkou úlohu.

• Co je algoritmus hrubé síly?• Co je heuristický algoritmus?• Podle jakých kritérií se v praxi vybírá vhodný algoritmus?• Aplikovat počet instrukcí ve formě funkce n na odhad

doby výpočtu.– Viz kapitola „Využití údajů o složitosti algoritmu“ přednášek.