Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Kurzy s programováním na FAI
1. ročník: Základy programování Algoritmizace úloh Programování v C 2. ročník: OOP (C++) 3. ročník: Mikropočítače (ANSI C a ASM) Technologie WWW Počítačová grafika 4. ročník: Systémové Programování Paralelní procesy a programování Programování RT Aplikací
2
Algoritmus Algoritmus je postup řešení určité úlohy. Ne každý postup je ale algoritmem! Algoritmus musí splňovat následující vlastnosti: je konečný = musí skončit po provedení konečného počtu kroků je elementární = je specifikován jako posloupnost elementárních, pro daný prováděcí stroj jednoznačně definovaných operací je rezultativní = vede ke správnému výsledku je determinovaný = po každém kroku lze zjistit, zda již algoritmus skončil, a pokud neskončil, jak má dále pokračovat Pojem algoritmu lze formalizovat (plně matematicky definovat) např. pomocí tzv. Turingova stroje nebo pomocí teorie parciálně rekurzivních funkcí v praxi se pro specifikaci algoritmů nebo jejich částí používají jednodušší konstrukce - např. vývojové nebo stavové diagramy, konečné automaty, tabulky zpráv, zápis v pseudojazyce, nebo přímo zápis v programovacím jazyce (implementace)
3
Stojíš u správných dveří?
Algoritmus Příklad: zamykání dveří prováděcí stroj = člověk je to algoritmus ? jakou má vadu? Nápověda: Je algoritmus elementární? Kdy skončí? Vede ke správnému výsledku? správné dveře, špatná strana !? svazek klíčů… Nakreslete správnou verzi! (zadání viz cvičení) Hledej klíč Našel jsi? Jdi do dalšího pokoje Stojíš u správných dveří? Hodí se klíč do zámku? Zamkni N A Jdi k další dveřím
4
Metody návrhu algoritmů
Metoda shora dolů Nejčastěji používaná metoda návrhu algoritmů Postup návrhu = navrhnout algoritmus s použitím neelementárních kroků, tyto jednotlivé kroky pak upřesňovat pomocí „podprogramů“ až na úroveň elementárních operací Metoda zdola nahoru Postup: nejdříve navrhneme „podprogramy“, z nich složíme výsledný algoritmus Nebezpečí – ztráta času návrhem pod-algoritmů, které se nakonec ukáží jako zbytečné Metody založené na umělé inteligenci Metody umělé inteligence se snaží přinutit stroj, aby myslel jako člověk Člověk většinou nejedná podle žádných předem daných algoritmů – pokud např. hledá klíč od domu, zvolí takový postup, který podle jeho zkušeností a schopností vede nejrychleji k cíli. Zná vstupní data (obraz klíče, rozložení místností v domě a pravděpodobnost výskytu klíče na obvyklých místech) a požadovaný výstup (nalezení místa, kde je klíč). Dovede si poradit s chybovými stavy (uklouznutí na schodech). Nebezpečí – ani inteligentní člověk většinou neřeší problém optimálně
5
Možnosti zápisu algoritmů
Programovací jazyk Výhody: specifikace v programovacím jazyce je vždy úplná, jednoznačná a bezesporná. Funkci algoritmu je možno okamžitě ověřit spuštěním nebo laděním Nevýhody: Nesrozumitelnost. Pro porozumění algoritmu je nutná znalost daného programovacího jazyka! V případech, kde je potřeba konzultovat algoritmus se zákazníkem – objednavatelem – programu, je nelze programovací jazyk použít! Složitější algoritmy zapsané v programovacím jazyce jsou nepřehledné. I v době objektového programování stále platí – „jeden obrázek řekne víc než pět stran textu”! Většina programovacích jazyků nemá formální základ – nelze je použít pro formální verifikaci (matematický důkaz) zapsaného algoritmu
6
Možnosti zápisu algoritmů
Přirozený jazyk Výhoda: srozumitelnost Nevýhody: přirozený jazyk nemá formální základ, přesný význam (semantika) jeho částí není nikde specifikována, je nejednoznačný (např. formulace „rozbij stan“ má 2 zcela opačné významy), složitější specifikace jsou nepřehledné Vývojové diagramy velmi populární v 60-tých letech Grafická podoba symbolů a jejich význam je popsán normou ISO 5807/ČSN Výhoda: přehlednost Nevýhody: nejsou nijak formalizovány uživatel může v diagramu použít libovolné, neformálně popsané kroky – situace je tedy podobná jako u přirozeného jazyka. Neumožňují graficky zachytit vnořené řídící struktury ani objekty Vývojové diagramy se dnes používají pouze pro specifikaci jednoduchých algoritmů a ve výuce
7
Možnosti zápisu algoritmů
Strukurogramy – na rozdíl od vývojových diagramů umožňují zachytit strukturu algoritmu včetně vnoření řídících bloků. V podstatě jsou kompromisem mezi strukturovaným programovacím jazykem a přirozeným jazykem. Příklad: Strukturogram hledání klíče od domu Zamykání dveří Dokud nenajdeš klíč nebo neprojdeš celý dům Hledej klíč v pokoji X Našel jsi klíč? Ano Ne X:=X+1 zamkni Dokud nenajdeš klíč nebo neprojdeš celý pokoj Hledej předmět ve tvaru klíče na pozici Y Y:=Y+1 RETURN
8
Možnosti zápisu algoritmů
Jacksonovy diagramy Michael Jackson navrhl tyto diagramy v rámci jeho metodologie strukturované analýzy a designu nazvané „Jackson System Development“ (JSD). Používá 2 typy diagramů: Entity Structure Diagrams – Entita je objekt, který v systému hraje nějakou roli. Například „člověk“. Action jsou akce, které může provádět (např. „hledání klíče“, „zamci dvere“ Network Diagrams – znázorňují jednotlivé procesy systému, datové proudy (D) a stavové vektory (SV)
9
Možnosti zápisu algoritmů
Nassi-Shneidermanovy Diagramy – další zajímavý typ diagramů typu „flowchart“. Skládají se z následujících grafických prvků: Výsledný diagram pak vypadá třeba takto:
10
Možnosti zápisu algoritmů
DataFlow Diagramy: Dále Jacobsonovy OOSE diagramy, Boochovy diagramy, ROOM diagramy, Rumbaughovy diagramy, Shlaer-mellorovy diagramy, UML…
11
Možnosti zápisu algoritmů
Konečné automaty Konečný automat je jednoduchý, ale účinný nástroj, pomocí kterého můžete lépe a radostněji specifikovat určité třídy algoritmů (např pro zpracování textu). Konečný automat je abstrakce s formálně definovanou sémantikou, díky níž je např. možno použít pro ověření funkce vámi navrženého algoritmu některé metody automatické verifikace. „Co to tedy vlastně je“? Na obrázku níže máte příklad jednoduchého Mealyho konečného automatu s výstupem: 1 / ’L’ 1 / ’S’ suda licha 0 / ’L’ 0 / ’S’ Kolečka „suda“ a „licha“ jsou stavy automatu. Šipka zleva do stavu „suda“ znamená, že se jedná o počáteční stav. Ostatní šipky znázorňují přechodovou funkci neboli přechody z jednoho stavu do druhého, výrazy nad šipkami pak uřčují podmínku, ze které se přechod stane, a výstupní symbol, který přitom vygenerován na výstup. Např. šipka ze stavu 1/ ‘L’ znamená, že při příjmu symbolu „1“ ve stavu „suda“ přejde automat do stavu „licha“ a na výstup vygeneruje znak ‘L’
12
Možnosti zápisu algoritmů
Konečné automaty Konečný automat je pětice KA = (Q, Σ, O, δ, ) kde Q je konečná, neprázdná, množina stavů Σ je konečná neprázdná množina vstupních prvků - symbolů (vstupní abeceda) O je konečná neprázdná množina výstupních symbolů (výstupní abeceda) δ (přechodová funkce) je zobrazení δ: Q Σ Q. Přechod je opět určen stavem ve kterém se automat nachází a symbolem, který je čten na vstupu (výstupní funkce) je zobrazení Q Σ O (Mealy) nebo Q O (Moore)
13
Možnosti zápisu algoritmů
Konečné automaty Jednoduchý automat, který kontroluje paritu ve vstupním souboru binárních čísel – pokud je parita sudá, generuje na výstup znak ‘S’, pokud je lichá, znak ‘L’: 1 / ’L’ 1 / ’S’ suda licha 0 / ’L’ 0 / ’S’ Implementace v C: enum {suda, licha} stav; while((c=getchar())!=EOF) swich (stav) { case suda: if (c==’1’) {putchar(’L’); stav=licha;} else if (c==’0’) putchar(’S’); break; case licha: if (c==’1’) {putchar(’S’); stav=suda;} else if (c==’0’) putchar(’L’); }
14
Možnosti zápisu algoritmů
Konečné automaty - Akceptor Automat typu akceptor – nemá výstupní abecedu O ani výstupní funkci . Definuje se jako pětice A = (Q, Σ, δ, q0, F), kde: Q je konečná, neprázdná, množina stavů Σ je konečná neprázdná množina vstupních symbolů (vstupní abeceda) δ (přechodová funkce) je zobrazení δ: Q Σ Q . Přechod je určen stavem ve kterém se automat nachází a symbolem, který přichází na vstup ( nebo který je čten na vstupu) q0 je počáteční (iniciální) stav (q0 Q) F je množina koncových stavů (F Q)
15
Možnosti zápisu algoritmů
Konečné automaty - Akceptor Automat typu akceptor je v podstatě pouze zjednodušeným obecným automatem – negeneruje na výstupu žádné textové řetězce, jeho výstupem je pouze konečný stav, ve kterém skončí analýza vstupního řetězce akceptor se používá např. ke kontrole správnosti syntaxe akceptor je v programátorské praxi často používaným typem automatu. Najdeme jej například v první úrovni každého překladače – tam se mu říká „lexikální analyzér“. Příklad: rozlišení identifikátoru a celočíselné konstanty v textovém souboru (identifikátor musí začínat písmenem nebo podtržítkem a pokračuje libovolným řetězcem písmen a číslic)
16
Možnosti zápisu algoritmů
Konečné automaty – Akceptor - příklad Implementace v C: enum {start, isID, isINT, id, int, error, eof} stav; stav lexAnalyzer(FILE * soubor) { while ((c=fgetc(soubor))!=EOF) switch (stav) { case start: if (isalpha(c) || c=='_') stav=isID; else if (isdigit(c)) stav=isINT; break; case isID: if (isspace(c)) return id; else if (!(isspace(c) || isalphanum(c) || c=='_')) return error; case isINT: else (!isdigit(c)) return error; } if (c==EOF) return eof; pismeno, ‘_’ start isID? isINT? cislice ID! INT! Error whitespace [^cislice] pismeno | ‘_’ | cislice [^pismeno | ‘_’ | cislice | whitespace]
17
Turingův stroj ∆ a b c d .. Turingův stroj je pětice (Q,A,d,q,F), kde:
- Q je konečná množina stavů (vnitřní abeceda) - A je (vnější) abeceda (konečná množina písmen) - q je počáteční stav (prvek množiny Q) - F je množina koncových stavů (podmnožina množiny Q) - d je přechodová posloupnost (Q-F) x (A+{free}) -> Q x (A+{free}) x {L,N,R} (free je speciální znak určujíci prázdné políčko na pásce). Práce Turingova stroje Na pásce je v jednotlivých políčkách napsán řetězec znaků (ostatní políčka jsou prázdná, tj. obsahují znak free). K jednomu políčku pásky je přilozena čtecí/zapisovací hlava. Podle čteného písmene a vnitřního stavu se řídící jednotka "rozhodne", jaké písmeno na pásku napíše, do jakého dalšího vnitřního stavu přejde a zda se čtecí hlava posune o jedno políčko vlevo, vpravo nebo zůstane na místě (to je dáno "instrukcemi" přechodové posloupnosti). Práce Turingova stroje končí ve chvíli, kdy nelze použít žádnou další instrukci (tj., když je řidící jednotka v koncovém stavu). ∆ a b c d ..
18
Složitost algoritmu Pojem „složitost“ algoritmu zahrnuje nejen časovou, ale také paměťovou náročnost algoritmu. Tímto problémem se zabývá jeden celý obor informatiky „Vyčíslitelnost a složitost“. Protože doba provádění i paměťové požadavky stejného algoritmu, implementovaného na různých strojích/překladačích může být díky různým HW/SW optimalizacím velmi různá, používá se ke zjišťování složitosti obecných algoritmů modelů výpočetních systémů. Nejčastěji používanými modely jsou: RAM – Random Access Machine – počítač se definovanou sadou instrukcí, nekonečně velkou pamětí a vstupně/výstupní páskovou jednotkou Turingův stroj (výpočetní prostředek s největší výpočetní mocností) Protože přesný algebraický výpočet složitosti pomocí implementace algoritmu např. na stroji RAM je velmi složitý už i u jednoduchých problémů, používají se pro srovnávání algoritmů častěji tzv. aproximatické odhady složitosti.
19
Aproximatické odhady složitosti
Nepočítáme přesný počet taktů na provedení všech instrukcí, zaměříme se pouze na nejnáročnější operace, kterým přidělíme čas provedení=1, ostatní operace nás nezajímají-jejich čas provedení=0. Pak se pokusíme spočítat nejlepší a nejhorší případ doby běhu algoritmu pro různá vstupní data Příklady: třídění InsertSort Počet přesunů: 2 5 4 3 2 1 Počet přesunů: 3 4 5 3 2 1 3 4 5 2 1 Počet přesunů: 4 2 3 4 5 1 Počet přesunů: 5 Celkem:
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.