Zpět NMIN102

LS 2012/13
NMIN102 Programování II 2011 paralelka Y - středa 14:00 F2
co bylo na přednáškách

  1. přednáška 20.února
  2. přednáška 27.února
  3. přednáška 6.března
  4. přednáška 13.března
  5. přednáška 20.března
  6. přednáška 27.března
  7. přednáška 3.dubna
  8. přednáška10.dubna
  9. přednáška 17.dubna
  10. přednáška 24.dubna
  11. přednáška 15.května
  12. přednáška 22.května
  1. přednáška 20.února
    • Komentář k praktickým testům a udílení zápočtů
    • Náplň letního semestru, zkouška
    • Opakování: Asymptotická složitost
    • Opakování: Vnitřní třídění
      • Vnitřní třídění - specifikace úlohy, adresní a asociativní (založené na porovnávání klíčů) algoritm
      • y
      • adresní třídění pro malý rozsah čísel - bucketsort
      • Jednoduché asociativní algoritmy složitosti O(n2):
        1. přímé zatřiďování
        2. binární zatřiďování - polohu najdeme v logaritmické čase, ale posun pole je lineární
        3. třídění výměnami - bubblesort, shakesort implementace bez pamatování si místa poslední výměny je programátorská nešikovnost
    • Radixové třídění - adresní třídění, algoritmus jeho realizace na třídících strojích
      nebudeme zatím programovat
    • zdrojové texty procedur realizujících jednotlivé třídící algoritmy
    • 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í
    • Obdobné tvrzení platí i pro průměrný případ (myšlenka důkazu), ale pro nejlepší případ neplatí.
  2. Zpět začátek
  3. přednáška 27.února
    • Opakování: spodní odhad časové složitosti úlohy vnitřního třídění je v nejhorším i průměrném případě n*log(n)
    • opakování: quicksort
    • Časová a paměťová složitost quicksortu, různé optimalizace
    • Opakování: heapsort
      • datová struktura heap (hromada) a dvě základní operace s ní: delete-min a přidej prvek
      • hromada jako část pole, reprezentace hromady v poli,
        algoritmus heap sortu
    • Časová a paměťová složitost heapsortu/li>
    • porovnání algoritmů heapsort a quicksort
    • algoritmus vnitřního třídění sléváním - mergesort
      netřídí na místě
    • Vnitřní a vnější třídění - rozdíly
    • 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í
      podívejte se na ní, příště si budeme povídat o různých způsobech vylepšení základní idey přímého slučování
  4. Zpět začátek
  5. přednáška 6.března
    • Opakování principu algoritmu přímé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, diskuse o tom, že nepomůže pracovat s příliš mnoha (režie OS, někaou dobu trvá vybrat nejmenšího - i když použijeme heap)
      • idea polyfázového třídění - ideální distribuce běhů bude později
      • 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ů bude později
    • Rozmyslete si:- 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í.
      tuto ideu lze použít u vnitřního třídění: Mergesort třídí v čase n*log(n), ale ne in situ - potřebuje dvě pole
    • 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.
    • Možnost vzniku "smetí v paměti" ztratíme-li možnost přístupu k dynamicky alokované proměnné
    • 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.
    • 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
    • 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
    • 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
    • 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
    • Podprogram pro otáčení seznamu s hlavou
      rozmyslete si kolik proměnných potřebujete
  6. Zpět začátek
  7. přednáška 13.března 12:20
    • Otáčení lineárního seznamu
    • opakování: typ ukazatel, bázový typ, statická a dynamická alokace paměti, 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é 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ů.
    • Ří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
  8. Zpět začátek
  9. přednáška 20.března
    Na přednášce asi bude
    • 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 - terminologie
    • Různá data se stromovou strukturou, různé datové reprezentace stromu
    • Kanonická reprezentace lesa pomocí binárního stromu
    • Visualizace binárního stromu
    • Reprezentace aritmetických výrazů pomocí binárních stromů
    • průchody binárním stromem do hloubky - souvislost s aritmetickými notacemi
    • 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
    • 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í
    • vypuštění intervalu z BVS
  10. Zpět začátek
  11. přednáška 27.března
    • 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, proto se spíše používají jiné definice balancovaných stromů.
    • 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í
    • Hledání optimálního uzávorkování součinu N matic jakožto "typická" úloha na dynamické programování
    • Návod pro hledání max společného podřetězce dvou řetězců
  12. Zpět začátek
  13. přednáška 3.dubna
  14. Zpět začátek
  15. přednáška 10.dubna
  16. Zpět začátek
  17. přednáška 17.dubna
    Na přednášce pravděpodobně bude
    • Opakování objektového programování:
      zapouzdření (encapsulation), dědičnost (inheritance), ochrana přiřazovacího příkazu
      Terminologie: Třída, objekt, podtřída, nadtřída.
      Ochrana atributů třídy - private a public
      konstruktory a destruktory Rozšířená syntaxe procedur new a dispose s druhým parametrem voláním konstruktoru resp. destruktoru
    • Doporučení pro objektové programování v Pascalu:
      1. Neužívejte staticky alokované objekty.
      2. Při alokaci a dealokaci dynamických objektů užívejte jen rozšířenou syntaxi new resp. dispose s voláním konstruktoru resp. destruktoru.
      3. Každá třída, jejíž objekty chcete vytvářet (není jen abstraktní), by měla mít konstruktor a destruktor (třeba zděděný nebo prázdný).
      4. Prvním příkazem konstruktoru podtřídy by mělo být zavolání konstruktoru její nadtřídy (slušnost a dobrý návyk).
    • ukázkové příklady na polytmorfismus s hierarchií tříd zvíře, pes a kočka
      k příkladům se vrátíme
    • Polymorfismus, virtuální metody, VMT tabulka, role konstruktoru
    • funkce typeof a její použití
    • ještě jednou k příkladu s dousměrnými cyklickými seznamy
      abstraktní typy, implicitní parametr self, přetypování, operátor @, použití typeof, proč je destruktor třídy link virtualní,
    • Definice vyhraných a prohraných pozic, jejich hledání v případě jednoduchých konkrétních her
    • Antagonistické hry dvou hráčů s úplnou informací a nulovým součtem
    • Shanonnova věta o existenci neprohrávající strategie,
      algoritmus minimaxu jako její důkaz
    • Negamaxová modifikace algoritmu minimaxu
    • Když popisujeme hru vždy z pohledu hráče na tahu, vede to k jednodušším formulacím tvrzení i algoritmů .
  18. Zpět začátek
  19. přednáška 24.dubna
    • Opakování:
      Shanonnova věta, algoritmus minimaxu, jeho negamaxová implementace
    • 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
    • motivace alfa-beta metody procházení stromu hry jako heuristiky pro efektivnější nalezení přesné minimaxové hodnoty zadaného stromu hry.
    • Algoritmus alfa-beta prořezávání jako efektivnější nalezení přesné minimaxové hodnoty
      Alfa-beta projde v nejhorším případě celý strom, tedy nejenom, že nic neušetří, ale trvá déle, protože udržování parametrů alfa a beta něco stojí.
      V optimálním případě projde sqrt(P) listů, kde P je počet listů, který by prošel minimax. Počet navštívených listů se se používá jako míra složitosti proto, že se v nich volá statická ohodnocovací funkce, jejíž výpočet je náročnější než průchod stromem.
    • 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
    • Program, který má hrát celou partii má tři fáze:
      1. zahájení - řeší se knihovnou
      2. střední hra - probírali jsme podrobně: pracujeme se stromem hry ikdyž to ve skutečnosti strom není (více cest do téže pozice)
      3. koncovky - mohou být řešeny různě, hlavní rozdíl je, že je "málo pozic a mnoho variant", proto se ukládají již ohodnocené pozice do tabulky
    • Speciální problémy se mohou řešit zcela jinak - např. zpětná analýza našla pozice, v nichž "pravidlo 50 tahů" mění hru
  20. Zpět začátek
  21. přednáška 15.května
    přednáška bude suplována
  22. Zpět začátek
  23. přednáška 22.května
    Na přednášce mimo jiného uděláme inventuru zkouškových požadavků
  24. Zpět začátek
Zpět PRM045