Regulární jazyky
Deterministický a nedeterministický konečný automat
Regulární výrazy
Gramatika, jazyk generovaný gramatikou
Zásobníkový automat, třída jazyků přijímaných zásobníkovými automaty
Pumping lemma pro bezkontextové jazyky
Chomského normální tvar
Turingův stroj
Algoritmicky nerozhodnutelné problémy
Chomského hierarchie
Schopnost zařazení konkrétního jazyka do Chomského hierarchie (zpravidla sestrojení odpovídajícího automatu či gramatiky)
Příklad kontextového jazyka
Časová a prostorová složitost algoritmu
Měření velikosti dat
Složitost v nejlepším, nejhorším a průměrném případě
Asymptotická notace
Třídy P a NP
Převoditelnost problémů, NP-těžkost a NP-úplnost
Příklady NP-úplných problémů a převodů mezi nimi
Metoda rozděl a panuj: princip rekurzivního dělení problému na podproblémy
Metoda rozděl a panuj: výpočet složitosti pomocí rekurentních rovnic
Master theorem (kuchařková věta) – bez důkazu
Metoda rozděl a panuj: aplikace (Mergesort, násobení dlouhých čísel)
Definice (binárního) vyhledávacího stromu
Operace s nevyvažovanými binárními vyhledávacími stromy
AVL stromy (definice)
Primitivní třídicí algoritmy (Bubblesort, Insertsort)
Quicksort
Dolní odhad složitosti porovnávacích třídicích algoritmů
Prohledávání grafu do šířky a do hloubky
Topologické třídění orientovaných grafů
Nejkratší cesty v ohodnocených grafech (Dijkstrův a Bellmanův-Fordův algoritmus)
Minimální kostra grafu (Jarníkův a Borůvkův algoritmus)
Toky v sítích (Ford-Fulkerson algoritmus)
Abstrakce, zapouzdření, polymorfismus – související konstrukty programovacích jazyků (třídy, rozhraní, metody, datové položky, dědičnost, viditelnost)
I
public int m(int a, int b);
class Kachna : IPostovniZvire {…}
IPostovniZvire zvire1 = new Kachna();
(Dynamický) polymorfismus, statické a dynamické typování
dynamic
object
)Vícenásobná dědičnost a její problémy (vícenásobná a virtuální dědičnost v C++, interfaces v C#)
diamantový problém – pokud mají moji rodiče společného rodiče a já volám jeho metodu, kterou oba implementují, jaká metoda se má volat?
Číselné a výčtové typy
enum Season { Spring, Summer, Autumn, Winter }
: ushort
, tak se místo intu použije ushortUkazatele a reference v C++
Hodnotové a referenční typy v C#
.GetType()
new
, které nic nealokuje, ale zavolá konstruktornew
Pokročilé prvky syntaxe C#
int[][] a = new int[2][];
a[0] = new int[3];
a[1] = new int[4];
int x = a[0][1];
int[,] a = new int[2, 3];
int x = a[0, 1];
public T this[int i] { get { return arr[i]; } set { arr[i] = value; } } }
bool HasValue
a taky T Value
public static Fraction operator *(Fraction left, Fraction right) => new Fraction(left.numerator * right.numerator, left.denominator * right.denominator);
public static implicit operator byte(Digit d) => d.digit;
public static explicit operator Digit(byte b) => new Digit(b);
Reference, imutabilní typy a boxing v C#
ref
– používá se u parametrů funkcí, uvádí se dvakrát, v hlavičce funkce i při voláníref
, tak proměnná musí být inicializovaná (aby se z ní dalo číst)out
– na úrovni CIL kódu je to to samé, ale nevyžaduje to, aby proměnné byly inicializovanéthrow;
), tak pod try/catch můžu proměnnou považovat za inicializovanouif (int.Parse(s, out int x))
, tak se proměnná deklaruje před ifemin
… proměnná uvnitř funkce funguje jako readonly (podobně celá struktura funguje jako readonly)in
má smysl u výkonnostních optimalizací hodnotových typů (typicky u počítačových her)in
se dá použít taky ref readonly
– je to něco velmi podobnéhoŠablony (templates) a statický polymorfismus v C++
template<typename T> const T& max(const T& a, const T& b) { return a < b ? b : a; }
Generické typy v C# (bez omezení typových parametrů)
class GenericList<T> { }
Typy reprezentující funkce v C++, C#
delegate
definujeme nový delegátní typ: public delegate void Callback(string message);
DelegateMethod
s jedním parametrem typu string, která vrací void, tak můžeme provést přiřazení Callback handler = DelegateMethod;
Callback handler = new Callback(DelegateMethod);
handler("Hello World");
this
this
je tam navždythis
se zkopíruje struktura (zaboxuje se)Action<…>(…) → void
Func<…, TResult>(…) → TResult
Predicate<T>(T obj) → bool
var
funguje i pro delegátystd::function
Lambda funkce a funkcionální rozhraní
(input-parameters) => expression
nebo (input-parameters) => { <sequence-of-statements> }
static x => x + 1
Správa životního cyklu zdrojů v případě výskytu chyb – RAII v C++, using v C#, obsluha a propagace výjimek
using (var f1 = new FileStream("...")) { ... }
throw new Ex();
, kde Ex
je nějaký typ výjimky (konstruktor může mít parametr – třeba nějakou zprávu)throw;
Alokace (alokace statická, na zásobníku, na haldě)
Inicializace (konstruktory, volání zděděných konstruktorů)
public B(params1) : base(params2) {
base
píšeme přímo název rodičovské třídyDestrukce (destruktory, finalizátory)
Explicitní uvolňování objektů, reference counting, garbage collector
Reprezentace vláken v programovacích jazycích
Specifikace funkce vykonávané vláknem a základní operace nad vlákny
Časově závislé chyby (race condition) a mechanismy pro synchronizaci vláken
Monitor.Enter(obj)
zamkne zámek na daném objektu (nebo pasivně čeká, dokud se neodemkne)Monitor.Exit(obj)
odemkne zámeklock(obj) { … }
, na začátku bloku se volá Enter, na konci se volá Exitlock (this)
Monitor.Wait(obj)
zařadí do seznamuMonitor.Pulse(obj)
nebo Monitor.PulseAll(obj)
Implementace dynamického polymorfismu (tabulka virtuálních metod)
Nativní a interpretovaný běh, reprezentace programu, bytecode, interpret jazyka, just-in-time (JIT) a ahead-of-time (AOT) překlad
Proces sestavení programu, oddělený překlad, linkování, staticky a dynamicky linkované knihovny
Běhové prostředí procesu a vazba na operační systém
Základní architektura počítače, reprezentace čísel, dat a programů
Reprezentace a přístup k datům v paměti, adresa, adresový prostor
Ukládání jednoduchých a složených datových typů
Implementovat běžné programové konstrukce vyšších jazyků (přiřazení, podmínka, cyklus, volání funkce) pomocí instrukcí procesoru
nacvičit
Zapsat běžnou konstrukci vyššího jazyka (přiřazení, podmínka, cyklus, volání funkce), která odpovídá zadané sekvenci (vysvětlených) instrukcí procesoru
nacvičit
Podpora pro běh operačního systému – privilegovaný a neprivilegovaný režim procesoru, jádro operačního systému
Popsat roli řadiče zařízení při programem řízené obsluze zařízení (PIO), pro zadané adresy a funkce vstupních a výstupních portů implementovat programem řízenou obsluhu zadaného zařízení (myš, disk)
Popsat roli přerušení při programem řízené obsluze zařízení (PIO), na úrovni vykonávání instrukcí popsat reakci procesoru (hardware) a operačního systému (software) na žádost o přerušení
Neprivilegované (uživatelské) procesy
Procesy, vlákna, kontext procesu a vlákna
Přepínání kontextu, kooperativní a preemptivní multitasking
Plánování běhu procesů a vláken, stavy vlákna
Vysvětlit rozdíl mezi virtuální a fyzickou adresou a identifikovat, zda se v zadaném kontextu či fragmentu kódu používá virtuální nebo fyzická adresa
Na zadaném příkladu identifikovat a vysvětlit význam komponent virtuální a fyzické adresy (číslo stránky, číslo rámce, offset)
Pro konkrétní adresy a obsah jednoúrovňové stránkovací tabulky řešit úlohy překladu adres
Vysvětlit roli virtuálních adresových prostorů v ochraně paměti procesů a vláken
Sdílení úložného prostoru – soubory, analogie s adresovým prostorem; abstrakce a rozhraní pro práci se soubory
Časově závislé chyby (race conditions)
Kritická sekce, vzájemné vyloučení
Základní synchronizační primitiva, jejich rozhraní a použití – aktivní a pasivní čekání, zámky