Zpět PRM045

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

Hromadná konzultace se koná v pondělí 28.května od 14:00 hodin v posluchárně S3

  1. přednáška 21.února
  2. přednáška 28.února
  3. přednáška 7.března
  4. přednáška 14.března
  5. přednáška 21.března
  6. přednáška 28.března
  7. přednáška 4.dubna
  8. přednáška 11.dubna
  9. přednáška 18.dubna
  10. přednáška 25.dubna
  11. 2.května bude místo přednášky z programování přednáška z algebry
  12. přednáška 9.května od 9:00 hodin
  13. přednáška 9.května od 10:40 hodin - místo přednášky z algebry
  14. 16.května -rektorský den
  15. přednáška 23.května
  1. přednáška 21.února
    • Komentář k praktickým testům a udílení zápočtů
    • Náplň letního semestru, zkouška
    • Statická alokace paměti (dosud jiná nebyla) pro proměnné v Pascalu
      provádí se "na zásobníku" - vzniká při zpracování deklarací bloku, zaniká "automaticky" při ukončení bloku,
    • 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
  2. Zpět začátek
  3. přednáška 28.února
    • Průzkum zájmu o skládání praktických testů v SISu - chcete-li se vyjádřit, učiňte tak nejpozději do 3.3.2007
    • Opakování: dunamicky alokované proměnné, ukazatele, konastanta nil, procedury new a delete
      efekt příkazú
      { type
      link = ^node ;
      node = record A:info; next:link end;
      var X,Y : link; }
      new(X);
      X:=Y;
    • 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
      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 jednodyché akce s nimi
    • Na rozmyšlenou:
      Vytvořte podprogram pro otáčení cyklického 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) - skuste 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ů.
  4. Zpět začátek
  5. přednáška 7.března
    • Termíny praktických testů jsou SISu.
    • opakování dynamicky alokované proměnné, ukazatele, procedury new a dispose
    • Řídké matice - je třeba kriticky hodnotit přínosy té které implementace
    • Technické úlohy na rozmyšlenou:
      • Napsat proceduru, která na základě dat ze vstupu vytvoří probíranou reprezentavci řídké matice
      • Procedury pro "skladiště konzerv"
    • 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 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 nutné - na přednášce teprve bude
    • Stromy, binární 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 pomocí indentace - jednoduchá rekursivní procedura
    • Pojem binárního vyhledávacího stromu
    • Algoritmus vyhledávání v binárním vyhledávacím stromě
  6. Zpět začátek
  7. přednáška 14.března
    • Opakování - binární vyhledávací stromy
    • Binární vyhledávací stromy a operace na nich: vyhledávání, vkládání a vypuštění prvku s daným klíčem
      rekursivní podprogramy, které je realizují, diskuse způsobů předávání parametrů těmto podprogramům
    • 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í
    • 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.
    • Vnitřní a vnější třídění
    • 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)
    • Jednoduché algoritmy složitosti O(n2):
      • přímé zatřiďování
      • třídění výběrem
      • třídění výměnami - bubblesort, shakesort
      Programy - vytiskněte si na příští přednášku spolu se souborem obsahujícím nerekursivní verzi algoritmu Quicksort
    • prezence
  8. Zpět začátek
  9. přednáška 21.března
    • apel: měli byste během nejdéle 2 týdnů mít zažitu práci s ukazateli a dynamicky alokovanými proměnnými,
      abyste neměli problémy s další látkou
    • povídání o zkoušce v letním semestru
    • Opakování jednoduchých algoritmů vnitřního třídění - zdrojáky
    • 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)
    • Důkaz tvrzení, že neexituje žá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
    • Pro nejlepší případ analogické tvrzení neplatí - protipříklad
    • 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
    • Rozmyslet si:
      V čem může být quicksort lepší než heapsort, když jsme dokázali, "že heapsort je optimální" ?
    • Vytiskněte si: nerekursivní verzi quicksortu a soubory týkající se vnějšího třídění unita streams a algoritmus přirozeného slučování
  10. Zpět začátek
  11. přednáška 28.března
    • Odstraňování rekurze pomocí zásobníku
    • Algoritmus Quicksort, jeho rekursivní a nerekursivní verze
      naprogramujte si verzi se spojově realizovaným zásobníkem, která odkládá na zásobník obě žádosti o setřádění intervalu
    • paměťová složitost quicksortu
    • vylepšení quicksortu
      • pivot jako medián malého počtu nahodně vybraných prvků pole
      • je-li pivot prvek tříděného pole, může sloužit jako zarážka
      • odstranění rekurze
      • do zásobníku dřív žádost setřídění delší úseku
      • malé úseky se nevyplatí třídit quicksortem - do zásobníku je nedáváme, setříme všechny najednou přímým zatřiďováním
      • detekce "velmi špatných případů" a případné následné použití jiného algoritmu
    • multiplikativní konstanta u časové složitosti quicksoru může být menší než u heapsortu
    • idea mergesortu - rekursivní verze je v unitě
      naprogramujte si nerekursivně
    • metoda návrhu rozděl a panuj: analýza, rekurze, sytéza
      " klasifikace" algoritmů vnitřního třídění z tohoto hlediska
    • 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í
  12. Zpět začátek
  13. přednáška 4.dubna
    • Vnější třídění - opakování algoritmu přímého slučování
    • 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
    • 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í.
    • Vývoj programování
      • strojový kód, absolutní adresy
      • První programovací jazyky
        proměnné, řídící příkazy, cykly, podprogramy
      • Strukturované programování
        • strukturované řídící příkazy
        • datové struktury
        • role podprogramů
        • návrh programu metodou shora dolů
      • Modulární programování
        separátní kompilace, abstraktní datové struktury, pojem metody
      • Objektové programování - charakteristika přínosů
  14. Zpět začátek
  15. přednáška 11.dubna
    • První princip objektového programování: zapouzdření - encapsulation
      metody jsou atributem datové struktury
      jednoduchý příklad
    • Terminologie:
      třída ... datový typ
      objekt ... proměnná daného typu (exemplář, instance třídy)
    • Ochrana atributů třídy - private a public
    • Motivační příklad pro zavedení objektového programování
    • Dědičnost.
      Terminologie: Třída, objekt, podtřída, nadtřída.
      Podtřída sdědí všechny atributy nadtřídy a může
      • přidat datové atributy
      • přidat další metody
      • předefinovat metody sděděné z nadtřídy
    • Ochrana přiřazovacího příkazu - lze přiřadit do proměnné pro třídu objekt podtřídy a nikoli naopak.
    • 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, ... rozmyslet- připravit si dotazy
      ne všechno jsme vysvětlili "do konce" - příště se k ní vrátíme podrobněji
    • ukázkové příklady na polytmorfismus s hierarchií tříd zvíře, pes kočka
      bude vyloženo příště
  16. Zpět začátek
  17. přednáška 18.dubna
    • Opakování objektové programování:
      zapouzdření, ochrana přístupu k atributům tříd, dědičnost, specikace inherited, ochrana přiřazovacího příkazu, přetypování, operátor @, ...
    • Polymorfismus, časná (early) a pozdní (late) vazba (binding) při volání metod, virtuální metody
    • Programy demonstrující virtuální metody - třída zvíře a podtřídy pes a kočka s virtuálními metodami
    • VMT tabulky a role konstruktoru
    • Funkce typeof
    • Příklad objektové hierarchie pro práci s geometrickými útvary
      zdroják
    • Nový komentář k "dopručením pro objektové programován v Pascalu" - viz minulá přednáška
    • prezence
  18. Zpět začátek
  19. přednáška 25.dubna
    • O praktických testech. O zkoušce
    • definice dokonale vybalancovaného stromu
    • rekursivní podprogram, který vytvoří dokonale vybalancovaný binární vyhledávací strom
      z prvních N čísel rostoucí posloupnosti (uložené v textovém souboru)
      rozmyslet:odstraňte z této procedury rekurzi (pomocí zásobníku)
    • 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
    • Rozdíl mezi datovými strukturami pole a record není jen v to, že všechny složky pole musí být stejného typu,
      ale také v tom, že výběr adresy složky recordu jde udělat již za překladu (selektor je identifikátor položky),
      kdežto u pole je selektorem u pole je indexový výraz, jehož nemusí a zpravidla není zníma během překladu.
      Proto jde udělat cyklus přes prvky pole, jde indexový výraz předat jako parametr, a pod.
    • Z výše zmíněných dúvodů je výhodnější definovat typ uzlu AVL stromu s polem ukazatelů na dva podstromy ( indexované třeba výčtovým typem (left, right) ), protože pak můžeme procedurám pro rotace zadat směr rotace jako parametr a nemusíme "programovat totéž dvakrát".
    • 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 - trasování konké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ěří)
      • Příklady dalších úloh, které lze efektivně řešit pomocí dynamického programování (budou probrány na cvičeních)
        • Hledání optimálního vyhledávacího stromu (vstup: pravděpodobnosti dotazů na jednotlivé hodnoty klíčů) - včetně modikace, která dosahuje složitost O(n2) - viz, kniha N.Wirtha
        • Hledání nejkratší triangulace - viz. např. kniha P. Töpfera
  20. přednáška 9.května
  21. a
  22. přednáška 9.května
  23. (mimo jiné) na přednášce bude
    Zpět začátek
  24. přednáška 23.května
    • Lineární algoritmus pro nalezení nejdelšího symetrického úseku
      jako příklad toho, že složitost algoritmu přirozeně popsaného dvěma cykly v sobě může být lineární
    • Standardní podprogramy getmem a freemem jako nízkoúrovňové prostředky pro alokaci a dealokaci paměti
      realizace dynamického pole v Pascalu jejich pomocí a přetypováním pointeru
    • Hašování
      bezkolizní hašování, kolize a různé metody jejich řešení, metoda řetízků, efektivita hašování
    • optimální rozložení abecedy s danými četnostmi písmen na klávesy mobilního telefonu
    • Komentář ke zkoušce
    • Pozvání na výběrovou přednášku PRM046 Programování III pro neinformatiky,
      jejíž náplní je neprocedurální programování
  25. Zpět začátek
Zpět PRM045