Zpět PRM045

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

  1. přednáška 24.února
  2. přednáška 3.března
  3. přednáška 10.března
  4. přednáška 17.března
  5. přednáška 24.března
  6. přednáška 31.března
  7. přednáška 7.dubna
  8. přednáška 14.dubna
  9. přednáška 21.dubna
  10. přednáška 28.dubna
  11. přednáška 5.května
  12. přednáška 12.května
  13. přednáška 19.května
  14. přednáška 26.května
  1. přednáška 24.ú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
    • Jednodušší forma pro třídění posloupností, v nichž mohou být je čísla z malého rozsahu hodnot
    • Asociativní algoritmy - založené na porovnávání klíčů
      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
    • Podařilo se nám dosáhnout "optima". Neexistuje totiž žádný asociativní algoritmus vnitřního třídění, který by měl asymptotickou časovou složitost lepší než n*log(n).
    • 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
    • Platí toto tvrzení i pro nejlepší případ ?
    • V mnoha učebnicích si můžete přečíst "slogan", že quicksort je nejlepší algoritmus v nějšího třídění,
      rozmyslete si v čem může být lepší než heapsort, který třídí na místě a se složitostí n*log(n) i v nejhorším případě,
      příště se k tomu vrátíme
  2. Zpět začátek
  3. přednáška 3.března
    • Vztah algoritmů quicksort a heapsort
    • optimalizace quicksortu
    • 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. 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
    • 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
  4. Zpět začátek
  5. přednáška 10.března
    • opakování dynamicky alokované proměnné, ukazatele, procedury new a dispose
    • 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
    • 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
    • Implementace fronty a zásobníku pomocí pole a spojových seznamů
  6. Zpět začátek
  7. přednáška 17.března 12:20
    • 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
    • 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
  8. Zpět začátek
  9. přednáška 24.března 14:00
    • 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
    • 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í
    • 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í.
  10. Zpět začátek
  11. přednáška 31.března
    • 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
      • idea polyfázového třídění - ideální distribuce běhů
      • 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ů
    • binární vyhledávací stromy opakování
    • 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í
    • 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í
  12. Zpět začátek
  13. přednáška 7.dubna
  14. Pravděpodobný obsah přednášky
    Zpět začátek
  15. přednáška 14.dubna
  16. Na přednášce pravděpodobně bude
    Zpět začátek
  17. přednáška 21.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
    • 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).
    • Unita obsahující objektovou implementaci dvojsměrných lineárních seznamů s hlavou
      abstraktní typy, přetypování ukazatelů na objekt,implicitní parametr self, operátor @, funkce typeof, destruktor třídy head, ...
      příklad je poměrně komplexní, ilustruje mnoho jevů, některé jsme ještě neprobrali, vrátíme se k němu, rozmyslete si případné dotazy
    • 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í
  18. Zpět začátek
  19. přednáška 28.dubna
    • Průzkum zájmu o termíny zkoušky
    • Opakování objektového programování
    • ukázkové příklady na polytmorfismus s hierarchií tříd zvíře, pes a kočka
    • Polymorfismus, virtuální metody, VMT tabulka, role konstruktoru
    • 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ů .
    • 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é minmaxové hodnoty zadaného stromu hry.
  20. Zpět začátek
  21. přednáška 5.května
    Pravděpodobný obsah přednášky
    • Tento pátek je programátorská soutěž pro studenty I.ročníku:
      • Kdy: Pátek 6.5.2010 15:00 až 18:00
      • Kdo: Studenti 1.ročníku MFF UK oborů informatika, matematika
      • Jak: Skupina v CodExu
      • Co: Úlohy, podobně jako ostatní úlohy v CodExu
      • Přihlašování: Není třeba se přihlašovat, všichni budou přihlášení
      • Submity: povoleno 5 submitů pro každou úlohu
      • Proč:
        1. zjistit,
          - jak na tom jsou ti, kdo si myslí, ze jsou špatní (a možná to není pravda)
          - jak na tom jsou ti, kdo si myslí, ze jsou dobří (a možná to není pravda)
          - kdo má chuť si hrát
        2. pro radost z řešení problémů
      • Výsledky: Až po skončení soutěže.
      • Výhry, kontrola nepodvádění : žádné, každý to dělá pro sebe
    • O zkouškách
    • Požadavky 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
    • 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
    • Definice vyhraných a prohraných pozic, jejich hledání v případě jednoduchých konkrétních her
    • řešení úlohy o optimalizaci rozložení písmen na klávesnici mobilu
    • Opět rozmyslet:Optimální binární vyhledávací strom k zadaným frekvencím pozitivních a negativních dotazů
    • 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
  22. Zpět začátek
  23. přednáška 13.května
    Pravděpodobný obsah přednášky
  24. Zpět začátek
  25. přednáška 19.května
    • B- stromy algoritmy vkládání a vypouštění
    • opakování lineárního algoritmu prohledání mediánu
    • jednoduchý lineární algoritmus pro nalezení prvních n prvků z n2 prvků
    • nalezení optimálního binárního vyhledávacího stromu ze zadaných frekvencí pozitivních dotazů
      myšlenka modifikace, aby pracovalo v čase O(n2)
    • vytvoření dynamického pole v Brorland Pascalu pomocí prostředků nízké úrovně pro alokaci a dealokaci paměti
    • Ukázky možných (teď) už nemožných) zkouškových příkladů
  26. Zpět začátek
  27. přednáška 26.května
    zajímavé algoritmy - bude suplována RNDr Tomášem Holanem
  28. Zpět začátek
Zpět PRM045