Zpět PRM045

NPRM045 Programování II 2009 - co bylo na přednáškách

Hromadná konzultace úterý 26.května 16:00 posluchárna S3

  1. přednáška 25.února
  2. přednáška 4.března
  3. přednáška 11.března
  4. přednáška 18.března
  5. přednáška 25.března
  6. přednáška 1.dubna
  7. přednáška 8.dubna
  8. přednáška 15.dubna
  9. přednáška 22.dubna
  10. přednáška 29.dubna
  11. přednáška 6.května
  12. 13.května rektorský den
  13. přednáška 20.května
  1. přednáška 25.února
    • Komentář k praktickým testům a udílení zápočtů
    • Náplň letního semestru, zkouška
    • Vnitřní a vnější třídění - rozdíly
    • Vnitřní třídění - specifikace úlohy, adresní a asociativní algoritmy
    • Radixové třídění - příklad adresního třídícího algoritmu
    • Asociativní algoritmy - založené na porovnávání klíčů
      měření časové složitosti - míry C (počet porovnání) a M (počet přiřazení), paměťová složitost,
      třída algoritmů, které "třídí "na místě" (in situ)
    • Opakování jednoduchých algoritmů složitosti O(n2):
      • přímé zatřiďování
      • třídění výběrem
      • třídění výměnami - bubblesort, shakesort
    • Datová struktura heap (hromada) a základní operace na ní
      delete-min, přidání prku
    • Reprezentace heapu v poli - úsek pole reprezentuje ne jeden strom, ale les
    • Procedura sift, která přidává k existujícímu heapu prvek "před ním v poli"
    • Algoritmus heapsortu - složitost i v nejhorším případě n*log(n)
    • zdrojové texty procedur realizujících jednotlivé třídící algoritmy jsou ke stažení na WWWW
  2. Zpět začátek
  3. přednáška 4.března
    • Důkaz tvrzení, že neexistuje žádný algoritmus vnitřního třídění, kterému by v nejhorším případě stačilo méně než n*log(n) porovnání
    • Náčrt důkazu, že obdobné tvrzení platí i pro průměrný případ
    • Quicksort - myšlenka; rekursivní implementace s pivotem jako zarážkou; časová složitost v nejlepším a nejhorším případě.
    • Algoritmus Quicksort, jeho rekursivní verze a nerekursivní verze
    • Optimalizace quicksortu, různá jeho vylepšení,
    • Porovnání quicksortu s heapsortem
    • odstraňování rekurse - vytiskněte si nerekursiovní quicksort
  4. Zpět začátek
  5. přednáška 11.března
    • Ukazatele a dynamická alokace paměti,
      bázový typ ukazatele, dynamická alokace paměti pomocí procedury new, procedura dispose pro uvolňování dynamické paměti, konstanta nil. Jednoduchý příklad. V definici typu ukazatel může být použit identifikátor jeho bázového typu i když ještě nebyl bázový typ definován.
    • Možnost vzniku "smetí v paměti" ztratíme-li možnost přístupu k dynamicky alokované proměnné
    • Jednosměrné spojové seznamy:
      postavení seznamu, vkládání prvku za zadany prvek, vkládání prvku před zadaný prvek, vypouštění následujícího prvku
    • Animace práce se spojovými seznamy
      1. spojový seznam
      2. přidání prvku na začátek spojového seznamu
      3. odebrání prvku ze začátku spojového seznamu
      4. průchod spojovým seznamem
      5. přidání prvku na konec spojového seznamu
        pozor, nepracuje, je-li seznam prázdný
      6. odebrání prvku z konce spojového seznamu
    • Další operace s jednosměrnými spojovými seznamy:
      průchod seznamem, hledání prvku v seznamu, hledání s použitím zarážky
    • Jiné typy seznamů, např.:
      • Seznamy s hlavou a/nebo s ocasem (fiktivní prvky na začátku resp. na konci seznamu
      • Cyklické seznamy
      • Dvousměrné seznamy
      Zkuste si naprogramovat jednoduché akce s nimi
    • Řídké polynomy - reprezentace pomocí cyklického seznamu s hlavou,
      její výhody oproti prvoplánovým alternativám (např. pole koeficientů, jednoduchý nezacyklený seznam nenulovách členů,
      ukázka alokace a uvolňování paměti "svépomocí",
      procedura pro nedestruktivní sčítání dvou řídkých polynomů.
    • Na rozmyšlenou:
      Vytvořte podprogram pro otáčení seznamu s hlavou
      rozmyslete si kolik proměnných potřebujete
  6. Zpět začátek
  7. přednáška 18.března
    • opakování dynamicky alokované proměnné, ukazatele, procedury new a dispose
    • Procedura search pro uspořádaný seznam s hlavou a ocasem - vyhledávává resp. vkládá prvek s daným klíčem
    • Samoorganizující se seznamy
      ( např. nalezený prvek se stěhuje na první místo, nový prvek je vkládán na začátek) - zkuste si naprogramovat.
    • Řídké matice - je třeba kriticky hodnotit přínosy té které implementace
    • Technická úloha na rozmyšlenou:
      Napsat proceduru, která na základě dat ze vstupu vytvoří probíranou reprezentaci řídké matice
    • Práce Pascalu s pamětí - zásobník a heap, typická realizace heapu s ukazatelem na jeho vrchol a se seznamem "volných děr"
    • Prostředky pro alokaci a uvolňování paměti
      • Garbage collector - v Pascalu není
      • new a dispose
      • svépomocí - proč může být někdy vhodné
      • mark a release - nepoužívat !!!
      • prostředky nízké úrovně
        MemAvail, MaxAvail, Getmem, Freemem - používat jen pro speciální účely,
        kdy je to vhodné - na přednášce teprve bude
    • Stromy, binární stromy - terminologie
    • Různá data se stromovou strukturou, různé datové reprezentace stromu
  8. Zpět začátek
  9. přednáška 25.března
    • Kanonická reprezentace lesa pomocí binárního stromu
    • Pojem binárního vyhledávacího stromu
    • Algoritmus vyhledávání v binárním vyhledávacím stromě
    • Binární vyhledávací stromy - vkládání prvku do binárního vyhledávacího stromu
    • myšlenka vypuštění prvku s daným klíčem
      její naprogramování
    • Animace operací s binárními vyhledávacími stromy
    • Rekursivní implementace vkládání do kořene binárního vyhledávacího stromu
    • Vypouštění intervalu z binárního vyhledávacího stromu (rekursivně z podstromů a pak z kořene)
      rozmyslet a zkusit naprogramovat nerekursivní řešení
  10. Zpět začátek
  11. přednáška 1.dubna
    • binární vyhledávací stromy opakování
    • Dokonale vybalancované stromy
    • Vytvoření dokonale vybalancovaného binárního vyhledávacího stromu o N prvcích z rostoucí posloupnosti čísel na vstupu. Zkuste naprogramovat i nerekurzivně.
    • Dokonale vybalancované binární vyhledávací stromu nejsou vhodné pro dynamické tabulky (t.j. tabulky, ze kterých se mohou prvky vyhazovat a do nichž se mohou vkládat.
    • AVL stromy - definice a datová reprezentace ( v každém uzlu "navíc" položka bal: -1..1, která udává rozdíl výšek levého a pravého podstromu
    • Fibonnaciovy stromy - nejhorší případ AVL stromů
    • Rotace pro odstranění poruch v AVL stromu
    • Algoritmy pro vkládání prvku do AVL stromu a vypouštění prvku z něj mají složitost log(n)
      při vkládání stačí provést (je-li to potřeba) jednu rotaci
      při vypouštění je v nepříznivém případě provést rotaci v každém prvku na cestě od kořene stromu a vypouštěnému prvku
    • animace operací s AVL stromy
      1. vkládání do AVL stromu
      2. rotace při vkládání do AVL stromu
      3. vypouštění z AVL stromu
      4. rotace při vypouštění z AVL stromu
    • Hašování jakožto alternativa k (vyváženým) stromům
      bezkolizní hašování, kolize a různé metody jejich řešení, metoda řetízků, efektivita hašování
    • Záznam s variantami pevné a variantní položky, rozlišovací položka (může chybět), varianta může opět obsahovat pevné položky a další varianty
      Význam - "nový typ" je "disjuktním" sjednocením jiných typů,
      šetření pamětí - paměťový nárok je maximem paměťových nároků variant, nikoli jejich součtem.
      Kdysi velmi důležité pro praktické programování,
      dnes - téhož jde dosáhnout lépe v rámci objektového programování.
  12. Zpět začátek
  13. přednáška 8.dubna
  14. Zpět začátek
  15. přednáška 15.dubna
  16. Zpět začátek
  17. přednáška 22.dubna
    • Opakování objektového programování
    • Polymorfismus, viruální metody, tabulka virtuálních metod, role konstruktoru
      pohrajte si s příklady
    • K čemu je destruktor a kdy je nutné napsat neprázdný destruktor, proč je velmi často vhodné, aby destruktor byl virtuální
    • funkce typeof a její použití
    • Dynamické programování
      • Hledání optimálního uzávorkování součinu N matic
      • Problém batohu s celočíselným zadáním
        Algoritmus řešení problému batohu - trasování konkrétního výpočtu
        rozmyslete si tento algoritmus - příště se k němu vrátíme
        obecný problém batohu je NP úplný (stručně řečeno to znamená,že
        • není znám polynomiální algoritmus pro řešení úlohy
        • neumíme dokázat, že polynomiální algoritmus neexistuje
        • kdyby byl polynomiální algoritmus nalezen, znamenalo by to existenci polynomiálních algoritmů pro celou řadu složitých problémů
          proto matematici příliš v možnost existence takového algoritmu nevěří)
    • Hledání optimální triangulace - viz kniha P. Töpfera Algoritmy a programovací techniky.
    • Rozmyslet: algoritmus pro optimalizaci rozložení písmen na klávesy mobilního telefonu
      (jsou zadány frekvence písmen, optimalizuje se počet stisků kláves).
  18. Zpět začátek
  19. přednáška 29.dubna
    • O zkouškách
    • Opakování hlavní myšlenky dynamického programování
    • řešení úlohy o optimalizaci rozložení písmen na klávesnici mobilu
    • Hledání maximálního podřetězce - trasování
    • Optimální binární vyhledávací strom k zadaným frekvencím pozitivních a negativních dotazů
      formulace problému - rozmyslet řešení
    • Metoda rozděl a panuj
    • vnitřní třídění sléváním
    • klasifikace algoritmů vnitřního třídění jakožto implemenace myšlenky rozděl a panuj
    • datové soubory - určení, výhody a nevýhody oproti textovým souborům
      reset, rewrite, close, read, write
    • přímý přístup k datovým souborům - proč je podstatně pomalejší než sekvenční
      podprogamy seek, pos, setpos, truncate,
    • Vnější třídění - charakteristika úlohy, základní idea algoritmu přímého slučování, definice běhu
    • Datový typ stream, který umožňuje testovat hodnotu položky, kterou jsme z něj ještě nepřečetli,
      jeho programová realizace
    • programová realizace algoritmu přímého slučování
  20. Zpět začátek
  21. přednáška 6.květen
    Pravděpodobný obsah přednášky
    • Předběžná verze požadavků ke zkoušce - prohlédněte si, abyste příšte mohli mít dotazy
    • ukázková zadání příkladů k první části zkouškové písemky
    • Rozmyslete - algoritmus, který slévá "jednice do dvojic", ..... , 2(n-1)-tice do 2n-tic,
      není motivací pro algoritmus přirozeného slévání, ale neúnosně pomalým algoritmem,
      jehož implementace je navíc složitější než u algoritmu přirozeného slučování.
    • různá vylepšení základní myšlenky přímého slučování
      • při slévání rovnou rozděluji do více souborů
      • více pásek
      • zvětšování délky běhů (a tedy i zmenšování jejich počtu) předtříděním ve vnitřní paměti,
        příklad použití dvou heapů
    • Idea polyfázového třídění výpočet optimálního rozdělení běhů na více pásek,
      odvození optimálního rozdělení počtu běhů na pásky, implementační poznámky - fiktivní běhy
    • Hledání k-tého prvku,
      algoritmus využívající datovou strukturu heap(hromadu), algoritmy založené na idei quicksortu
    • Lineární algoritmus pro hledání mediánu
    • Porovnání použití záznamu s variantami a
      a popisu téhož pomocí dědičnosti (návrh hierarchie tříd)
    • Shanonnova věta o existenci neprohrávající strategie,
      algoritmus minimaxu jako její důkaz
  22. Zpět začátek
  23. přednáška 20.května
    Pravděpodobný obsah přednášky
    • Opakování - Shanonnova věta o existenci neprohrávající strategie,
      algoritmus minimaxu jako její důkaz
    • Negamaxová modifikace algoritmu minimaxu
    • Použití algoritmu minimaxu v případě her, kde je úplný strom hry neúnosně velký - počítání do zvoleného horizontu (doplněné vyhledáváním "tichých" pozic) a použití statické ohodnocovací funkce pro ohodnocení listů tohoto podstromu
      minimax v tomto kontextu již není používán jako přesný algoritmus pro hledání optimální strategie, ale jako součást heuristiky
    • Kvalita statické ohodnocovací funkce versus hlubší horizont
    • Algoritmus alfa-beta prořezávání jako efektivnější nalezení přesné minimaxové hodnoty
    • efektivita alfa- beta prořezávání a různé metody analýzy plausibilty (t.j. snah o to, aby bylo prořezávání efektivní)
    • Metoda okénka
    • Kaskádní varianta s použitím okénka
    • Funkcionální a procedurální parametry, Funkcionální a procedurální typy, dlouhé adresy a přepinač F.
    • Podprogram pro hledání kořene rovnice F(x)=0 metodou půlení intervalu s funkcionálním parametrem F
    • vybrané grafové algoritmy
      • topologické uspořádání grafů - algoritmus animace
      • Dijkstrův algoritmus pro hledání nejkratších cest z daného vrcholu - animace
      • hledání nejlacinější kostry
      • hledání komponent souvislosti- animace
      • faktorová množnina - animace
    • Definitivní verze požadavků ke zkoušce
    • Pozvání na výběrovou přednášku
      Programování III pro neinformatiky - neprocedurální programování
      v zimním semestru
  24. Zpět začátek
Zpět PRM045