<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.512.cz/skins/common/feed.css?301"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>https://www.512.cz/index.php?feed=atom&amp;target=Acolade&amp;title=Speci%C3%A1ln%C3%AD%3AP%C5%99%C3%ADsp%C4%9Bvky%2FAcolade</id>
		<title>FAV wiki - Příspěvky uživatele [cs]</title>
		<link rel="self" type="application/atom+xml" href="https://www.512.cz/index.php?feed=atom&amp;target=Acolade&amp;title=Speci%C3%A1ln%C3%AD%3AP%C5%99%C3%ADsp%C4%9Bvky%2FAcolade"/>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Speci%C3%A1ln%C3%AD:P%C5%99%C3%ADsp%C4%9Bvky/Acolade"/>
		<updated>2026-10-20T17:36:02Z</updated>
		<subtitle>Z FAV wiki</subtitle>
		<generator>MediaWiki 1.17.0</generator>

	<entry>
		<id>https://www.512.cz/index.php?title=Kontrola_konzistence_souborov%C3%A9ho_syst%C3%A9mu,_mechanismy_ochrany_p%C5%99ed_neopr%C3%A1vn%C4%9Bn%C3%BDm_p%C5%99%C3%ADstupem</id>
		<title>Kontrola konzistence souborového systému, mechanismy ochrany před neoprávněným přístupem</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Kontrola_konzistence_souborov%C3%A9ho_syst%C3%A9mu,_mechanismy_ochrany_p%C5%99ed_neopr%C3%A1vn%C4%9Bn%C3%BDm_p%C5%99%C3%ADstupem"/>
				<updated>2014-02-20T06:49:08Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Kontrola konzistence informace o diskových blocích souborů ==&lt;br /&gt;
&lt;br /&gt;
Program vytvoří 2 tabulky, obsahující čítač pro každý blok&lt;br /&gt;
* Tabulka počtu výskytů bloku v souboru&lt;br /&gt;
* Tabulka počtu výskytů bloku v seznamu volných bloků (seznam nebo bitová mapa)&lt;br /&gt;
&lt;br /&gt;
Je-li FS konzistentní, bude mít každý blok 1 buď v první, nebo ve druhé tabulce&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Kontrola-fs.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Možné chyby:&lt;br /&gt;
0-0: blok se nevyskytuje v žádné tabulce, není zavažné pouze redukuje kapacitu - vložení do seznamu volných bloků&lt;br /&gt;
0-2: blok je dvakrát nebo vícekrát v seznamu volných (!) - smazání jednoho záznamu ze seznamu volných bloků&lt;br /&gt;
1-1: blok patří souboru a zároveň je na seznamu volných (!) - vyjmeme ze seznamu volných bloků&lt;br /&gt;
2-0: blok patří do dvou nebo více souborů, nejzávažnější problém, nejspíše už došlo ke ztrátě dat (!!!) - alokujeme nový blok, problémový soubor do něj umístíme a upravíme i-uzel druhého souboru. Informujeme uživatele o problému.&lt;br /&gt;
&lt;br /&gt;
== Kontrola konzistence adresářové struktury ==&lt;br /&gt;
&lt;br /&gt;
Projdeme celý adresářový strom, kontrolujeme zda odpovídá počet odkazů v i-uzlu (i) s počtem výskytů v adresářích (a)&lt;br /&gt;
* i = a - vše je OK&lt;br /&gt;
* i &amp;gt; a - soubor by nebyl zrušen ani po zrušení všech odkazů v adresářích&lt;br /&gt;
* i &amp;lt; a - soubor by byl zrušen po zrušení i odkazů, ale v adresářích budou ještě jména&lt;br /&gt;
* a = 0 , i &amp;gt; 0 - ztracený soubor, na který není v adresáři odkaz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Žurnálování ==&lt;br /&gt;
&lt;br /&gt;
Před každým zápisem na disk vytvoří na disku záznam popisující plánované operace, pak provede operace a záznam zruší. Výpadek – na disku najdeme žurnál o všech operacích, které mohly být v době havárie rozpracované, zjednodušuje kontrolu konzistence fs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mechanismy ochrany ==&lt;br /&gt;
&lt;br /&gt;
* Soubor je třeba chránit před neoprávněným přístupem&lt;br /&gt;
* Systém musí uchovávat informace o přístupových právech subjektů k objektům&lt;br /&gt;
* Informace může být ve dvou různých podobách: ACL nebo CL&lt;br /&gt;
&lt;br /&gt;
* Subjekt – entita schopná přistupovat k objektům (většinou proces)&lt;br /&gt;
* Objekt – cokoliv, k čemu je potřeba omezovat přístup pomocí přístupových práv (např. soubor)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mechanismus ACL (Access Control Lists)&lt;br /&gt;
* S každým objektem sdružen seznam subjektů, které mohou k objektu přistupovat&lt;br /&gt;
* Pro každý uvedený subjekt je v ACL množina přístupových práv k objektu&lt;br /&gt;
* sbjekty se zpravidla sdružují do skupin (učitelé, studenti, admini...)&lt;br /&gt;
* ntfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mechanismus Capability Lists&lt;br /&gt;
* S každým subjektem sdružen seznam objektů, ke kterým může přistupovat a jakým způsobem&lt;br /&gt;
* Problém: zjištění, kdo všechno má k objektu přístup + zrušení přístupu velmi obtížné&lt;br /&gt;
* Řešení: odkaz neukazuje na objekt, ale na nepřímý objekt; systém může zrušit nepřímý objekt, tím neplatní odkazy na objekt ze všech C-seznamů.&lt;br /&gt;
* někter=é distribuované systémy&lt;br /&gt;
&lt;br /&gt;
Mechanismus ACL se používá častěji.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Syst%C3%A9my_soubor%C5%AF</id>
		<title>Systémy souborů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Syst%C3%A9my_soubor%C5%AF"/>
				<updated>2014-02-20T06:49:01Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Téměř všechny aplikace potřebují trvale uchovávat data&lt;br /&gt;
&lt;br /&gt;
Hlavní požadavky:&lt;br /&gt;
* Možnost uložit velké množství dat&lt;br /&gt;
* informace musí zůstat zachována i po ukončení procesu&lt;br /&gt;
* data musejí být přístupná více procesům&lt;br /&gt;
&lt;br /&gt;
při přístupu k zařízení mají všechny procesy společné problémy&lt;br /&gt;
* alokace prostoru na disku&lt;br /&gt;
* pojmenování dat&lt;br /&gt;
* ochrana dat před neoprávněným přístupem&lt;br /&gt;
* zotavení po havárii&lt;br /&gt;
&lt;br /&gt;
souborový systém:&lt;br /&gt;
* konvence pro ukládání a přístup k souborům&lt;br /&gt;
* část OS, která poskytuje mechanismus pro ukládání a přístup k datům&lt;br /&gt;
&lt;br /&gt;
uživatelské rozhraní:&lt;br /&gt;
* konvence pro pojmenování souborů&lt;br /&gt;
* typy souborů&lt;br /&gt;
* způsob přístupu&lt;br /&gt;
* atributy a přístupová práva&lt;br /&gt;
* služby OS pro práci se soubory&lt;br /&gt;
&lt;br /&gt;
Windows: NTFS, FAT12, FAT16, FAT32, ISO 9660 (CD-ROM)&lt;br /&gt;
&lt;br /&gt;
Linux: ext2, ext3, ReiserFS, JFS, XFS, FAT12 až 32, ISO 9660, Minix, VxFS, OS/2 HPFS, SysV fs, UFS, NTFS read-only&lt;br /&gt;
&lt;br /&gt;
* soubor – pojmenovaná množina záznamů, které lze zpracovávat jako celek&lt;br /&gt;
* záznam – strukturovaný datový objekt tvořený konečným počtem pojmenovaných položek&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
atributy - informace sdružené se souborem, liší se podle jednotlivých OS / FS&lt;br /&gt;
* příznaky (hidden, archive, temporary, read-only...)&lt;br /&gt;
* velikost, datum vytvoření, poslední modifikace...&lt;br /&gt;
&lt;br /&gt;
Veškeré I/O jsou dnes (díky UNIXu) prováděny jako práce se soubory - interní struktura souboru OS nezajímá, adresář je také soubor&lt;br /&gt;
&lt;br /&gt;
Základní operace pro práci se soubory&lt;br /&gt;
* otevření&lt;br /&gt;
* vytvoření&lt;br /&gt;
* čtení&lt;br /&gt;
* zápis&lt;br /&gt;
* nastavení pozice v souboru&lt;br /&gt;
* zavření souboru&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Virtuální FS ==&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Fs.png]]&lt;br /&gt;
&lt;br /&gt;
Kód společný pro všechny typy FS, volán aplikacemi, udržuje informaci o otevřeném souboru, ověřuje přístupová práva.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typy FS&lt;br /&gt;
* kontunuální alokace (jen u read-only médií - např CD)&lt;br /&gt;
* seznam diskových bloků (blok obsahuje data a odkaz na další blok)&lt;br /&gt;
* FAT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FAT ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Implementace:&lt;br /&gt;
* Každému bloku odpovídá jedna položka v tabulce FAT&lt;br /&gt;
* Položka FAT obsahuje číslo dalšího bloku souboru&lt;br /&gt;
* Řetězec odkazů je ukončen speciální značkou, která není platným číslem bloku (-1)&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Fat.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nevýhodou FAT je velikost tabulky (80 GB disk, bloky 4 kB =&amp;gt; 20 mil položek, každá položka alespoň 3 byty =&amp;gt; 60 MB FAT)&lt;br /&gt;
&lt;br /&gt;
* FAT 12 - 12 bitů, 2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt; = 4096 bloků, diskety&lt;br /&gt;
* FAT 16 - 16 bitů, 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt; = 65536 bloků&lt;br /&gt;
* FAT 32 - 2&amp;lt;sup&amp;gt;28&amp;lt;/sup&amp;gt; bloků, blok 4-32KB, cca 8TB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== I-uzly ==&lt;br /&gt;
&lt;br /&gt;
S každým souborem sdružená datová struktura i-uzel. I-uzel obsahuje atributy souboru, diskové adresy prvních N bloků a jeden nebo více odkazů na diskové bloky obsahující další diskové adresy. Tradiční FS pro Linux a UNIX&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:I-uzly.jpg]]&lt;br /&gt;
&lt;br /&gt;
Výhoda: Po otevření souboru můžeme zavést i-uzel a případný blok obsahující další adresy do paměti =&amp;gt; urychlý přístup k souboru&lt;br /&gt;
&lt;br /&gt;
Implementace adresářů: tabulka obsahující jméno souboru a číslo jeho i-uzlu.&lt;br /&gt;
&lt;br /&gt;
Info o volných blocích = seznam, jeho začátek je v superbloku na začátku partition&lt;br /&gt;
&lt;br /&gt;
Adresáře - většinou se jedná o speciální typ souboru&lt;br /&gt;
&lt;br /&gt;
Info o volných blocích v paměti - bitová mapa&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Ovl%C3%A1d%C3%A1n%C3%AD_perifern%C3%ADch_za%C5%99%C3%ADzen%C3%AD,_RAID</id>
		<title>Ovládání periferních zařízení, RAID</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Ovl%C3%A1d%C3%A1n%C3%AD_perifern%C3%ADch_za%C5%99%C3%ADzen%C3%AD,_RAID"/>
				<updated>2014-02-20T06:48:53Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Principy I/O software:&lt;br /&gt;
# obsluha přerušení (nejnižší úroveň v OS)&lt;br /&gt;
# ovladač zařízení&lt;br /&gt;
# SW vrstva OS nezávislá na zařízení&lt;br /&gt;
# uživatelský I/O SW&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Obsluha-io.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Obsluha přerušení ==&lt;br /&gt;
&lt;br /&gt;
* Řadič vyvolá přerušení ve chvíli dokončení I/O požadavku&lt;br /&gt;
* Ovladač zadá I/O požadavek, usne, po příchodu přerušení ho obsluha vzbudí&lt;br /&gt;
* Obsluha přerušení je časově kritická, musí být co nejkratší&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ovladače zařízení ==&lt;br /&gt;
&lt;br /&gt;
* Ovladače obsahují veškerý kód závislý na I/O zařízení, jediný zná HW podrobnosti&lt;br /&gt;
* Ovladači předán příkaz vyšší vrstvou; pokud ještě obsluhuje předchozí požadavek, zařadí nový požadavek do fronty; zadá příkazy řadiči; zablokuje se do vykonání požadavku; po dokončení zkontroluje, zda nenastala chyba; předá výsledek vyšší vrstvě; spustí další požadavek&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SW vrstva OS nezávislá na zařízení ==&lt;br /&gt;
&lt;br /&gt;
* Poskytuje I/O funkce společně pro všechna zařízení daného druhu&lt;br /&gt;
* Definuje rozhraní s ovladači&lt;br /&gt;
* Poskytuje jednotné rozhraní uživatelskému SW&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== I/O SW v uživatelském režimu ==&lt;br /&gt;
&lt;br /&gt;
* Programátor používá v programech I/O funkce nebo příkazy jazyka&lt;br /&gt;
* Spooling = způsob obsluhy vyhrazených I/O v multiprogramovém systému (požadavky se zařadí do fronty a počkají až na ně přijde řada)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Funkce ovladače zařízení ==&lt;br /&gt;
&lt;br /&gt;
* ovladači předán příkaz vyšší vrstvou&lt;br /&gt;
* požadavek zařazen do fronty (může ještě obsluhovat předchozí)&lt;br /&gt;
* ovladač zadá příkazy řadiči (přijde na řadu), např. nastavení hlavy, přečtení sektoru&lt;br /&gt;
* zablokuje se do vykonání požadavku (neblokuje při rychlých operacích, např. zápis do registru)&lt;br /&gt;
* vzbuzení obsluhou přerušení (dokončení operace) - zkontroluje, zda nenastala chyba&lt;br /&gt;
* pokud OK, předá výsledek (status + data) vyšší vrstvě&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RAID 0 ==&lt;br /&gt;
&lt;br /&gt;
* není redundantní&lt;br /&gt;
* ztrata 1 disku = ztrata celeho pole&lt;br /&gt;
* duvod pouziti - vykon napr. strih videa&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RAID 1 mirroring ==&lt;br /&gt;
&lt;br /&gt;
* zrcadleni na 2 disky stejnych kapacit&lt;br /&gt;
* totozne informace&lt;br /&gt;
* vypadek 1 disku - nevadi&lt;br /&gt;
* jednoducha implementace - casto ciste sw&lt;br /&gt;
* nevyhoda - vyuzijeme jen polovinu kapacity zapis - pomalejsi (2x) cteni - rychlejsi (radic - lze stridat pozadavky mezi disky)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RAID 5 ==&lt;br /&gt;
&lt;br /&gt;
* redundantni pole s distribuovanou paritou&lt;br /&gt;
* minimialne 3 disky&lt;br /&gt;
* rezie: 1 disk z pole n disku, pr. 5 disku 100GB, 400GB pro data&lt;br /&gt;
* vypadek 1 disku nevadi cteni - vykon ok zapis - pomalejsi 1 zapis - cteni starych dat, cteni stare parity, vypocet nove parity, zapis novych dat, zapis nove parity&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RAID 6 ==&lt;br /&gt;
&lt;br /&gt;
* RAID 5 + navic dalsi paritni disk&lt;br /&gt;
* odolne proti vypadku dvou disku&lt;br /&gt;
* rekonstrukce pole pri vypadku - trva dlouho po dobu rekonstrukce neni pole chraneno proti vypadku dalsiho disku, narocna cinnost - muze se objevit dalsi chyba, radic disk odpoji a ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RAID 10 ==&lt;br /&gt;
&lt;br /&gt;
* kombinace RAID 0 (stripe) a RAID 1 (zrcadlo)&lt;br /&gt;
* min. pocet disku 4 rezie 100% diskove kapacity navic&lt;br /&gt;
* nejvyssi vykon v bezpecnych typech polich podstatne rychlejsi nez RAID 5, pri zapisu odolnost proti ztrate az 50% disku x RAID 5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hot spare ==&lt;br /&gt;
Disk který se aktivuje až při výpadku. Nahradí poškozený disk a pole je opět funkční (hot spare disk pak pouze vyměníme za nový)&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Algoritmy_nahrazov%C3%A1n%C3%AD_str%C3%A1nek_pam%C4%9Bti</id>
		<title>Algoritmy nahrazování stránek paměti</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Algoritmy_nahrazov%C3%A1n%C3%AD_str%C3%A1nek_pam%C4%9Bti"/>
				<updated>2014-02-20T06:48:45Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relokace při zavedení do paměti ==&lt;br /&gt;
&lt;br /&gt;
Program volá instrukci na adrese 66 ale sám v paměti běží až od adresy 1000. Tedy instrukce se nechází na adrese 1066. - Při zavedení programu do paměti provede Linker modifikaci, aby adresy souhlasily&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mechanismus báze a limitu (Dynamická relokace) ==&lt;br /&gt;
&lt;br /&gt;
Jednotka správy paměti (MMU) mezi procesorem a pamětí obsahuje dva registry:&lt;br /&gt;
* báze - počáteční adresa oblasti&lt;br /&gt;
* limit - velikost oblasti&lt;br /&gt;
&lt;br /&gt;
Dostává adresu od CPU a pževádí ji na adresu v paměti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pojmy ==&lt;br /&gt;
* virtuální paměť - stránky (pages) stejné délky&lt;br /&gt;
* fyzická paměť - rámce (stejné délky)&lt;br /&gt;
* rámec může obsahovat právě jednu stránku&lt;br /&gt;
* na známém místě v paměti tabulka stránek, poskytuje mapování virtuálních stránek na rámce&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Výpadek stránky ==&lt;br /&gt;
* Pokud všechny rámce obsazené a nastane výpadek stránky, je nutné některou stránku vyhodit a rámec uvolnit (dojde k přerušení, zavede se požadovaná stránka, program může pokračovat v běhu)&lt;br /&gt;
* Vyhození&lt;br /&gt;
** Pokud byla stránka modifikována, zapíše se na disk&lt;br /&gt;
** Pokud oproti kopii na disku nebyla modifikovaná, bude pouze uvolněna&lt;br /&gt;
* Otázka - kterou stránku vyhodit?&lt;br /&gt;
&lt;br /&gt;
Tabulka stránek procesu - v MMU, obsahuje stránky daného procesu, mapuje číslo stránky na fyzickou adresu rámce, řeší realokaci a ochranu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus FIFO ==&lt;br /&gt;
&lt;br /&gt;
* Udržujeme seznam všech stránek v pořadí, ve kterém byly zavedeny&lt;br /&gt;
* Vyhazujeme nejstarší stránku (je možné, že se vyhodí stránka, která se bude brzy potřebovat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus MIN/OPT ==&lt;br /&gt;
&lt;br /&gt;
* V paměti je množina stránek, každá stránka je označena počtem instrukcí, po který se k ní nebude přistupovat&lt;br /&gt;
* V okamžiku výpadku stránky se vybere stránka s nejvyšším označením&lt;br /&gt;
* Algoritmus je optimální, tj. vybere se stránka, která bude zapotřebí nejvzdáleněji v budoucnosti&lt;br /&gt;
* Není realizovatelný (neexistuje způsob, jakým by OS mohl zjistit, která stránka bude zapotřebí jako příští)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus Least Recently Used ==&lt;br /&gt;
&lt;br /&gt;
nejdele nepouzita (pohled do minulosti)&lt;br /&gt;
&lt;br /&gt;
* princip lokality&lt;br /&gt;
** stranky pouzivane v poslednich instrukcich se budou pravdepodobne pouzivat i v nasledujicich&lt;br /&gt;
** pokud se stranka dlouho nepouzivala, pravdepodobne nebude brzy zapotrebi&lt;br /&gt;
&lt;br /&gt;
Vyhazovat zbozi, na kterem je v prodejne nejvice prachu = nejdele nebylo pozadovano&lt;br /&gt;
&lt;br /&gt;
* Obtizna implementace&lt;br /&gt;
* sw reseni (neni pouzitelne)&lt;br /&gt;
** seznam stranek v poradi referenci&lt;br /&gt;
** vypadek - vyhozeni stranky ze zacatku seznamu&lt;br /&gt;
** zpomaleni cca 10x, nutna podpora hw&lt;br /&gt;
* hw reseni - citac&lt;br /&gt;
** MMU obsahuje citac (64bit), pri kazdem pristupu do pameti zvetsen&lt;br /&gt;
** kazda polozka v tabulce stranek - pole pro ulozeni citace&lt;br /&gt;
** odkaz do pameti&lt;br /&gt;
** obsah citace se zapise do polozky pro odkazovanou stranku&lt;br /&gt;
** vypadek stranky - vyhodí se stranka s nejnizsim cislem&lt;br /&gt;
&lt;br /&gt;
Realizece čítače pomocí matice&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus Not-Recently-Used ==&lt;br /&gt;
&lt;br /&gt;
* Bit R - nastaven na 1 při čtení nebo zápisu do stránky&lt;br /&gt;
* Bit M - nastaven na 1 při zápisu do stránky; označuje, že se stránka má při vyhození zapsat na disk&lt;br /&gt;
&lt;br /&gt;
Na začátku mají všechny stránky R=0, M=0, bit R je OS nastavován periodicky na 0&lt;br /&gt;
&lt;br /&gt;
4 kategorie:&lt;br /&gt;
* Třída 0: R=0, M=0&lt;br /&gt;
* Třída 1: R=0, M=1&lt;br /&gt;
* Třída 2: R=1, M=0&lt;br /&gt;
* Třída 3: R=1, M=1&lt;br /&gt;
&lt;br /&gt;
Algoritmus vyhodí stránku z nejnižší neprázdné třídy, výběr mezi stránkami ve stejné třídě je náhodný&lt;br /&gt;
Jednoduchý, efektivně implementovatelný, ale nevýkonný&lt;br /&gt;
&lt;br /&gt;
(R = referenced)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus Second Chance ==&lt;br /&gt;
&lt;br /&gt;
* Vychází z algoritmu FIFO&lt;br /&gt;
* Vyhledává nejstarší stránku, která nebyla referencována v poslední době&lt;br /&gt;
* Pokud byly všechny referencovány =&amp;gt; FIFO&lt;br /&gt;
&lt;br /&gt;
Snaží se zabranit vyhozeni casto pouzivane - dle bitu R nejstarsi stranky R = 0 ... stranka je nejstarsi, nepouzivana, vyhodime. Pokud R = 1 ... nastavme&lt;br /&gt;
R=0, presuneme na konec seznamu stranek (jako by byla nove zavedena) a vezmeme další v pořadí.&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Second-chance.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus  Clock ==&lt;br /&gt;
&lt;br /&gt;
Optimalizace datovych struktur algoritmu Second Chance&lt;br /&gt;
* Stranky udrzovany v kruhovem seznamu&lt;br /&gt;
* Ukazatel na nejstarsi stranku { &amp;quot;rucicka hodin\&lt;br /&gt;
* Vypadek stranky { najit stranku k vyhozeni&lt;br /&gt;
* Stranka kam ukazuje rucicka&lt;br /&gt;
** ma-li R=0, stranku vyhodime a rucicku posuneme o jednu pozici&lt;br /&gt;
** ma-li R=1, nastavime R na 0, rucicku posuneme o 1 pozici, opakovani,..&lt;br /&gt;
* Od SC se lisi pouze implementaci&lt;br /&gt;
* Varianty Clock pouzivaji napr. BSD UNIX&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus Aging ==&lt;br /&gt;
&lt;br /&gt;
* Každá položka má pole „stáří“, na počátku = 0&lt;br /&gt;
* Při každém přerušení časovače - posun pole „stáří“ o 1 bit vpravo, zleva se přidá hodnota bitu R, nastavení R na 0 &lt;br /&gt;
* Při výpadku stránky se vyhodí stránka, jejíž pole „stáří“ má nejnižší hodnotu&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Spr%C3%A1va_hlavn%C3%AD_pam%C4%9Bti,_metody_p%C5%99id%C4%9Blov%C3%A1n%C3%AD_pam%C4%9Bti,_virtu%C3%A1ln%C3%AD_pam%C4%9B%C5%A5</id>
		<title>Správa hlavní paměti, metody přidělování paměti, virtuální paměť</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Spr%C3%A1va_hlavn%C3%AD_pam%C4%9Bti,_metody_p%C5%99id%C4%9Blov%C3%A1n%C3%AD_pam%C4%9Bti,_virtu%C3%A1ln%C3%AD_pam%C4%9B%C5%A5"/>
				<updated>2014-02-20T06:48:36Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ideál programátora&lt;br /&gt;
* Pameť nekonecně velká, rychlá, levná&lt;br /&gt;
* Zároveň persistentní (uchovává obsah po vypnutí)&lt;br /&gt;
* Bohužel neexistuje&lt;br /&gt;
&lt;br /&gt;
Reálný počítač - hierarchie paměti (&amp;quot;pyramida&amp;quot;)&lt;br /&gt;
# Registry CPU&lt;br /&gt;
# Malé množství rychlé cache paměti&lt;br /&gt;
# Stovky MB až gigabajty RAM paměti&lt;br /&gt;
# GB na pomalých, levných, persistentních discích          &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modul pro spravu pameti&lt;br /&gt;
* informace o prideleni pameti&lt;br /&gt;
* ktera cast je volna pridelena (a kteremu procesu)&lt;br /&gt;
* pridelovani pameti na zadost&lt;br /&gt;
* uvolneni pameti, zarazeni k volne pameti&lt;br /&gt;
* odebira pamet' procesum&lt;br /&gt;
* ochrana pameti&lt;br /&gt;
** pristup k pameti jineho procesu&lt;br /&gt;
** pristup k pameti OS&lt;br /&gt;
&lt;br /&gt;
Funkce MMU (memory managment unit)&lt;br /&gt;
* Dostava adresu od CPU, prevadi na adresu do fyzicke pameti&lt;br /&gt;
* Nejprve zkontroluje, zda adresa neni vetsi nez limit Ano - vyjimka, Ne - k adrese pricte bazi&lt;br /&gt;
* Pokud baze 1000, limit 60&lt;br /&gt;
** Adresa 55 - ok, vysledek 1055&lt;br /&gt;
** Adresa 66 - není ok, vyjimka&lt;br /&gt;
&lt;br /&gt;
Tri varianty rozdeleni pameti&lt;br /&gt;
* OS ve spodni casti adresniho prostoru v RAM (minipocitace)&lt;br /&gt;
* OS v horni casti adresniho prostoru v ROM (zapouzdrene 2. systemy)&lt;br /&gt;
* OS v RAM, ovladace v ROM (PC { MS DOS v RAM, BIOS v 3. ROM)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Část OS, která spravuje paměť, se nazývá správce paměti&lt;br /&gt;
* Udržuje informaci, které části paměti se používají a které jsou volné&lt;br /&gt;
* Alokuje paměť procesům podle potřeby&lt;br /&gt;
* Zařazuje paměť do volné paměti po uvolnění procesem&lt;br /&gt;
&lt;br /&gt;
* Jednoprogramové systémy bez odkládání a stránkování&lt;br /&gt;
** Nejjednodušší - spouštíme pouze jeden program v jednom čase&lt;br /&gt;
** Dovoluje procesu použít veškerou paměť, kterou nepotřebuje OS&lt;br /&gt;
** Po skončení procesu je možné spustit další proces&lt;br /&gt;
* Multiprogramování s pevným přidělením paměti&lt;br /&gt;
* Nejjednodušší schéma = rozdělit paměť na n oblastí (mohou být i různé velikosti)&lt;br /&gt;
** V historických systémech se provádělo ručně při startu zdroje&lt;br /&gt;
** Po načtení úlohy je obvykle část oblasti nevyužitá&lt;br /&gt;
** Snaha umístit úlohu do nejmenší oblasti, do které se vejde&lt;br /&gt;
* Multiprogramování s proměnnou velikostí oblasti&lt;br /&gt;
* Každé úloze je přidělena paměť podle požadavku&lt;br /&gt;
* Obsazení paměti se postupně mění, jak úlohy přicházejí a končí&lt;br /&gt;
* Zlepšuje využití paměti&lt;br /&gt;
* Postupem času může vzniknout mnoho malých volných oblastí&lt;br /&gt;
* OS musí vědět, která paměť je volná a která alokovaná&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nejpoužívanější způsoby správy paměti ==&lt;br /&gt;
níže&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Správa paměti pomocí bitových map ==&lt;br /&gt;
&lt;br /&gt;
* Paměť rozdělena do alokačních jednotek stejné délky&lt;br /&gt;
* S každou alokační jednotkou sdružen jeden bit (0 = volno, 1 = obsazeno), tyto bity jsou pohromadě v bitové mapě&lt;br /&gt;
** menší alokační jednotky = větší bitmapa&lt;br /&gt;
** Větší alokační jednotky = více nevyužité paměti, protože velikost procesu nebude přesně násobek alokační jednotky&lt;br /&gt;
* Výhoda - konstantní velikost bitmapy&lt;br /&gt;
* Nevýhoda - pokud požadujeme úsek paměti velikosti N alokačních jednotek, musí se v bitmapě vyhledat N po sobě následujících nulových bitů (drahá operace)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Správa paměti pomocí seznamů ==&lt;br /&gt;
&lt;br /&gt;
* Myšlenka udržovat seznam alokovaných a volných oblastí&lt;br /&gt;
* Každá položka seznamu obsahuje:&lt;br /&gt;
** Informaci, zda se jedná o proces nebo díru (P nebo H)&lt;br /&gt;
** Počáteční adresu oblasti&lt;br /&gt;
** Délku oblasti&lt;br /&gt;
&lt;br /&gt;
* Práce se seznamem:&lt;br /&gt;
** Pokud proces skončí, nahradí se dírou&lt;br /&gt;
** Pokud jsou vedle sebe dvě díry, sloučí se&lt;br /&gt;
* Seznam je dobré mít seřazený podle počáteční adresy oblasti&lt;br /&gt;
* zároveň je seznam obousměrný, takže se snadno vrací&lt;br /&gt;
&lt;br /&gt;
Možnosti alokace:&lt;br /&gt;
* Algoritmus first fit&lt;br /&gt;
** Prohledávání seznamu, dokud se nenajde dostatečně velká díra&lt;br /&gt;
** Rychlý&lt;br /&gt;
** díra se rozdělí na proces a zbytek díry&lt;br /&gt;
&lt;br /&gt;
* Algoritmus next fit&lt;br /&gt;
** Prohledávání začne tam, kde skončilo předchozí&lt;br /&gt;
** o trochu pomalejší než first-fit&lt;br /&gt;
&lt;br /&gt;
* Algoritmus best fit&lt;br /&gt;
** Prohledá celý seznam, vezme nejmenší díru, do které se proces vejde&lt;br /&gt;
** Pomalejší, protože prohledává celý seznam&lt;br /&gt;
** zase ale najde nejlepší místo (byť na druhou stranu pak zbyte spousta malých nepoužitelných děr)&lt;br /&gt;
&lt;br /&gt;
Možná vylepšení&lt;br /&gt;
* oddělěné seznamy děr a perocesů (rychlejší alokace, pomalejší dealokace&lt;br /&gt;
* seznam děr seřazený podle velikosti (rychlé best fit, opět náročná dealokace)&lt;br /&gt;
* místo samostatného seznamu děr lze využít samotné díry, které na sebe odkazují - úspora paměti&lt;br /&gt;
&lt;br /&gt;
== Mechanismus „buddy system“ ==&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Buddy-system.jpg]]&lt;br /&gt;
&lt;br /&gt;
* Mějme seznamy volných bloků velikosti 1,2,4,8,16 … alokačních jednotek až do seznamu bloků velikosti celé paměti&lt;br /&gt;
* Na začátku veškerá paměť volná, všechny seznamy jsou prázdné kromě seznamu obsahující 1 položku velikosti paměti&lt;br /&gt;
* Přijde-li požadavek, zaokrouhlí se nahoru na mocninu 2&lt;br /&gt;
* Blok se rozdělí na 2 bloky, pokud ještě moc velké, jeden z nich se zase rozdělí na 2 bloky atd.&lt;br /&gt;
* Uvolnění paměti: pokud jsou volné oba sousední bloky stejné velikosti, spojí se do jednoho&lt;br /&gt;
* Neefektivní ve využití paměti, ale rychlý&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Příklady použití:&lt;br /&gt;
* Buddy system - jádro Linuxu, běží ve fyzické paměti&lt;br /&gt;
* First fit, Next fit - malloc v C&lt;br /&gt;
* Bitová mapa - SWAP v Linuxu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Virtuální paměť ==&lt;br /&gt;
&lt;br /&gt;
* Problém, že programy jsou větší než dostupná fyzická paměť&lt;br /&gt;
* Chceme, aby ve skutečné paměti byla realizovaná pouze část adresového prostoru, zbytek může být odložen na disku&lt;br /&gt;
* Procesor používá tzv. virtuální adresy&lt;br /&gt;
* Pokud je požadovaná část virtuálního paměťového prostoru ve fyzické paměti, MMU převede virtuální adresu na fyzickou&lt;br /&gt;
* Pokud není ve fyzické paměti, OS jí musí přečíst z disku&lt;br /&gt;
* Většina systémů virtuální paměti používá techniku nazývanou stránkování&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Pl%C3%A1nov%C3%A1n%C3%AD_proces%C5%AF_v_interaktivn%C3%ADch_syst%C3%A9mech</id>
		<title>Plánování procesů v interaktivních systémech</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Pl%C3%A1nov%C3%A1n%C3%AD_proces%C5%AF_v_interaktivn%C3%ADch_syst%C3%A9mech"/>
				<updated>2014-02-20T06:48:24Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Základní stavy procesu&lt;br /&gt;
* běžící&lt;br /&gt;
* připravený - čeká na CPU&lt;br /&gt;
* blokovaný - čeká na zdroj nebo zprávu&lt;br /&gt;
* novy (new) - proces byl právě vytvořen&lt;br /&gt;
* ukončený (terminated) - proces byl ukončen&lt;br /&gt;
&lt;br /&gt;
Správce procesů - udržuje tabulku procesů. Záznam o konkretním procesu - PCB (Process Control Block) - souhrn dat potrebnych k řízení procesu.&lt;br /&gt;
&lt;br /&gt;
Plánovač vs. dispatcher&lt;br /&gt;
&lt;br /&gt;
* dispatcher předává řízení procesu vybranému short time planovacem&lt;br /&gt;
** prepnuti kontextu&lt;br /&gt;
** prepnuti do user modu&lt;br /&gt;
** skok na vhodnou instrukci daneho programu&lt;br /&gt;
* vice pripravenych procesu k behu { planovac vybere, ktery spusti jako prvni&lt;br /&gt;
* planovac procesu (scheduler) - pouziva planovaci algoritmus (scheduling algorithm)&lt;br /&gt;
* Preemptivni vs. non-preemptive planovani&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plánování v interaktivních systémech ==&lt;br /&gt;
- preemptivní&lt;br /&gt;
&lt;br /&gt;
* Základní problém - každý proces je jedinečný a nepredikovatelný, nedá se říci, jak dlouho poběží, než se zablokuje&lt;br /&gt;
* Aby proces neběžel příliš dlouho, má počítač vestavěné hodiny, které provádějí pravidelné přerušení&lt;br /&gt;
* Při přerušení se vyvolá obslužný podprogram přerušení v jádře&lt;br /&gt;
* OS rozhodne, zda dovolí procesu pokračovat nebo zda dá CPU jinému procesu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus cyklické obsluhy (Round RObin) ==&lt;br /&gt;
&lt;br /&gt;
* Každému procesu je přiřazen časový interval = časové kvantum, po které může běžet&lt;br /&gt;
* Pokud běží ještě na konci kvanta, je provedena preempce a je naplánován a spuštěn další připravený proces&lt;br /&gt;
* Pokud proces skončil, nebo se zablokoval ještě před spotřebováním časového kvanta, je také naplánován a spuštěn další připravený proces&lt;br /&gt;
* Délka časového kvanta:&lt;br /&gt;
** Krátké: vysoká režie&lt;br /&gt;
** Dlouhé: vyšší efektivita, může zhoršovat dobu odpovědi&lt;br /&gt;
* znevýhodnění I/O vázaných úloh, protože zpravidla využijí pouze malou část kvanta a zablokují se (výpočetně vázané úlohy jsou zvýhodněné)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prioritní plánování ==&lt;br /&gt;
&lt;br /&gt;
* Interaktivní procesy mohou mít vyšší prioritu než procesy běžící na pozadí&lt;br /&gt;
** Staticky - např. při startu procesu&lt;br /&gt;
** Dynamicky - např. pokud mají I/O procesy vyšší prioritu, budou se moci po krátkém použití CPU opět zablokovat. S délkou běhu klesá dynamická priorita&lt;br /&gt;
* celková priorita = statická + dynamická&lt;br /&gt;
* rozdělení procesů do priotitních tříd, v nich je využíváno round robin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plánovač spravedlivého sdílení ==&lt;br /&gt;
&lt;br /&gt;
* Přidělovat čas každému uživateli proporciálně bez ohledu na to, kolik má procesů&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plánování pomocí loterie ==&lt;br /&gt;
&lt;br /&gt;
* Procesy obdrží tikety (losy)&lt;br /&gt;
* Plánovač vybere náhodně jeden tiket&lt;br /&gt;
* Vítězný proces obdrží cenu - 1 kvantum času na CPU&lt;br /&gt;
* Důležitější procesy mohou obdržet více tiketů, aby se zvýšila jejich šance na výhru&lt;br /&gt;
* Spolupracující procesy si mohou předávat losy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plánování vláken ==&lt;br /&gt;
Buď jsou vlákna plánována v OS nebo ve vlastním procesu (obvykle pomocí RR)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Pl%C3%A1nov%C3%A1n%C3%AD_%C3%BAloh_a_proces%C5%AF_v_d%C3%A1vkov%C3%BDch_syst%C3%A9mech</id>
		<title>Plánování úloh a procesů v dávkových systémech</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Pl%C3%A1nov%C3%A1n%C3%AD_%C3%BAloh_a_proces%C5%AF_v_d%C3%A1vkov%C3%BDch_syst%C3%A9mech"/>
				<updated>2014-02-20T06:48:17Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Non-preemtivní plánování: proces si podrží kontrolu nad CPU dokud se jí nevzdá&lt;br /&gt;
* Preemtivní - proces lze přerušit během CPU burstu a naplánovat jiný&lt;br /&gt;
&lt;br /&gt;
Bere se ohled na:&lt;br /&gt;
* průchodnost (počet úloh dokončených za časovou jednotku)&lt;br /&gt;
* průměrnou dobu obrátky (průměrná doba od zadání úlohy do systému do dokončení úlohy)&lt;br /&gt;
* využití CPU&lt;br /&gt;
&lt;br /&gt;
== First-Come First-Served (FCFS) ==&lt;br /&gt;
&lt;br /&gt;
* Někdy používán název FIFO&lt;br /&gt;
* Zpracování podle času příchodu úlohy, „kdo dřív přijde, ten dřív mele“&lt;br /&gt;
* Nepreemptivní FCFS je nejjednodušší plánovací algoritmus (úloha běží dokud neskončí)&lt;br /&gt;
* Je spravedlivý&lt;br /&gt;
* Během I/O operací se CPU nevyužívá, ale přesto je blokováno stávajícím procesem&lt;br /&gt;
&lt;br /&gt;
== Shortest Job First (SJF) ==&lt;br /&gt;
&lt;br /&gt;
* Předpoklad, že je předem známá doba vykonávání úlohy&lt;br /&gt;
* Nepreemptivní, jedna fronta příchozích úloh, plánovač vybere vždy úlohu s nejkratší dobou běhu&lt;br /&gt;
* Nevýhodou je, že na dlouho trvající úlohy se nemusí vůbec dostat&lt;br /&gt;
&lt;br /&gt;
== Shortest Remaining Time (SRT) ==&lt;br /&gt;
&lt;br /&gt;
* Preemptivní varianta SJF&lt;br /&gt;
* Plánovač vždy vybere úlohu, jejíž zbývající doba běhu je nejkratší&lt;br /&gt;
* Např. právě prováděné úloze to bude trvat 10 min., do systému přijde úloha trvající 1 minutu - systém prováděnou úlohu pozastaví a nechá běžet novou úlohu&lt;br /&gt;
* Problém: možnost vyhladovění úloh&lt;br /&gt;
&lt;br /&gt;
== Multilevel Feedback ==&lt;br /&gt;
&lt;br /&gt;
* N rozdílných prioritních úrovní, každá úroveň má svou frontu úloh&lt;br /&gt;
* Úloha vstoupí do systému s nejvyšší prioritou&lt;br /&gt;
* Na každé prioritní úrovni je stanoveno maximu času CPU, které může úloha na této úrovni obdržet&lt;br /&gt;
** Pokud úloha překročí limit, její priorita se sníží&lt;br /&gt;
** Na nejnižší úrovni může proces běžet neustále nebo může být překročení považováno za chybu&lt;br /&gt;
* Procesor obsluhuje nejvyšší neprázdnou frontu&lt;br /&gt;
* Výhoda: rozlišuje mezi I/O a CPU úlohami (upřednostňuje I/O)&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Klasick%C3%A9_probl%C3%A9my_meziprocesov%C3%A9_komunikace_%E2%80%93_producent-konzument_aj.</id>
		<title>Klasické problémy meziprocesové komunikace – producent-konzument aj.</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Klasick%C3%A9_probl%C3%A9my_meziprocesov%C3%A9_komunikace_%E2%80%93_producent-konzument_aj."/>
				<updated>2014-02-20T06:48:10Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Meziprocesova komunikace: // tady by to chtělo rozvést a doplnit...&lt;br /&gt;
* Predavani zprav&lt;br /&gt;
* Primitiva send, receive&lt;br /&gt;
* Mailbox, port&lt;br /&gt;
* RPC&lt;br /&gt;
* Ekvivalence semaforu, zprav, ...&lt;br /&gt;
* Bariera, problem vecericich filozofu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem sdilene pameti&lt;br /&gt;
*umisteni objektu ve sdilene pameti&lt;br /&gt;
* Bezpecnost - globalni data pristupna kteremukoliv procesu bez ohledu na semafor&lt;br /&gt;
* Procesy bezi na ruznych strojich, komunikuji spolu po siti Reseni - predavani zprav&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predavani zprav ==&lt;br /&gt;
 &lt;br /&gt;
* send, receive&lt;br /&gt;
* Zavedeme 2 primitiva&lt;br /&gt;
** send (adresat, zprava) - odeslani zpravy&lt;br /&gt;
** receive (odesilatel, zprava) - prijem zpravy&lt;br /&gt;
** Send - Zprava (lib. datovy objekt) bude zaslana adresatovi&lt;br /&gt;
** Receive - Prijem zpravy od urceneho odesilatele Prijata zprava se ulozi do promenne &amp;quot;zprava&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Synchronizace - blokující (synchronní) (recieve) / neblokující (asynchronní) (send)&lt;br /&gt;
&lt;br /&gt;
* blokující send&lt;br /&gt;
** čeká na převzetí správy příjemcem&lt;br /&gt;
* neblokující send&lt;br /&gt;
** vrací se ihned po odeslání zprávy&lt;br /&gt;
** většina systémů&lt;br /&gt;
* blokující receive&lt;br /&gt;
** není-li ve frontě žádná zpráva, zablokuje se&lt;br /&gt;
** většina systémů&lt;br /&gt;
* neblokující receive&lt;br /&gt;
** není-li zpráva, vrací chybu&lt;br /&gt;
&lt;br /&gt;
problémy, které nejsou u semaforů ani monitorů, zvláště při komunikaci po síti&lt;br /&gt;
* ztráta zprávy (potvrzení o přijetí (acknowledgement))&lt;br /&gt;
* ztráta potvrzení (číslování zpráv, duplicitní zprávy se ignorují)&lt;br /&gt;
* problém autentizace (zprávy je možné šifrovat)&lt;br /&gt;
&lt;br /&gt;
lokální komunikace&lt;br /&gt;
* rendezvous - eliminuje frontu zpráv, send zavolán dříve než receive – odesílatel zablokován, vyvolán send i receive – zprávu zkopírovat z odesílatele přímo do příjemce&lt;br /&gt;
* využití mechanismu virtuální paměti paměť obsahující zprávu je přemapována z procesu odesílatele do procesu příjemce&lt;br /&gt;
&lt;br /&gt;
typické aplikace typu klient - server &lt;br /&gt;
* WWW klient x WWW server (Apache, IIS)&lt;br /&gt;
* účetní aplikace x databázový systém (Oracle, MySQL)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Volání vzdálených procedur (RPC - Remote Procedure Call) ==&lt;br /&gt;
&lt;br /&gt;
# Klient zavolá spojku klienta, reprezentující vzdálenou proceduru&lt;br /&gt;
# Spojková procedura argumenty zabalí do zprávy, pošle ji serveru&lt;br /&gt;
# Spojka serveru zprávu přijme, vezme argumenty a zavolá proceduru&lt;br /&gt;
# Procedura se vrátí, návrat. hodnotu pošle spojka serveru zpět klientovi&lt;br /&gt;
# Spojka klienta přijme zprávu obsahující návrat. hodnotu a předá ji volajícímu&lt;br /&gt;
&lt;br /&gt;
dnes nejpoužívanější jazyková konstrukce pro&lt;br /&gt;
implementaci distribuovaných systémů a&lt;br /&gt;
programů bez explicitního předávání zpráv&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ekvivalenty uvedených primitiv ==&lt;br /&gt;
Lze implementovat semafory pomocí zpráv a zprávy pomocí semaforů&lt;br /&gt;
&lt;br /&gt;
Lze ukázat, že je možné implementovat&lt;br /&gt;
* Semafory pomocí monitoru&lt;br /&gt;
* Monitory pomocí semaforů&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bariéry ==&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Bariera.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Producent-konzument ==&lt;br /&gt;
&lt;br /&gt;
* Dva procesy sdílejí společnou paměť (buffer) pevné velikosti N položek&lt;br /&gt;
* Jeden proces je producent - generuje nové položky a ukládá je do vyrovnávací paměti&lt;br /&gt;
* Paralelně běží proces konzument, který data vyjímá a spotřebovává&lt;br /&gt;
* Procesy mohou běžet různými rychlostmi =&amp;gt; musí být zabezpečeno, aby nedošlo k přetečení/podtečení:&lt;br /&gt;
** Konzument musí být schopen čekat na producenta, nejsou-li data&lt;br /&gt;
** Producent musí být schopen čekat na konzumenta, je-li buffer plný&lt;br /&gt;
&lt;br /&gt;
Klasicky se zde sdílená paměť řeší pomocí pole, kde se z jedné strany položky přidávají a z druhé odebírají. Index kam zapisovat/odebírat počítáme modulo velikost pole. Kolizím zabráníme pomocí dvou semaforů, kde jeden obsahuje informaci o počtu plných prvků pole (f) a druhý o počtu prázdných prvků (e).&lt;br /&gt;
* přidání prvku: P(e), V(f)&lt;br /&gt;
* odebrání prvku: P(f), V(e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Problém večeřících filosofů ==&lt;br /&gt;
&lt;br /&gt;
* 5 filosofů sedí kolem kulatého stolu&lt;br /&gt;
* Každý filosof má před sebou talíř se špagetami&lt;br /&gt;
* Mezi každými dvěma talíři je vidlička&lt;br /&gt;
* Špagety jsou tak klouzavé, že filosof potřebuje 2 vidličky, aby mohl jíst&lt;br /&gt;
* Když filosof dostane hlad, pokusí se vzít 2 vidličky; pokud uspěje, nějakou dobu jí, pak položí vidličky a pokračuje v přemýšlení&lt;br /&gt;
* Problémy: uvíznutí(deadlock) (všichni filozofové zvednou levou vidličku, žádný z nich už nemůže pokračovat), vyhladovění (pokud by filozofové vzali najednou levou vidličku, budou běžet cyklicky - vidí, že pravá není volná, položí…)&lt;br /&gt;
* Řešení - Dijkstra (pomocí semaforů)&lt;br /&gt;
&lt;br /&gt;
== Problém čtenářů a písařů ==&lt;br /&gt;
&lt;br /&gt;
* Představme si velkou databázi, množina procesů se pokouší souběžně číst a zapisovat&lt;br /&gt;
* Více požadavků čtení - akceptovatelné&lt;br /&gt;
* Při zápisu nesmí nikdo jiný přistupovat, ani žádní čtenáři&lt;br /&gt;
* První čtenář, který dostane přístup do databáze, provede P(w), další pouze zvětšují čítač&lt;br /&gt;
* Po skončení čtenáři zmenšují čítač, poslední provede V(w)&lt;br /&gt;
* Semafor w zabrání vstupu písaře, pokud jsou čtenáři&lt;br /&gt;
* Semafor w také zabrání vstupu čtenářům, je-li písař&lt;br /&gt;
* toto je s předností čtenářů&lt;br /&gt;
&lt;br /&gt;
* nebo to jde udělat tak, že když chce vstoupit písař, tak už tam nepustí další čtenáře (s předností písařů)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Problémy ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uvíznutí (Deadlock) - cyklické čekání dvou či více procesů na událost, kterou může vyvolat pouze některý z nich, nikdy k tomu však nedojde&lt;br /&gt;
* Vyhladovění (starvation) -  proces se nedostane k požadovaným zdrojům&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Probl%C3%A9m_uv%C3%ADznut%C3%AD_proces%C5%AF,_graf_alokace_zdroj%C5%AF</id>
		<title>Problém uvíznutí procesů, graf alokace zdrojů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Probl%C3%A9m_uv%C3%ADznut%C3%AD_proces%C5%AF,_graf_alokace_zdroj%C5%AF"/>
				<updated>2014-02-20T06:47:22Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;V množině procesů nastalo uvíznutí, jestliže každý proces množiny čeká na událost, kterou může způsobit pouze jiný proces množiny. Protože všechny čekají, žádný z nich událost nevygeneruje, nevzbudí jiný proces.&lt;br /&gt;
&lt;br /&gt;
Podmínky vzniku uvíznutí (musejí být splněny všechny 4, 1-3 jsou předpoklad pro 4):&lt;br /&gt;
* Vzájemné vyloučení: každý zdroj je buď dostupný, nebo je výhradně přiřazen právě jednomu procesu&lt;br /&gt;
* „hold and wait“: proces držící výhradně přiřazené zdroje může požadovat další zdroje&lt;br /&gt;
* Nemožnost odejmutí: jednomu přiřazené zdroje nemohou být procesu násilně odejmuty&lt;br /&gt;
* Cyklické čekání: musí být cyklický řetězec dvou nebo více procesů, kde každý z nich čeká na zdroj držený dalším členem&lt;br /&gt;
&lt;br /&gt;
* tyto 4 podmínky mohou být modelovány pomocí orientovaných grafů = graf alokace zdrojů&lt;br /&gt;
* graf má 2 typy uzlů:&lt;br /&gt;
** proces - zobrazujeme jako kruh&lt;br /&gt;
** zdroj - zobrazujeme jako čtverec&lt;br /&gt;
* význam hran:&lt;br /&gt;
** od zdroje k procesu: zdroj držen procesem&lt;br /&gt;
** od procesu ke zdroji: proces je blokován čekáním na zdroj&lt;br /&gt;
* cyklus v grafu je nutnou a postačující podmínkou pro vznik uvíznutí&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Alokace-zdroju.jpg]]&lt;br /&gt;
 &lt;br /&gt;
Strategie zacházení s uvíznutím:&lt;br /&gt;
# Ignorování = „pštrosí algoritmus“&lt;br /&gt;
# Detekce a zotavení (odejmutí zdroje, zrušení změn, zrušení procesu)&lt;br /&gt;
# Dynamické zabrání (pečlivá alokace zdrojů - systém rozhodne zda je bezpečné požadovaný zdroj přidělit) - mělo by předejít uvíznutí (bankéřův algoritmus)&lt;br /&gt;
# Prevence pomocí strukturální negace jedné z podmínek pro vznik uvíznutí&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Monitory</id>
		<title>Monitory</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Monitory"/>
				<updated>2014-02-20T06:47:15Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Monitor je synchronizační primitivum, které se používá pro řizeni přístupu ke sdíleným prostředkům. Jeho zvláštností&lt;br /&gt;
je, že jde o speciální konstrukci programovacího jazyka (musí ho tedy implementovat překladač), typicky implementovanou pomocí jineho synchronizačního primitiva. Výhodou monitoru oproti jiným primitivum je jeho&lt;br /&gt;
vysokoúrovňovost - snadněji se používá a je bezpečnější. Při jeho použití je méně pravděpodobné, že programátor&lt;br /&gt;
udělá chybu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Monitor je speciální typ modulu, ve kterém jsou sdružena data a procedury, které s nimi mohou manipulovat&lt;br /&gt;
* Monitory musí umět rozpoznat překladač a přeložit je do odpovídajícího kódu&lt;br /&gt;
* Procesy mohou volat procedury monitoru, ale nemohou přímo přistupovat k datům monitoru&lt;br /&gt;
* V monitoru může být v jednu chvíli AKTIVNÍ pouze jeden proces; ostatní jsou při pokusu o vstup do monitoru pozastaveny.&lt;br /&gt;
* Monitory poskytují speciální typ proměnné nazývané podmínka&lt;br /&gt;
* Podmínky mohou být definovány a použity pouze uvnitř monitoru&lt;br /&gt;
* Nad podmínkami jsou definovány dvě operace:&lt;br /&gt;
** c.wait - volající bude pozastaven nad podmínkou c. Pokud je některý proces připraven vstoupit do monitoru, bude mu to dovoleno&lt;br /&gt;
** c.signal - pokud existuje jeden nebo více procesů pozastavených nad podmínkou c, reaktivuje jeden z pozastavených procesů, tj. bude mu dovoleno pokračovat v běhu uvnitř monitoru pokud nad podmínkou nespí žádný proces, nedělá nic&lt;br /&gt;
&lt;br /&gt;
Pozor, pokud by signál pouze vzbudil proces, běžely by v monitoru dva.&lt;br /&gt;
Možná řešení:&lt;br /&gt;
* Hoare - proces volající c.signal se pozastaví a vzbudí se až poté co předchozí rektivovaný proces opustí monitor nebo se pozastaví&lt;br /&gt;
* Hansen - Signal smí být uveden pouze jako poslední příkaz v monitoru. Po volání signal musí proces opustit monitor&lt;br /&gt;
&lt;br /&gt;
V Javě jsou monitory implementovány pomocí klíčového slova synchronized. Zde je problém více vláken v monitoru vyřešen tak, že čekající může běžet až poté, co proces volající signál opustí monitor.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Semafory,_jejich_pou%C5%BEit%C3%AD_a_implementace</id>
		<title>Semafory, jejich použití a implementace</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Semafory,_jejich_pou%C5%BEit%C3%AD_a_implementace"/>
				<updated>2014-02-20T06:47:08Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Semafor = proměnná, obsahuje nezáporné celé číslo&lt;br /&gt;
&lt;br /&gt;
Semaforu, lze přiřadit hodnotu pouze při deklaraci&lt;br /&gt;
&lt;br /&gt;
Nad semafory pouze operace P(s) a V(s):&lt;br /&gt;
* Operace P(S): pokud S&amp;gt;0, sníží S o 1, jinak pozastaví proces&lt;br /&gt;
* Operace V(S): pokud je nad semaforem S zablokovaný jeden nebo více procesů, vzbudí jeden z nich (náhodně), jinak zvýší S o 1&lt;br /&gt;
&lt;br /&gt;
Operace P i V jsou nedělitelné (atomické) akce, tj. jakmile započne akce nad semaforem, nikdo k němu nemůže přistoupit. Když se několik procesů pokouší přistoupit současně ke stejnému semaforu, operace se provedou sekvenčně v libovolném pořadí.&lt;br /&gt;
&lt;br /&gt;
Vzájemné vyloučení pomocí semaforů:&lt;br /&gt;
* Vytvoříme semafor s počáteční hodnotou 1&lt;br /&gt;
* Před vstupem do KS voláme P(s), po vystoupení V(s)&lt;br /&gt;
* Je-li libovolný proces v KS, je s=0, jinak s=1&lt;br /&gt;
&lt;br /&gt;
Implementace&lt;br /&gt;
* Procesům poskytneme možnost se pozastavit při operaci P&lt;br /&gt;
* Aktivace operací V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
S každým semaforem s je sdruženo:&lt;br /&gt;
* Celočíselná proměnná s.c, dovolíme jí nabývat i záporných hodnot, pak absolutní hodnota s.c vyjadřuje počet blokovaných procesů&lt;br /&gt;
* Binární semafor s.mutex (mutual exclusion) pro vzájemné vyloučení při operaci nad semaforem&lt;br /&gt;
* Seznam blokovaných procesů s.L&lt;br /&gt;
&lt;br /&gt;
Proces, který nemůže dokončit operaci P bude zablokován a uložen do seznamu blokovaných procesů. Pokud při operaci V není seznam prázdný, vybere se ze seznamu jeden proces a odblokuje se.&lt;br /&gt;
&lt;br /&gt;
Pozor, mutex není binární semafor. Mutex může na rozdíl od semaforu odemknout pouze vlákno, které ho zamklo.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Prost%C5%99edky_pro_synchronizaci_proces%C5%AF</id>
		<title>Prostředky pro synchronizaci procesů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Prost%C5%99edky_pro_synchronizaci_proces%C5%AF"/>
				<updated>2014-02-20T06:46:57Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zakázání přerušení&lt;br /&gt;
* V systému se sdílením času přepíná CPU mezi procesy pouze jako důsledek přerušení&lt;br /&gt;
* Zakážeme-li přerušení, k přepínání nedochází&lt;br /&gt;
* Nejjednodušší řešení, možné pouze v jednoprocesorovém systému&lt;br /&gt;
* Není dovoleno v uživatelském režimu&lt;br /&gt;
&lt;br /&gt;
Řešení s aktivním čekáním&lt;br /&gt;
Základní předpoklady o systému:&lt;br /&gt;
# Zápis a čtení ze společné datové oblasti jsou nedělitelné operace&lt;br /&gt;
# Kritické sekce nemohou mít přiřazenou prioritu&lt;br /&gt;
# Relativní rychlost procesů je neznámá&lt;br /&gt;
# Proces se může pozastavit mimo kritickou sekci&lt;br /&gt;
&lt;br /&gt;
Průběžně se testuje, zra už může proces do kritické sekce vstoupit - plýtvání časem CPU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Petersonovo řešení&lt;br /&gt;
* Na začátku není v kritické sekci žádný proces&lt;br /&gt;
* Proces 0 volá enter_CS(0)&lt;br /&gt;
** Nastaví interested[0]:=true, turn:=0;&lt;br /&gt;
** Protože interested[1]=false, nebude čekat ve smyčce&lt;br /&gt;
* Pokud proces 1 volá enter_CS(1)&lt;br /&gt;
** Nastaví interested[1]:=true, turn:=1;&lt;br /&gt;
** Bude čekat ve smyčce, dokud se interested[0] nenastaví na false (voláním leave_CS(0))&lt;br /&gt;
* Co kdyby oba procesy volaly enter_CS téměř současně?&lt;br /&gt;
** Oba nastaví interested na true&lt;br /&gt;
** Oba nastaví turn na své číslo; „téměř souběžný zápis“ se ale provede sekvenčně, tj. nejdříve nastaví turn jeden, hodnota bude přepsána druhým&lt;br /&gt;
** Oba se dostanou do while, proces 0 projde, proces 1 aktivně čeká&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spin-lock s instrukcí TSL&lt;br /&gt;
&lt;br /&gt;
Většina současných počítačů má instrukci, která otestuje hodnotu a nastaví paměťové místo v jedné nedělitelné operaci (TSL - „Test and Set Lock“) - HW podpora&lt;br /&gt;
&lt;br /&gt;
* Proměnná zámek - na počátku 0&lt;br /&gt;
* Proces, který chce vstoupit do KS otestuje&lt;br /&gt;
** Pokud 0 nastaví na 1 a vstoupí do KS&lt;br /&gt;
** Pokud 1 čeká&lt;br /&gt;
* Problém časového souběhu (pokud by TSL nebyla atomická):&lt;br /&gt;
** Jeden proces přečte, vidí 0&lt;br /&gt;
** Druhý proces je naplánován, přečte, vidí 0, nastaví na 1, vstoupí do KS&lt;br /&gt;
** Po naplánování první zapíše 1 a máme 2 procesy v KS&lt;br /&gt;
* Řešení vyžaduje HW podporu&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Další možnosti&lt;br /&gt;
* [[Semafory, jejich použití a implementace|Semafory]]&lt;br /&gt;
* Mutexy - někdy nepotřebujeme použít schopnost semaforů čítat, tj. stačila by nám pouze jejich schopnost zajistit vzájemné vyloučení =&amp;gt; mutex&lt;br /&gt;
* [[Monitory]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Předávání zpráv - primitiva send a receive&lt;br /&gt;
# Čeká-li primitivum send na převzetí zprávy příjemcem, je blokující (synchronní). Ve většině systémů je neblokující.&lt;br /&gt;
# Pokud při zavolání recese není ve frontě žádná zpráva, může se recese buď zablokovat, nebo se může vrátit s chybou. Ve většině systémů je blokující.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Probl%C3%A9m_kritick%C3%A9_sekce</id>
		<title>Problém kritické sekce</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Probl%C3%A9m_kritick%C3%A9_sekce"/>
				<updated>2014-02-20T06:46:49Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Časový souběh ==&lt;br /&gt;
&lt;br /&gt;
Pokud procesy sdílejí společnou paměť, kterou čtou a zapisují, může nastat časový souběh. Hledání časových souběhů v reálných programech není jednoduché, protože časový souběh se obvykle projevuje nedeterministicky a programy běží po většinu času bez problémů.&lt;br /&gt;
&lt;br /&gt;
Příklad - Přístup do souboru&lt;br /&gt;
&lt;br /&gt;
* 2 procesy chtějí vytvořit soubor a zapsat do něj&lt;br /&gt;
* 1. proces – zjistí, že soubor není&lt;br /&gt;
* ... přeplánování ...&lt;br /&gt;
* 2. proces – zjistí, že soubor není, vytvoří a zapíše&lt;br /&gt;
* 1. proces – pokračuje, vytvoří a zapíše znehodnotí činnost druhého procesu&lt;br /&gt;
&lt;br /&gt;
Řešení - časový souběh by nenastal, pokud by čtení+modifikace proběhli atomicky, tj. jako jedna nedělitelná operace. Zařídit HW většinou není praktické. SW řešení - v jednom okamžiku dovolíme číst a zapisovat společná data pouze jednomu procesu.&lt;br /&gt;
&lt;br /&gt;
== Kritická sekce ==&lt;br /&gt;
&lt;br /&gt;
= místo programu, kde je prováděn přístup ke společným datům&lt;br /&gt;
&lt;br /&gt;
Dobré řešení musí mít 3 vlastnosti:&lt;br /&gt;
# Vzájemné vyloučení: žádné 2 procesy nesmějí být současně uvnitř své kritické sekce&lt;br /&gt;
# Proces běžící mimo svou kritickou sekci nesmí blokovat jiné procesy&lt;br /&gt;
# Žádný proces nesmí na vstup do své kritické sekce čekat nekonečně dlouho&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Paraleln%C3%AD_procesy,_prost%C5%99edky_pro_popis_paraleln%C3%ADch_proces%C5%AF,_vl%C3%A1kna</id>
		<title>Paralelní procesy, prostředky pro popis paralelních procesů, vlákna</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Paraleln%C3%AD_procesy,_prost%C5%99edky_pro_popis_paraleln%C3%ADch_proces%C5%AF,_vl%C3%A1kna"/>
				<updated>2014-02-20T06:46:43Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Všechen SW běžící na počítači je organizován jako množina sekvenčních procesů&lt;br /&gt;
* Proces = běžící program včetně obsahu čítače instrukcí, registrů, proměnných, běží ve vlastní paměti&lt;br /&gt;
* Koncepčně má každý proces vlastní virtuální CPU&lt;br /&gt;
&lt;br /&gt;
Při pseudoparalelním běhu je v jednu chvíli aktivní pouze jeden proces. Po nějakém čase se OS rozhodne pozastavit běh procesu a spustit běh dalšího. Po dostatečně dlouhém čase všechny procesy vykonají část své činnosti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Základní stavy procesů ==&lt;br /&gt;
&lt;br /&gt;
Následující stavy procesů se vyskytují ve všech víceúlohových systémech:&lt;br /&gt;
* vytvořený (created) - proces je vytvořen buď příkazem uživatele (u terminálu), nebo na žádost operačního systému o provedení služby, či na žádost jiného procesu (rodiče)&lt;br /&gt;
* připravený (ready) nebo čekající (waiting) - připravený pro vstup do stavu běžící, čeká pouze na přidělení procesoru&lt;br /&gt;
* běžící (running) - procesu je přidělen procesor a právě se provádí příslušné programy&lt;br /&gt;
* blokovaný (blocked) - proces je převeden do tohoto stavu v případě, kdy čeká na dokončení nějaké vstupně-výstupní operace, případně na skončení jiného procesu, uvolnění zdroje, synchronizační primitivum a podobně&lt;br /&gt;
* ukončený (terminated) - proces skončil&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Stavy-procesu.jpg]]&lt;br /&gt;
&lt;br /&gt;
Lepší obrázek z přednášek:&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Graf-stavu-procesu.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Precedenční grafy&lt;br /&gt;
* Acyklický orientovaný graf&lt;br /&gt;
* Běh procesu Pi je vyjádřen orientovanou hranou grafu&lt;br /&gt;
* Vztahy mezi procesy znázorněny spojením hran&lt;br /&gt;
&lt;br /&gt;
Abstraktní primitiva fork, join a quit&lt;br /&gt;
* Conway 1963&lt;br /&gt;
* Jeden z prvních mechanismů, možnost obecného popisu paralelních aktivit&lt;br /&gt;
* Funkce primitiv:&lt;br /&gt;
**fork X - provedení primitiva „fork x“ způsobí spuštění nového vlákna  od příkazu označeného návěštím x; nové vlákno bude běžet paralelně s původním vláknem.&lt;br /&gt;
** quit - ukončí vlákno&lt;br /&gt;
** join t, Y - atomicky provede: t:=t-1; if t = 0 then goto Y;&lt;br /&gt;
* Abstraktní primitiva cobegin a coend&lt;br /&gt;
** Explicitně specifikuje sekvenci programu, která má být spuštěna paralelně&lt;br /&gt;
** Cobegin má formát:&lt;br /&gt;
 cobegin&lt;br /&gt;
	C1 || C2 || … || Cn&lt;br /&gt;
 coend&lt;br /&gt;
&lt;br /&gt;
* Výsledkem je vytvoření samostatného vlákna pro všechna Ci&lt;br /&gt;
* Každé Ci běží nezávislé na ostatních vláknech v konstrukci cobegin / coend&lt;br /&gt;
* Program pokračuje za coend až po skončení posledního Ci&lt;br /&gt;
&lt;br /&gt;
Vlákna&lt;br /&gt;
* Vlakna v procesu sdileji adresni prostor, otevrene soubory (atributy procesu)&lt;br /&gt;
* Vlakna maji soukromy citac instrukci, obsah registru, soukromy zasobnik&lt;br /&gt;
* Mohou mit soukrome lokalni promenne&lt;br /&gt;
* Puvodne vyuzivana zejmena pro VT vypocty na multiprocesorech (kazdé vlakno vlastni CPU, spolecna data)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PCB ==&lt;br /&gt;
&lt;br /&gt;
= process control block&lt;br /&gt;
&lt;br /&gt;
OS (konkrétně správce procesů) udržuje tabulku nazývanou tabulka procesů&lt;br /&gt;
* PCB obsahuje všechny info potřebné pro opětovné spuštění procesu&lt;br /&gt;
* Konkrétní obsah PCB – různý&lt;br /&gt;
* Pole správy procesů, správy paměti, správy souborů&lt;br /&gt;
&lt;br /&gt;
Položky PCB&lt;br /&gt;
* Identifikátor procesu, uživatele&lt;br /&gt;
* Stavová informace procesoru (registry, PC, SP, styv CPU)&lt;br /&gt;
* Plánovací parametry procesu&lt;br /&gt;
* Odkazy na rodiče a potomky&lt;br /&gt;
* Čas spuštení, čas spotřebovaný na CPU&lt;br /&gt;
* Nastavení meziprocesorové komunikace&lt;br /&gt;
* Popis paměti, data, zásobník&lt;br /&gt;
* Otevřené soubory, aktuální pracovní adresář...&lt;br /&gt;
&lt;br /&gt;
PCB&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Pcb.png]]&lt;br /&gt;
&lt;br /&gt;
== Vlákna ==&lt;br /&gt;
&lt;br /&gt;
Jeden proces se může skládat z jednoho nebo více vláken.&lt;br /&gt;
&lt;br /&gt;
Vlákna v procesu sdílejí adresní prostor, ale mají vlastní čítač instrukcí, obsah registrů, zásobník. Taky mohou mít soukromé lokální proměnné.&lt;br /&gt;
&lt;br /&gt;
* interaktivní procesy (něco beží na pozadí a zároveň probíhá komunikace s uživatelem)&lt;br /&gt;
* www server (každý klient jedno vlákno)&lt;br /&gt;
* textový procesor (vstup dat, formátoování textu)&lt;br /&gt;
&lt;br /&gt;
Multithreading - více vláken. Proces začíná s jedním vláknem, další si vytváří za běhu.&lt;br /&gt;
&lt;br /&gt;
Režije na vytvoření vlákna a přepnutí kontextu je menší než u procesů.&lt;br /&gt;
&lt;br /&gt;
Vlákna popisujeme  pomocí Precedenčních grafů&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Precedenční graf ==&lt;br /&gt;
&lt;br /&gt;
Acyklický orientovaný graf, popisuje vztahy mezi procesy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Precedencni-grafy.png]]&lt;br /&gt;
&lt;br /&gt;
Lze také zapsat pomocí funkcí:&lt;br /&gt;
* P(a,b) - paralelní běh 2 vláken (a,b)&lt;br /&gt;
* S(a,b) - sériový běh 2 vláken (a,b)&lt;br /&gt;
např: S (p1, S(P(p2, P(S(p3, P(p4,p5)), p6)), P(p7,p8))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Proces,_implementace_procesu,_konstrukce_pro_vytv%C3%A1%C5%99en%C3%AD_proces%C5%AF</id>
		<title>Proces, implementace procesu, konstrukce pro vytváření procesů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Proces,_implementace_procesu,_konstrukce_pro_vytv%C3%A1%C5%99en%C3%AD_proces%C5%AF"/>
				<updated>2014-02-20T06:46:40Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proces = program, který běží&lt;br /&gt;
* Má vlastní adresový prostor, ve kterém běží&lt;br /&gt;
* V adresním prostoru má kód spustitelného programu, data, zásobník&lt;br /&gt;
* S procesem sdruženy registry a další informace potřebné k běhu programu&lt;br /&gt;
* Stavy: běžící, připraven, blokován&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Základní stavy procesů ==&lt;br /&gt;
&lt;br /&gt;
Následující stavy procesů se vyskytují ve všech víceúlohových systémech:&lt;br /&gt;
* vytvořený (created) - proces je vytvořen buď příkazem uživatele (u terminálu), nebo na žádost operačního systému o provedení služby, či na žádost jiného procesu (rodiče)&lt;br /&gt;
* připravený (ready) nebo čekající (waiting) - připravený pro vstup do stavu běžící, čeká pouze na přidělení procesoru&lt;br /&gt;
* běžící (running) - procesu je přidělen procesor a právě se provádí příslušné programy&lt;br /&gt;
* blokovaný (blocked) - proces je převeden do tohoto stavu v případě, kdy čeká na dokončení nějaké vstupně-výstupní operace, případně na skončení jiného procesu, uvolnění zdroje, synchronizační primitivum a podobně&lt;br /&gt;
* ukončený (terminated) - proces skončil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Stavy-procesu.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementace procesu ==&lt;br /&gt;
&lt;br /&gt;
OS udržuje tabulku nazývanou TABULKA PROCESŮ - každý proces v ní má položkou nazývanou PCB (Process Control Block). PCB obsahuje všechny informace, které musejí být uchovány, je-li proces přepnut ze stavu „běžící“ do „připraven“ nebo „blokován“ - tak aby bylo proces možné znovu spustit. Konkrétní obsah se liší mezi systémy, ale většina obsahuje:&lt;br /&gt;
* Správa procesu&lt;br /&gt;
** Identifikátory&lt;br /&gt;
** Stavová informace procesoru&lt;br /&gt;
** Stav procesu&lt;br /&gt;
** Plánovací parametry procesu&lt;br /&gt;
** Odkazy na rodiče a potomky&lt;br /&gt;
** Nastavení meziprocesové komunikace&lt;br /&gt;
* Správa paměti&lt;br /&gt;
** Popis paměti = ukazatel, velikost, přístupová práva&lt;br /&gt;
** Úsek paměti s kódem programu&lt;br /&gt;
** Data&lt;br /&gt;
** Zásobník&lt;br /&gt;
* Správa souborů&lt;br /&gt;
** Prostředí (aktuální adresář, …)&lt;br /&gt;
** Otevřené soubory&lt;br /&gt;
&lt;br /&gt;
Konstrukce&lt;br /&gt;
 pid = fork();&lt;br /&gt;
 if (pid == 0)&lt;br /&gt;
   jsem potomek;&lt;br /&gt;
 else&lt;br /&gt;
   jsem rodič;&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Vyvol%C3%A1n%C3%AD_slu%C5%BEeb_OS,_zpracov%C3%A1n%C3%AD_p%C5%99eru%C5%A1en%C3%AD</id>
		<title>Vyvolání služeb OS, zpracování přerušení</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Vyvol%C3%A1n%C3%AD_slu%C5%BEeb_OS,_zpracov%C3%A1n%C3%AD_p%C5%99eru%C5%A1en%C3%AD"/>
				<updated>2014-02-20T06:46:26Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Většina moderních CPU: 2 řežimy:&lt;br /&gt;
* Privilegovaný - režim jádra, všechny instrukce jsou povoleny, v tomto běží pouze OS&lt;br /&gt;
* Uživatelský - některé instrukce (I/O) jsou zakázány, v tomto běží ostatní programy&lt;br /&gt;
&lt;br /&gt;
Aby uživ. aplikace mohla provádět zakázané instrukce, musí požádat OS o jejich provedení následujícím způsobem (Vyvolání služby):&lt;br /&gt;
&lt;br /&gt;
* Aplikace si uloži parametry pro službu na předem určené místo (registry, zásobník,...)&lt;br /&gt;
* Zavolá metodu volání služby jádra (např. v C je to syscall( ))&lt;br /&gt;
* Ta podle parametrů zjistí jaká složba je požadována, která přepne CPU do režimu jádra, a vyvolá obsluhu&lt;br /&gt;
* Ta službu provede a při návratu do uživatelského programu přepne CPU zpět do uživatelského režimu&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Vyvolani-sluzby.jpg]] &lt;br /&gt;
&lt;br /&gt;
Programovací jazyky skrývají volání funkcí jádra tak, aby vypadaly jako běžné knihovní funkce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zpracování přerušení ==&lt;br /&gt;
&lt;br /&gt;
Přerušení je událost, která pokud nastane, je třeba ji v krátkém čase obsloužit. Je tedy přerušeno vykonávání instrukcí, provedena obsluha události a po té se pokračuje v předchozí činnosti. Provedení tohoto je v režimu jádra. &lt;br /&gt;
&lt;br /&gt;
Druhy:&lt;br /&gt;
* HW přerušení (vnější) - generuje jej I/O zařízení, asynchronně, například přijetí paketu, stisknutí klávesy,... Stará se o ně řadič přerušení (priority atd)&lt;br /&gt;
* Vnitřní přerušení - generuje proces, například dělení nulou, výpadek stránky, ...&lt;br /&gt;
* Softwarové - synchronní, generováno aplikací jako takovou, záměrně, volání služby OS je příkladem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://cs.wikipedia.org/wiki/P%C5%99eru%C5%A1en%C3%AD Přerušení na Wiki]&lt;br /&gt;
&lt;br /&gt;
'''Vektor přerušení''' - ukazatel, kde pro daný typ přerušení (a jeho číslo) začíná program pro jeho obsluhu.&lt;br /&gt;
&lt;br /&gt;
Obsluha:&lt;br /&gt;
* Přijde signalizace přerušení&lt;br /&gt;
* Je dokončena právě prováděná instrukce v CPU&lt;br /&gt;
* Adresa další instrukce je uložena na zásobník&lt;br /&gt;
* Do PC (Program Counter - ukazatel CPU na další instrukci) je nastavena instrukce, na kterou ukazuje odpovídající vektor přerušení)&lt;br /&gt;
* Přepnutí kontextu (Obsluha je samostatný proces)&lt;br /&gt;
* Obsluha uloží stav registrů a obecně stav CPU do zásobníku&lt;br /&gt;
* Provede obsluhu přerušení&lt;br /&gt;
* Provede (I)RET&lt;br /&gt;
* Plánovač opět přepne kontext podle dat v zásobníku a původní proces pokračuje v činnosti (kromě zpoždění tedy neví, že přerušení proběhlo, musí tedy naslouchat všem výstupům obsluh přerušení,  které jej zajímají)&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Rozd%C4%9Blen%C3%AD_OS,_architektura_a_komponenty_OS._Z%C3%A1kladn%C3%AD_funkce_OS</id>
		<title>Rozdělení OS, architektura a komponenty OS. Základní funkce OS</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Rozd%C4%9Blen%C3%AD_OS,_architektura_a_komponenty_OS._Z%C3%A1kladn%C3%AD_funkce_OS"/>
				<updated>2014-02-20T06:46:19Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Rozdělení ==&lt;br /&gt;
&lt;br /&gt;
Podle úrovně sdílení CPU&lt;br /&gt;
* Jednoprocesový - např. MS DOS; v daném čase je v paměti aktivní jeden program&lt;br /&gt;
* Multiprocesový - např. UNIX, WinNT; aby se využilo systémových zdrojů (sdílení CPU, paměti) je v hlavní paměti více než jeden program. V současnosti nejčastěji v systémech pro více uživatelů.&lt;br /&gt;
&lt;br /&gt;
Podle typu interakce/požadavků na odezvu&lt;br /&gt;
* Dávkový systém - uživatelské úlohy se zadávají jako sekvenční dávky, během zpracování není interakce mezi uživatelem a jeho úlohou.&lt;br /&gt;
* Interaktivní - dovolí uživatelům interakce s jejich úlohami&lt;br /&gt;
* OS reálného času - konkrétní aplikace mají přísné požadavky na čas odpovědi. OS se těmto požadavkům podřizují. Vhodné pro multimédia, virtuální realitu. 2 typy:&lt;br /&gt;
** Hard real time: zaručuje odezvu systému v ohraničeném čase&lt;br /&gt;
** Soft real time: RT úlohy mají prioritu před vším ostatním, avšak nezaručuje odezvu v ohraničeném čase. &lt;br /&gt;
&lt;br /&gt;
Dle velikosti HW&lt;br /&gt;
* superpočítač&lt;br /&gt;
* telefon&lt;br /&gt;
* čipová karta&lt;br /&gt;
&lt;br /&gt;
Míra distribuovanosti&lt;br /&gt;
* Klasické - centralizované 1 and more CPU&lt;br /&gt;
* ParalelnÍ&lt;br /&gt;
* SÍŤOVÉ&lt;br /&gt;
* Distribuované virtuální uniprocesor - Uživatel neví kde běží programy, kde jsou soubory&lt;br /&gt;
&lt;br /&gt;
Další možnosti dělení OS:&lt;br /&gt;
* podle počtu uživatelů&lt;br /&gt;
** jedno / více uživatelské&lt;br /&gt;
* podle funkcí&lt;br /&gt;
** univerzální&lt;br /&gt;
** specializované&lt;br /&gt;
&lt;br /&gt;
== Architektura ==&lt;br /&gt;
&lt;br /&gt;
OS = jádro + systémové nástroje&lt;br /&gt;
&lt;br /&gt;
Dělíme na&lt;br /&gt;
* Monolitické jádro – jádro je jeden funkční celek (GNU/Linux)&lt;br /&gt;
* Mikrojádro – malé jádro, oddělitelné části pracují jako samostatné procesy v user space (GNU/Hurd)&lt;br /&gt;
* Hybridní jádro - kombinace (Win XP, Win Vista...)&lt;br /&gt;
&lt;br /&gt;
'''Monolitické jádro'''&lt;br /&gt;
* Jeden spustitelný soubor&lt;br /&gt;
* Uvnitř moduly pro jednotlivé funkce (filesys, procesy)&lt;br /&gt;
* Jeden program, řízení se předává voláním podprogramů&lt;br /&gt;
* Příklady: UNIX, Linux, MS DOS&lt;br /&gt;
&lt;br /&gt;
Typickou součástí jádra je např. souborový systém&lt;br /&gt;
&lt;br /&gt;
Linux je monolitické jádro OS, s podporou zavádění&lt;br /&gt;
modulů za běhu systému&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Monoliticke-jadro.png]]&lt;br /&gt;
&lt;br /&gt;
'''Mikrojádro'''&lt;br /&gt;
* Model klient – server&lt;br /&gt;
* Většinu činností OS vykonávají samostatné procesy mimo jádro (servery, např. systém souborů)&lt;br /&gt;
* Poskytuje pouze nejdůležitější nízkoúrovňové funkce&lt;br /&gt;
** Nízkoúrovňová správa procesů&lt;br /&gt;
** Adresový prostor, komunikace mezi adresovými prostory&lt;br /&gt;
** Někdy obsluha přerušení, vstupy/výstupy&lt;br /&gt;
* Pouze mikrojádro běží v privilegovaném režimu&lt;br /&gt;
** Méně pádů systému&lt;br /&gt;
&lt;br /&gt;
Výhody&lt;br /&gt;
* vynucuje modulární strukturu&lt;br /&gt;
* Snadnější tvorba distribuovaných OS (komunikace přes síť)&lt;br /&gt;
Nevýhody&lt;br /&gt;
* Složitejší návrh systému&lt;br /&gt;
* Režie&lt;br /&gt;
Příklady: QNX, Hurd, OSF/1, MINIX, Amoeba&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Mikrojadro.png]]&lt;br /&gt;
&lt;br /&gt;
== Komponenty OS ==&lt;br /&gt;
* správa procesů&lt;br /&gt;
* správa hlavní paměti&lt;br /&gt;
* soubory&lt;br /&gt;
* správa zařízení - I/O subsystém&lt;br /&gt;
* síť (networking) .. viz KIV/UPS&lt;br /&gt;
* ochrana a bezpečnost&lt;br /&gt;
* uživatelské rozhraní&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Procesy; proces = běžící program; potřebuje minimálně:&lt;br /&gt;
** Čas CPU = být vykonán&lt;br /&gt;
** Paměť = mít kde běžet&lt;br /&gt;
** Vstupy a výstupy = soubory a I/O zařízení&lt;br /&gt;
* Správa hlavní paměti&lt;br /&gt;
** Alokace a dealokace paměti podle potřeby&lt;br /&gt;
** Udržuje informace, která část paměti je používána a kým&lt;br /&gt;
* Soubory&lt;br /&gt;
** Vytváření/ rušení souborů/adresářů&lt;br /&gt;
** Mapování souborů na vnější paměť&lt;br /&gt;
** Rozvrhování diskových operací&lt;br /&gt;
* I/O podsystém&lt;br /&gt;
** Správa paměti pro buffering, caching, spooling&lt;br /&gt;
** Společné rozhraní ovladačů zařízení&lt;br /&gt;
** Ovladače pro specifická zařízení&lt;br /&gt;
* Síť&lt;br /&gt;
* Ochrana a bezpečnost = ke zdrojům smí přistupovat pouze autorizované procesy&lt;br /&gt;
* Uživatelské rozhraní - CLI, GUI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Grafov%C3%A9_algoritmy_(cesta_%E2%80%93_Dijkstra,_Floyd-Warshal,_kostra_%E2%80%93_Prim-Jarnik),_reprezentace_grafu_(matice,_seznam_sousednosti),_z%C3%A1klady_kryptografie_(symetrick%C3%A9,_asymetrick%C3%A9_%C5%A1ifrov%C3%A1n%C3%AD)</id>
		<title>Grafové algoritmy (cesta – Dijkstra, Floyd-Warshal, kostra – Prim-Jarnik), reprezentace grafu (matice, seznam sousednosti), základy kryptografie (symetrické, asymetrické šifrování)</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Grafov%C3%A9_algoritmy_(cesta_%E2%80%93_Dijkstra,_Floyd-Warshal,_kostra_%E2%80%93_Prim-Jarnik),_reprezentace_grafu_(matice,_seznam_sousednosti),_z%C3%A1klady_kryptografie_(symetrick%C3%A9,_asymetrick%C3%A9_%C5%A1ifrov%C3%A1n%C3%AD)"/>
				<updated>2014-02-20T06:44:57Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//Detaily viz PPA 11, 12, 13&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reprezentace grafu ==&lt;br /&gt;
&lt;br /&gt;
'''Seznam sousednosti''' - každý vrchol má seznam svých sousedů. Je-li graf neorientovaný, hrany jsou v seznamech dvakrát&lt;br /&gt;
&lt;br /&gt;
'''Matice sousednosti''' - matice v * v, kde v je pořet vrcholů, a v ní jsou '1' tam, kde je hrana. Na diagonále jsou smyčky, případně ohonocení vrcholů. Pro neorientovaný hraf je matice symetrická.&lt;br /&gt;
&lt;br /&gt;
Graf může mít v*v-1 hran, podle očekávaného počtu se tedy rozhodneme, kterou možnost zvolíme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dijkstrův algoritmus ==&lt;br /&gt;
&lt;br /&gt;
= algoritmus pro hledání nejkratší cesty v ohodnoceném hrafu grafu.&lt;br /&gt;
&lt;br /&gt;
- hrany mají kladné hodnocení&lt;br /&gt;
&lt;br /&gt;
- většinou se bavíme o neorientovaném grafu, funguje však i pro orientované&lt;br /&gt;
&lt;br /&gt;
- probírán 1000x, takže jen opakování:&lt;br /&gt;
&lt;br /&gt;
Máme ohodnocený graf a dva vrcholy, u a v, a hledáme cestu z u do v&lt;br /&gt;
&lt;br /&gt;
Začneme v u, a tomu přiřadíme vzdálenost 0&lt;br /&gt;
&lt;br /&gt;
Podíváme se na všechny okolní body všech již označených bodů&lt;br /&gt;
&lt;br /&gt;
Posuneme se na ten, který má nejkratší vzdálenost od u (tedy musíme do vzdálenosti připočítat i vzdálenost předchozího bodu od počátku. Tohle je extrémně důležité, protože jinak bychom nalezli MST (konkrétně primův algoritmus), a tomu přiřadíme vzdálenost odpovídající součtu vzdálenosti předchozího bodu (od u) a délky cesty tohoto bodu od jeho předchůdce.&lt;br /&gt;
&lt;br /&gt;
Opakujeme 3 a 4, dokud nenalezneme cílový bod v.&lt;br /&gt;
&lt;br /&gt;
kombinace BFS (pro zjištění všech okolních nejkratších cest) a DFS (pro posun po prvcích). Algoritmus zastaví, pokud najde žádanou cestu.&lt;br /&gt;
&lt;br /&gt;
'''Implementace'''&lt;br /&gt;
&lt;br /&gt;
tabulkou, kdy ke každému vrcholu zapisujeme vzdálenosti, vybíráme v každé řádce nejmenší a tu označíme. Vyhledávání minima by bylo však O(v) (projdeme všechny sousedy vrcholu a hledáme nejbližší) pro všechny hrany, tedy celkem O(v2)&lt;br /&gt;
&lt;br /&gt;
jinak, například pomocí prioritní fronty s možností úpravy. všechny nalezené a neoznačené okolní vrcholy umístíme do prioritní fronty s prioritou jejich vzdálenosti (opět jde o součet délky cesty do předchozího bodu a délky cesty od předchozího bodu do vkládaného bodu), vybereme zepředu fronty, ten prvek označíme, zapamatujeme si, odkud jsme na něj přišli pro pozdější rekonstrukci cesty, a vložíme jeho okolní vrcholy. pokud již ve frontě jsou, upravíme jejich prioritu, je li to nutné. Složitost, pokud je fronta implementována haldou, je O(h + v log v), h protože procházíme všechny hrany a v log v protože pro každý vrchol musíme haldu obnovit. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Floyd-Warshallův algoritmus ==&lt;br /&gt;
&lt;br /&gt;
= algoritmus pro hledání nejkratší cesty pro všechny páry (u, v) v grafu.&lt;br /&gt;
&lt;br /&gt;
- Rychlejší, než Dijsktra pro všechny výchozí body (Dijsktra najde od zadaného vrcholu všechny nejkratší cesty, pokud jej na cílovém vrcholu nezastavíme), pokud je graf hustý (tedy hran je v2) -&amp;gt; Dijsktra by byl (pomocí haldy) O(h + v log v), tedy O(v2 + v log v), tedy horší než v3, při implementaci polem dokonce v4&lt;br /&gt;
&lt;br /&gt;
- Složitost O(v3)&lt;br /&gt;
&lt;br /&gt;
'''Algoritmus'''&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Floyd-warshall-1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Pracuje s maticí sousednosti w, kde jsou hrany označeny jejich délkou (cenou, vzdáleností, ...) a nehrany označeny nekonečnem.&lt;br /&gt;
d je matice aktuálne spoctených nejkratších vzdáleností&lt;br /&gt;
mezi je matice nejkratších mezicest, je nainicializována na -1 (null)&lt;br /&gt;
&lt;br /&gt;
V každém kroku algoritmu zjištuji, jestli existuje mezi vrcholy i,j kratší cesta pres vrchol k, pokud ano, nastavím vzdálenost v d[i][j] na novou velikost a do mezi[i][j] zaznamenám vrchol k. V podstatě procházím všechny buňky matice D v kříži, který protíná prvek (i, j). Pokud jsem dříve nalezl optimální cestu do bodu, je tato cesta ideální, pokud neexistuje cesta přímá. (Víme, že v bodě D[i,j] jsou na začátku všechny hrany. Může se ale stát, že existuje kratší cesta přes jiný vrchol, než po hraně v matici sousednosti. Kde tu cestu najdu? Buď končí ve vrcholu i, nebo ve vrcholu j, každopáně bude v řádce j, nebo sloupci i. a jde přes jiný vrchol. Pokud tedy znám cesty z tohoto vrcholu do ostatních vrcholů, můžu najít cestu z vrcholu i do jiného, třeba x, a z x do j tak, že délka z i -&amp;gt; x + x -&amp;gt; j je kratsí, než doposud nalezená nejkratší cesta)&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Floyd-warshall-2.jpg]] &lt;br /&gt;
&lt;br /&gt;
i = 3, j = 4, tedy cesta z i do j. V matici sousednosti byla 10, ale pokud půjdeme z vrcholu 4 do vrcholu 1 a z něj do vrcholu 3, tato cesta bude kratší (9 &amp;lt; 10). Do matice mezi si tedy uložíme vrchol 1 a v matici D (tato) změníme délu nejlepší cesty z i do j na 9 (tmavomodré pole)&lt;br /&gt;
&lt;br /&gt;
// Nechápu, proč je to v přednáškách vysvětleno tak přes ruku. Vždycky. Stačí vždy jen říct jak a proč, a je to hned jasné. Výpis programu v polopascalovskym kodu nikdo nechápe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prim-Jarníkův algoritmus ==&lt;br /&gt;
&lt;br /&gt;
= algoritmus pro řešení úlohy minimal spanning tree (MST), tedy problému, kdy pro zadaný graf ((ne)orientovaný, ohodnocený) hledáme kostru (strom), která bude mít nejmenší možné celkové ohodnocení (součet ohodnocení hran bude minimální)&lt;br /&gt;
&lt;br /&gt;
- užití - nejlevnější spojení všech uzlů grafu (elektrifikace domů, stavění silnic po povodni, ...). Nejkratší vzdálenost od elektrárny nemusí nutně být nejlepší (pokud je na mapě kratší vzdálenost, ale v cestě je hora, určitě to není nejlepší řešení)&lt;br /&gt;
&lt;br /&gt;
= hledáme pro každá vrchol nejkratší cestu ke stromu&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; neplést si Dijktrou, ten také hledá nejkratší cestu, ale z výchozího vrcholu&lt;br /&gt;
&lt;br /&gt;
Obrázek naznačí rozdíl:&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Prim-jarnik.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dijsktra použije hranu 4-&amp;gt;5, protože pak bude vždálenost 5 od 1 = 4 ( s hranou 3 -&amp;gt; 5 by byla 5)&lt;br /&gt;
Prim použije hranu 3-&amp;gt;5, protože je levnější, než hrana 4 -&amp;gt; 5, a tedy hodnota stromu je 7, což je menší než 8.&lt;br /&gt;
&lt;br /&gt;
Tím je vlastně i popsán algoritmus. Je podobný jako Dijsktra, ale v bodě 4 kontrolujeme pouze váhu hrany, níkoliv součet cesty do předchozího bodu a váhy. Implementace je stejná, řadíme podle vah hran (opět ignorujeme předchozí cesty)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Základy kryptografie ==&lt;br /&gt;
&lt;br /&gt;
Šifrujeme, protože nechceme, aby třetí osoba věděla, o co se jedná&lt;br /&gt;
&lt;br /&gt;
ochrana citlivých přenášených dat&lt;br /&gt;
&lt;br /&gt;
ochrana před odposlechem&lt;br /&gt;
&lt;br /&gt;
ochrana před neautorizovaným přístupem&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
'''Šifrování''' = transformace dat do nečitelné podoby&lt;br /&gt;
&lt;br /&gt;
'''Dešifrování''' = zpětný proces rekonstrukce šifrované zprávy pomocí tajného klíče&lt;br /&gt;
&lt;br /&gt;
'''Kryptografie''' - věda o tvorbě šifer&lt;br /&gt;
&lt;br /&gt;
'''Kryptoanalýza ''' - věda o prolamování šifer (nejjednodušší: frekvenční analýza. Anglické texty obsahují velké množství výskytů slova THE, můžeme tedy dedukovat, že nejčastější 3 písmenná slova substitučně šifrovaného textu jsou právě THE (například PQX), a můžeme tyto písmena použít (T-&amp;gt;P, H-&amp;gt;Q, E-&amp;gt;X)&lt;br /&gt;
&lt;br /&gt;
'''Dělění'''&lt;br /&gt;
&lt;br /&gt;
[[Z hlediska zpracování zprávy:]] &lt;br /&gt;
&lt;br /&gt;
''Blokové šifry'' - pracují s celými bloky dat  (obvykle  8-128 bytů)&lt;br /&gt;
&lt;br /&gt;
''Proudové šifry (streamové)'' - pracují s jednotlivými bitu zprávy zvlášť, jsou považovány za méně bezpečné, jsou pomalejší než šifry blokové&lt;br /&gt;
&lt;br /&gt;
[[Z hlediska šifrování:]]&lt;br /&gt;
&lt;br /&gt;
''Symetrické šifry'' - odesilatel i příjemce sdílí jedno tajemství (klíč) nutné k šifrování a zašifrování zprávy&lt;br /&gt;
&lt;br /&gt;
''Asymetrické šifry'' - odesilatel a příjemci šifrují a dešifrují zprávu různými klíči, nemusí spolu sdílet žádné tajemství. Nevýhoda:  je o několik řádů pomalejší než symetrická kryptografie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Symetricky'''&lt;br /&gt;
&lt;br /&gt;
Je nejpoužívanějším typem šifrovacího algoritmu&lt;br /&gt;
&lt;br /&gt;
Používá stejný šifrovací klíč k šifrování i dešifrování- což je jeho největší slabina&lt;br /&gt;
&lt;br /&gt;
Je velmi rychlý a používá se při velkém množství dat&lt;br /&gt;
&lt;br /&gt;
Klíč se musí dostat od odesilatele k adresátovi bezpečným kanálem (cestou), aby adresát mohl zprávu dešifrovat. Často osobní předání.&lt;br /&gt;
Pokud takový bezpečný kanál existuje, je často jednodušší zprávu nešifrovat a poslat ji rovnou tímto kanálem. &lt;br /&gt;
&lt;br /&gt;
Příklady: AES (ve wifi, je nutné fyzicky zadat klíč do zařízení i do pořítače), A5 (v mobilních telefonech, klíč je na SIM a u uperátora) a DES (nejpoužívanější šifra na světě)&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Symetricke-sifrovani.jpg]] &lt;br /&gt;
&lt;br /&gt;
'''Nesymetricky'''&lt;br /&gt;
&lt;br /&gt;
Používá jiný klíč k zašifrování a jiný klíč zpátky k dešifrování&lt;br /&gt;
&lt;br /&gt;
První z nich se nazývá veřejný, ostatní ho musejí znát. Druhý klíč se nazývá privátní&lt;br /&gt;
&lt;br /&gt;
Asymetrický šifrovací systém (systém s veřejným klíčem) je založen na principu jednocestné funkce, což jsou operace, které lze snadno provést pouze v jednom směru: ze vstupu lze snadno spočítat výstup, z výstupu však je velmi obtížné nalézt vstup. &lt;br /&gt;
Nejběžnějším příkladem je například násobení: je velmi snadné vynásobit dvě i velmi velká čísla, avšak rozklad součinu na činitele (tzv. faktorizace) je velmi obtížný. (Na tomto problému je založen např. algoritmus RSA.)&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Asymetricke-sifrovani.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Komprese_dat,_rozd%C4%9Blen%C3%AD_kompresn%C3%ADch_metod,_princip_kompresn%C3%ADch_metod_(Huffmann,_aritmetick%C3%A9_k%C3%B3dov%C3%A1n%C3%AD,_LZW,_JPG,_frakt%C3%A1lov%C3%A1_komprese)</id>
		<title>Komprese dat, rozdělení kompresních metod, princip kompresních metod (Huffmann, aritmetické kódování, LZW, JPG, fraktálová komprese)</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Komprese_dat,_rozd%C4%9Blen%C3%AD_kompresn%C3%ADch_metod,_princip_kompresn%C3%ADch_metod_(Huffmann,_aritmetick%C3%A9_k%C3%B3dov%C3%A1n%C3%AD,_LZW,_JPG,_frakt%C3%A1lov%C3%A1_komprese)"/>
				<updated>2014-02-20T06:44:46Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Algoritmy pro kompresi dat používáme pro snížení velikosti přenášených dat&lt;br /&gt;
* z paměťových důvodů&lt;br /&gt;
* ušetření šířky pásma&lt;br /&gt;
* urychlení přenosu a zkrácení doby odezvy&lt;br /&gt;
* archivace dat, zálohy&lt;br /&gt;
* obrana proti virům&lt;br /&gt;
* distribuce software&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
'''Kvalita komprese''' - úrověň zmenšení, poměr komprese = před/po. Symetrické metody potřebují stejný čas ke komprimaci jako k dekomprimaci&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rozdělení kompresních metod ==&lt;br /&gt;
&lt;br /&gt;
* '''Bezztrátová''' - po komprimaci a dekomprimaci je výsledek k nerozeznání od originálu, 100% shoda. Metody jsou méně efektivní. Použijeme na text, obecné soubory&lt;br /&gt;
* '''Ztrátová''' - po komprimaci a dekomprimaci je výsledek rozdílný, cílem je však aby byl co nejvíce podobný. Více efektivní. Použijeme na zvuk, obraz, video.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metody komprese ==&lt;br /&gt;
&lt;br /&gt;
* '''Jednoduché''' - založené na kódování opakujících se posloupností znaků (Run-Length Encoding - RLE)&lt;br /&gt;
* '''Statistické''' - založené na četnosti výskytu znaků v komprimovaném souboru (Huffmanovo kódování, Aritmetické kódování)&lt;br /&gt;
* '''Slovníkové''' - založené na kodování všech vyskytujících se posloupností (Lempel-Ziv-Welch - LZW)&lt;br /&gt;
* '''Transformační''' - založené na ortogonálních popř. jiných transformacích (JPEG, waveletová komprese, fraktálová komprese)&lt;br /&gt;
&lt;br /&gt;
== RLE ==&lt;br /&gt;
&lt;br /&gt;
RLE (Run Length Encoding) – kódování délkou běhu&lt;br /&gt;
&lt;br /&gt;
Nejjednodušší komprimační algoritmus, nahrazuje opakující se znaky jedním znakem a číslem vyjadřujícím počet okpakování (AAAAABBBBBCCD -&amp;gt; 5A5B2C1D)&lt;br /&gt;
Pro text k ničemu, pro obraz celkem dobrá komprese (zvláště obrazy používající malou paletu barev)&lt;br /&gt;
Problém: pokud se znak neopakuje, dochází k expanzi (ABC -&amp;gt; 1A1B1C) - Řešení pomocí escape sekvencí (označíme si, co je délka a co ne) a poté komprimujeme pouze opakující se znaky. Escape znak nesmí být obsažen v původním textu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Komprese-rle.png|frame|center|Ukázka komprese bitového souboru pomocí RLE. Ukládáme vždy počet nul a jedniček v řadě.]]&lt;br /&gt;
&lt;br /&gt;
== Huffmanovo kódování ==&lt;br /&gt;
&lt;br /&gt;
Statistická metoda. Vyhledáme četnosti všech znaků v řetězci a tyto znaky podle četnosti zakódujeme tak, aby nejkratší kód odpovídal nejčastějšímu znaku. Kódy jsou binární, nejčastější znak bude tedy reprezentován 1 bitem na rozdíl od 8(16) bitů potřebných pro uložení ASCII(UTF) znaku. Jená se o prefixový kód, takže žádný znak není prefixem jiného znaku -&amp;gt; kódy pro jednotlivé znaky mají různou délku a není potřeba označovat jejich konec (každý znak kreprezentuje jeden list stromu).&lt;br /&gt;
&lt;br /&gt;
Kódy vytvoříme Huffmannovým stromem:&lt;br /&gt;
&lt;br /&gt;
* Jednotlivé znaky označíme jako listy stromu&lt;br /&gt;
* Tyto listy uložíme do seznamu S (S obsahuje uzly stromu, na začátku tedy pouze listy)&lt;br /&gt;
* Seznam S seřadíme podle četnosti&lt;br /&gt;
* Vybereme z S dva prvky M,N s nejnižšími četnostmi m, n, m &amp;lt; n&lt;br /&gt;
* Vytvoříme uzel p, kde vlevo je M a vpravo je N, a jeho četnost bude m+n&lt;br /&gt;
* Vložíme p do S a zpět na bod 3 dokud v S není jen jeden uzel&lt;br /&gt;
&lt;br /&gt;
Strom samozřejmě musíme přenášet spolu s komprimovanými daty. Strom můžeme reprezentovat řetězcem tak, že jej projdeme DFS algoritmem a pro haždý vrchol uložíme 0 a pro každý list 1 a znak tohoto listu. Při načítání čteme nuly a vytváříme uzly (směrem doleva). Pokud narazíme na 1, zapíšeme písmeno a vrátíme se do nejbližšího pravého uzlu (pravý uzel rodiče, případně nejvíce levý prvek podstromu - u rodiče vpravo)&lt;br /&gt;
&lt;br /&gt;
Při dekompresi procházíme strom a rekonstruujeme zprávu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Huffman.png]]&lt;br /&gt;
&lt;br /&gt;
== Aritmetické kódování ==&lt;br /&gt;
&lt;br /&gt;
Také statistická metoda. &lt;br /&gt;
Aritmetické kódování na rozdíl od jiných metod nepracuje na principu nahrazování vstupního znaku specifickým kódem. Místo toho se kódovaný vstupní proud znaků nahradí jediným reálným číslem z intervalu &amp;lt;0,1).&lt;br /&gt;
&lt;br /&gt;
Na základě pravděpodobnosti výskytu jednotlivých symbolů vstupní abecedy je každému symbolu přiřazena odpovídající poměrná část intervalu &amp;lt;0,1). Při kódování je pak celý interval &amp;lt;0,1) postupně omezován z obou stran na základě postupně přicházejících symbolů (Interval ořízneme jen na tu část, které odpovídá pravděpodovnost písmene v textu, a tento interval opět rozdělíme podle pravděpodobností pro další písmeno). &lt;br /&gt;
&lt;br /&gt;
Kódovaná hodnota se reprezentuje libovolným reálným číslem, které leží ve výsledném intervalu získaném po přečtení všech vstupních symbolů. Vzhledem k tomu, že z takto reprezentované hodnoty nelze při dekódování určit konec zprávy, je třeba navíc ke zprávě přidat zpeciální znak označující konec, případně musí být uložena i délka původní posloupnosti. &lt;br /&gt;
&lt;br /&gt;
Příklad: kódujeme zprávu 'abaabcda'&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Aritmeticke-kodovani.jpg]] &lt;br /&gt;
&lt;br /&gt;
Co z toho číst?&lt;br /&gt;
* První řádka ukazuje pravděpodovnosti písmen (ty vypočteme jako četnost písmene / písmen celkem)&lt;br /&gt;
* Dále vidíme, jak bude interval (a podintervaly) rozdělený. 'a' jako nejpravděpodobnější písmeno dostane největší část intervalu atd...&lt;br /&gt;
* A dále už kódujeme. Jdeme zleva do prava. Přijde písmeno 'a', vybereme tedy spodní interval. Tento opět rozdělíme na stené části jako interval původní a přijde 'b'. Opět vybereme odpovídající interval, který rozdělíme atd.&lt;br /&gt;
* Zvýrazněná část intervalu se na obrázku vždy zazoomuje ;) (jsou tam šipky).&lt;br /&gt;
* Na konci máme jen jeden interval, vybereme tedy číslo , které do něj patří. Zpráva je zakódována v desetinné části tohoto čísla (a ano, celá zpráva je reprezentována jedním číslem)&lt;br /&gt;
&lt;br /&gt;
== LZW ==&lt;br /&gt;
&lt;br /&gt;
Z přednášek, doplněno:&lt;br /&gt;
Slovníkový algoritmus. Využívá skupin znaků označených kódy a přenos kódů, které mají menší velikost než původní skupiny.&lt;br /&gt;
Princip:&lt;br /&gt;
Jednoprůchodová metoda (nevyžaduje předběžnou analýzu souboru. Ve výsledku se jen posunujeme po souboru jedním ukazatelem.)&lt;br /&gt;
Vyhledávání opakujících se posloupností znaků, ukládání těchto posloupností do slovníku pro další použití a přiřazení jednoznakového kódu těmto posloupnostem.&lt;br /&gt;
Kódy musí mít délku (počet bitů) větší než délka původních znaků (např. pro ASCII znaky (8 bitů) se obvykle používá délka kódu 12 bitů popř. větší. Na osmi bitech kódu by se dal uložit pouze slovník o 256 slovech(posloupnostech znaků), což odpovídá pouze počtu písmen, což je k ničemu.)&lt;br /&gt;
Při průchodu komprimovaným souborem se vytváří slovník (počet položek slovníku odpovídá hodnotě 2(počet bitů kódu), kde prvních 2(počet bitů původních znaků) položek jsou  znaky původní abecedy a zbývající položky tvoří posloupnosti znaků obsažené v komprimovaném souboru (používáme tedy i kódy z již komprimovaného souboru k vytvýření nových kódů).&lt;br /&gt;
Při dekompresi procházíme kódy, a podle tabulky je rozebíráme na menší a menší, až se dostaneme na elementární znaky, které vypíšeme.&lt;br /&gt;
&lt;br /&gt;
Aby to celé fungovalo, musíme slovník na dekomprimační straně &amp;quot;naučit&amp;quot; slova od menších po větší. Musíme proto na začátku souboru definovat elementární znaky, a z nich poté skládat slovník. Pro ASCII tedy prvních 256 znaků tabulky může odpovídat 1:1 ASCII abecedě, až poté následuje slovník. Pokud při dekompresi narazíme na neznámý kód, víme, že je složen z předchozích 2 kódů. Proto se jej naučíme, a příště už víme, co zapsat (případně jak jej rozložit). Tabulka na obou stranách tedy je stavěna stejně, jen používána z jiné strany (při komprimaci ukládáme kódy, pri dekomprimaci jejich znaky)&lt;br /&gt;
&lt;br /&gt;
Pro obrázky viz přednášky z PT, jsou celkem snadno pochopitlené, i když místo &amp;quot;kód&amp;quot; občas autor používá &amp;quot;znak&amp;quot; či &amp;quot;nový znak&amp;quot;, což je trochu matoucí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JPG ==&lt;br /&gt;
&lt;br /&gt;
V současné době patří mezi nejvíce používané komprese u obrázků&lt;br /&gt;
Je vhodná pro komprimaci fotek, nevhodná pro např. technické výkresy (čarové výkresy) - dochází k viditelnému rozmazání (na webové aplikace pomalu převlédá png (zejména kvůli neztrátovosti a průhlednosti))&lt;br /&gt;
&lt;br /&gt;
Princip:&lt;br /&gt;
části obrazu se transformují do frekvenční oblasti (výsledkem je matice „frekvenčních“ koeficientů, bezztrátový převod)&lt;br /&gt;
z matice koeficientů se odstraní koeficienty odpovídající vyšším frekvencím ( rychlejší změny jasu - např. hrany v obraze, zde jsou ztáty)&lt;br /&gt;
zbývající koeficienty se vhodným způsobem zkomprimují (huffman, aritmeticky)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Jpg-1.jpg]]&lt;br /&gt;
[[Soubor:Jpg-2.jpg]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fraktálová komprese ==&lt;br /&gt;
&lt;br /&gt;
Fraktál je obraz, který je matematicky popsatelný a tím jej lze libovolně přibližovat a oddalovat bez stráty informace. Také lze fraktál popsat jako soubor matematicky popsaných sebepodobných částí, jejichž spojováním dostáváme také sebepodobný obraz ve větším detailu (jako když děláme koláž z fotek, které dohromady a z dálky vypadají jako fotka)&lt;br /&gt;
&lt;br /&gt;
Toho lze využít pro kompresi. Pokud se podíváme na libovolný obrázek, často zjistíme, že některé jeho části jsou si podobné&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Fraktalova-komprese.jpg]]&lt;br /&gt;
&lt;br /&gt;
Tyto malé kousky (frakce) lze pomocí rotace, změny velikosti a posunu otočit tak, že si budou velmi podobné (nebo dokonce budou stejné). V obrazu tedy můžeme na takový kousek mít pouze jednu, a v ostatních výskytech pouze uložit tyto operace.&lt;br /&gt;
&lt;br /&gt;
V praxi obrázek rozřežeme na shluky 2x2 pixely (range bloky), a pak hledáme, kde jinde v obrazu je můžeme najít (domain bloky). Domain bloky se mohou překrývat, range bloky se nepřekrývají. Postupujeme tak, že Domain blok vytvoříme jako dvojnásobek range bloku, a v obrazu postupujeme zleva do prava. V bloku uděláme průměr hodnot pixelů pod ním tak, abychom získali blok velikosti range bloku, a poté hledáme, kterému range bloku je takto zmenšený domain blok podobný. Uložíme si operace, které s domainblokem musíme udělat, aby byl range bloku podobný (rotace, překlopení, posun...) Pokud je domainblok složen z domainbloků, postupujeme rekurzivně. Tím, pomocí podobnosti, získáme komprimovaný obraz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Algoritmy_zpracov%C3%A1n%C3%AD_text%C5%AF_%E2%80%93_operace_s_%C5%99et%C4%9Bzci,_porovn%C3%A1n%C3%AD_se_vzorem_(KMP,_Boyer-Moore_algoritmus),_nejdel%C5%A1%C3%AD_spole%C4%8Dn%C3%BD_pod%C5%99et%C4%9Bzec_(LCS_algoritmus),_vzd%C3%A1lenost_mezi_%C5%99et%C4%9Bzci,_datov%C3%A1_struktura_Trie_a_pou%C5%BEit%C3%AD</id>
		<title>Algoritmy zpracování textů – operace s řetězci, porovnání se vzorem (KMP, Boyer-Moore algoritmus), nejdelší společný podřetězec (LCS algoritmus), vzdálenost mezi řetězci, datová struktura Trie a použití</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Algoritmy_zpracov%C3%A1n%C3%AD_text%C5%AF_%E2%80%93_operace_s_%C5%99et%C4%9Bzci,_porovn%C3%A1n%C3%AD_se_vzorem_(KMP,_Boyer-Moore_algoritmus),_nejdel%C5%A1%C3%AD_spole%C4%8Dn%C3%BD_pod%C5%99et%C4%9Bzec_(LCS_algoritmus),_vzd%C3%A1lenost_mezi_%C5%99et%C4%9Bzci,_datov%C3%A1_struktura_Trie_a_pou%C5%BEit%C3%AD"/>
				<updated>2014-02-20T06:44:36Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tak tahle otázka je očistec. Kdo tohle všechno vysvětlí za 15 minut je borec, i když bych řekl, že je tam rozsekaj na menší otázky.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Obecně ==&lt;br /&gt;
&lt;br /&gt;
Vyhledáváme podřetězec P v řetězci T. T je string s textem, P je string s maskou (pattern)&lt;br /&gt;
&lt;br /&gt;
Podřetězec je část řetězce [i..j]. T je délky n, P je délky m.&lt;br /&gt;
&lt;br /&gt;
Prefix je část řetězce (či podřetězce) od začátku, suffix je část řetězce (či podřetězce) od konce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brutální síla ==&lt;br /&gt;
&lt;br /&gt;
Indexem jdeme po T a kontrolujeme, jestli podřetězec začínající na tomto indexu neodpovídá P (tedy kontrolujeme m prvků od indexu směrem do prava.&lt;br /&gt;
V nejhorším případě O(nm), což je pomalé&lt;br /&gt;
&lt;br /&gt;
	T: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah&lt;br /&gt;
&lt;br /&gt;
	P: aah&lt;br /&gt;
&lt;br /&gt;
	P v T najdeme až úplně na konci, pro každé 'a' v T (kromě třetího od konce) znovu hledáme písmena P v řetězci T zcela zbytečně&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boyer-Moore (BM) algoritmus ==&lt;br /&gt;
&lt;br /&gt;
V tomto algoritmu prohledáváme P od konce, a hledáme výskyt v T. Do T ukazuje index i, do P index j.&lt;br /&gt;
&lt;br /&gt;
Mohou nastat 4 případy:&lt;br /&gt;
&lt;br /&gt;
1) T[i] není v P vůbec, posuneme i dále o délku P (zarovnáme P na další písmeno v T, tedy T[i+1]&lt;br /&gt;
&lt;br /&gt;
(obrázky v přednáškách jsou křivé, tak se mi to snad povedlo odstranit)&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Boyer-moore-1.jpg]]&lt;br /&gt;
&lt;br /&gt;
2) T[i] odpovídá P[j] - posuneme se v obou do leva a opakujeme (jako v brutální síle)&lt;br /&gt;
&lt;br /&gt;
3) T[i] není P[j], ale T[i] je v P před indexem j -&amp;gt; zarovnáme P do prava tak, aby T[i] odpovídal jeho výskytu v P a opakujeme&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Boyer-moore-2.jpg]] &lt;br /&gt;
&lt;br /&gt;
4) T[i] není P[j], ale T[i] je v P za indexem j -&amp;gt; posuneme se do prava o 1 a opakujeme (nemůžeme se vracet, ale ani posunout o více dále)&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Boyer-moore-3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Pokud nalezneme celý pattern, vrátíme i. Algoritmus je pro texty rychlejší, než brute force, i tak je však jeho složitost O(mn + A), kde A je velikost abecedy. Pro velké abecedy funguje rychle, ale např pro binární soubory funguje pomalu.&lt;br /&gt;
&lt;br /&gt;
'''Dodatek:''' Algoritmus si v preprocesingu zjistí, na které pozici má které písmena (směrem od leva). Je-li patern tedy například &amp;quot;ABRAKADABRA&amp;quot;, A dostane index 10, B dostane index 8, K = 4, D = 6 a R = 9. Pro ostatní písmena přiřadíme -1. Naimplementujeme tedy funkci Last(char input), která podle písmene vrátí tento index, a pak pro případy 3 a 4 porovnáváme Last(T[i]) a j, a tím pak víme, jestli i posunout na Last(T[i]) (pokud je Last(T[i]) &amp;lt; j) nebo pouze i++&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Knuth‐Morris‐Pratt (KMP) algoritmus ==&lt;br /&gt;
&lt;br /&gt;
Jako brutal force jde zleva do prava, ale nedělá otrocky všechny porovnání. Pokud narazíme na neshodu, je možné se posunout o více než o jedno písmeno. &lt;br /&gt;
&lt;br /&gt;
Otázka zní o kolik?&lt;br /&gt;
&lt;br /&gt;
Odpověď, o maximální prefix P( 0 .. j-1 ), který je suffixem P( 1 .. j-1 ). Suffix a prefix se nesmí překrývat.&lt;br /&gt;
&lt;br /&gt;
Proč? Protože najdeme-li kus P (od začátku, tedy prefix), víme, že znaky tohoto prefixu odpovídají textu. Je tedy netřeba je kontrolovat znovu. Může se ale stát, že konec nalezeného podřetězce je také obsažen v začátku tohoto podřetězce. Takovou shodou je samozřejmě celá nalezená část P, proto hledáme od P+1. Takže jdeme od konce nalezeného kusu P zleva a zprava, a ve chvíli, kdy nenalezneme shodu, víme, o kolik se můžeme posunout. Tohle se samozřejmě dá předpočítat do tabulky, a pak je vše O(1)&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Kmp.jpg]]&lt;br /&gt;
&lt;br /&gt;
(i.e. P[j] != T[i]), pak&lt;br /&gt;
k = j‐1;&lt;br /&gt;
j = F(k); // získání nové hodnoty j, kde F(k) je právě předpočítaná tabulka společných částí P&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Trie ==&lt;br /&gt;
&lt;br /&gt;
Trie je struktura pro předspracování textu pro pozdější rychlé vyhledávání. V každém uzlu standartní Trie je písmeno a délka cesty k vrcholu je také pozicí písmene ve slově, tedy je-li hloubka písmene 'E' v Trie rovna 3, víme, že je to třetí písmeno (např. slova Trie)&lt;br /&gt;
&lt;br /&gt;
Standartní trie má v každém uzlu právě jedno písmeno. Vyhledávání je O(d * m) kde d je velikost abecedy (v každém uzlu musíme projít všechna písmena, abychom zjistili, že tam písmeno je), m je délka slova. Paměťově je Trie nejvýše složitosti O(n) kde n je délka původního textu. Pokud se slova překrývají, paměťi je potřeba méně.&lt;br /&gt;
&lt;br /&gt;
Rychlost se dá na úkor paměti vylepšit tak, že v každém uzlu připravíme celou abecedu a při hledání převedeme písmeno na index v této abecedě, tím pádem záskáme v O(1) čase pointer na další písmeno ve slově.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Komprimovaná trie ==&lt;br /&gt;
&lt;br /&gt;
Jako trie, ale sklukujeme, tedy ve vrcholech stromu písmena, která jsou společná pro všechna slova, tedy pro slova 'ahoj' a 'ahojky' bude mít trie 2 vrcholy, 'ahoj' a pod ním 'ahojky'. Tuto Trie lze převést na standartní pouhým rozdělením shluků, standartní Trie převedeme na kompaktní sloučením vrcholů s rodiči, kteří mají pouze jeden odkaz na vrchol (tento vrchol)&lt;br /&gt;
&lt;br /&gt;
Pak je ještě suffixová Trie, které ukládá všechny sufixy slov, v komprimované podobě. Umožňuje vyhledávat i uprostřed slova.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LCS - Longest common subsequence ==&lt;br /&gt;
&lt;br /&gt;
Tohle je skoro nemožný vysvetlit na statickym papiru....&lt;br /&gt;
&lt;br /&gt;
Cílem algoritmu je najít nejdelší společný podřetězec libovolného počtu řetězců. To je problém NP-těžký, což je masakr. &lt;br /&gt;
My se ale omezíme na porovnávání 2 řezězců, což je v polynomiálním čase řešitelné (dynamicky).&lt;br /&gt;
&lt;br /&gt;
Brutální síla by dělala to, že by našla všechny podřetězce obou řetězců, a ty porovnávala (také brutální silou) Podřetězců je však řekněme n!, brutální síla je n2, takže (n!)2. Dynamicky to lze dělat rychleji. Použijeme tedy rovnou dynamické programování, protože to nám dovoluje pamatovat si so už jsme našli, a neztrácet čas znovuobjevováním nalezeného.&lt;br /&gt;
&lt;br /&gt;
Nechť Li,j = maximální délka společných řetězců končících v Ai a Bj . Vytvoříme si tedy dvojrozměrnou tabulku, do které si tyto Li,j budeme zapisovat.&lt;br /&gt;
&lt;br /&gt;
Nyní, je-li písmeno na pozici i v řetězci A stejné, jako písmeno na pozici j v řetezci B, víme, že jde o společný podřetězec (délky 1). Nevíme však, zda předchozí písmena nebyla také podřetězcem (zatím)&lt;br /&gt;
&lt;br /&gt;
Víme ale následující: Pokud existoval pořetezec pro indexy i-1 a j-1 (tedy pro předchozí písmena v obou řetězcích), bude v tabulce na příslušné pozici, tedy vlevo nahoře od Li,j tedy  Li-1,j-1. Na této pozici je tím pádem dosavadně nalezená délka společného podřetězce, který končí na indexech i-1 a j-1. Pokud by i předchozí indexy daly stejné písmeno, musíme tuto délku dále diagonálně propagovat, a tedy&lt;br /&gt;
&lt;br /&gt;
Ai = Bj -&amp;gt; Li,j = Li-1,j-1 + 1 -&amp;gt; společný řetězec končící na indexu i-1,j-1 pokračuje&lt;br /&gt;
&lt;br /&gt;
Ai &amp;lt;&amp;gt; Bj -&amp;gt; Li,j = 0 -&amp;gt; není společný (pokud na i-1 a j-1 byl, na tomto indexu končí)&lt;br /&gt;
&lt;br /&gt;
Takto vyplníme celou tabulku, přičemž nulté řádky budou nulové (abychom nevyšli pro první písmena z hranice pole)&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Lcs.jpg]]&lt;br /&gt;
&lt;br /&gt;
Problém: Jak zjistit, kde je řešení nejlepší? Ano, můžeme najít maximum v tabulce, ale to je další O(M + N) operace, a máme tabulku plnou nul, toho lze využít. Algoritmus tedy modifikujeme tak, že bude zachovávat i dosavadně nejlepší nalezenou délku společného podřetězce v každém bodě. toho docílíme úpravou druhého pravidla, tedy&lt;br /&gt;
&lt;br /&gt;
Ai = Bj -&amp;gt; Li,j = Li-1,j-1 + 1&lt;br /&gt;
Ai &amp;lt;&amp;gt; Bj -&amp;gt; Li,j = max (Li-1,j, Li,j-1)&lt;br /&gt;
&lt;br /&gt;
Nejlepší nalezené řešení je nahoře, nebo vlevo. Tím se tabulka naplní, a my budeme znát nejlepší délku v pravém spodním rohu tabulky&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Lcs-2.jpg]] &lt;br /&gt;
&lt;br /&gt;
Nyní ale nevíme, kde ta písmena jsou. Je tedy nutné si to ukládat do druhé tabulky (onačit si, kudy jsme na které pole přišli, z leva, ze shora (při zpětném průchodu pouze posun), nebo šikmo (při zpětném průchodu výpis a posun)) a následně zrekonstruovat zpětným průchodem. V přednáškách jsou šipky, ukazující kudy se budeme vracet. Při provádění pravidla 2 si samozřejmě tuto informaci musíme také propagovat, pomatujeme si tedy, odkud jsme na každé pole přišli ( v druhé tabulce si to lze označit třeba 0, 1 pro nahoru a do leva, 2 pro šikmo )&lt;br /&gt;
&lt;br /&gt;
A konečně...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vzdálenost mezi řetězci ==&lt;br /&gt;
&lt;br /&gt;
'''Hammingova metrika:''' na stejně dlouhé řetězce, jen je porovnáme, a v O(n) čase víme, kolik změn písmen musíme provést (Auto, Zutá = 2)&lt;br /&gt;
&lt;br /&gt;
'''Levensteinova metrika:''' někdy také edit distance, máme operace změnit/přidat/odebrat písmeno, abychom dostali z jednoho řetězce ten druhý. Jde o celočíselné vyjádření podobnosti řetězců, například&lt;br /&gt;
&lt;br /&gt;
P=abcdefghijkl, T=bcdeffghixkl, P odpovídá T po 3 změnách (v T přidat a, ubrat f a zaměnit x za j)&lt;br /&gt;
&lt;br /&gt;
'''Algoritmus:'''&lt;br /&gt;
Postup podobný jako u LCS, ale&lt;br /&gt;
matice je D[i,j]&lt;br /&gt;
a prvky vyplňujeme takto &lt;br /&gt;
&lt;br /&gt;
máme 3 možné způsoby úpravy řetězce&lt;br /&gt;
&lt;br /&gt;
1. P[i]=T[j] , s = D[i-1,j-1] (shoda) jinak D[i-1,j-1] + 1 (substituce, platíme cenu za změnu znaku)&lt;br /&gt;
&lt;br /&gt;
2. v = D[i-1,j] + 1 (znak navíc v P, neposouváme pointer v T (při úpravách) a platíme cenu za vkládání)&lt;br /&gt;
&lt;br /&gt;
3. r = D[i,j-1] + 1 (znak navíc v T, neposouváme pointer v P (při úpravách) a platíme cenu za rušení)&lt;br /&gt;
&lt;br /&gt;
minimem z s, v a r  získáme pole D[i,j]&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Vzdalenost-mezi-retezci.jpg]]&lt;br /&gt;
&lt;br /&gt;
Řešení je opšt ve spodním pravém rohu a zpět postupujeme po stejných číslech (žádná změna) nebo menších (změna, jdeme-li šikmo, substituce, jdeme-li nahoru rušení, do leva vkládání)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Tabulky_s_rozpt%C3%BDlen%C3%BDmi_polo%C5%BEkami,_vyhled%C3%A1v%C3%A1n%C3%AD_v_tabulk%C3%A1ch</id>
		<title>Tabulky s rozptýlenými položkami, vyhledávání v tabulkách</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Tabulky_s_rozpt%C3%BDlen%C3%BDmi_polo%C5%BEkami,_vyhled%C3%A1v%C3%A1n%C3%AD_v_tabulk%C3%A1ch"/>
				<updated>2014-02-20T06:44:26Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To samé jako PPA2 14 a 15,&lt;br /&gt;
&lt;br /&gt;
jen doplňky/opakování/upřesnění:&lt;br /&gt;
&lt;br /&gt;
'''Vnitřní zřetězen'''í - synonyma (položky s kolizemi) se ukládají do volných míst&lt;br /&gt;
&lt;br /&gt;
'''Vnější zřetězení''' - synonyma se ukládají do seznamů pod klíči&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Otevřené rozptýlení - hash funkce ==&lt;br /&gt;
&lt;br /&gt;
Kolize:&lt;br /&gt;
&lt;br /&gt;
1) nedefinované chování při kolizi - nutno dodefinovat&lt;br /&gt;
&lt;br /&gt;
2) lineární posun - při kolizi vkládáme na první volné místo lineárně (na indexech 1,2,3,4 od původní polohy&lt;br /&gt;
&lt;br /&gt;
3) kvadratický posun - při kolizi hledáme první volné místo na indexech podle kvadratické funkce (vzdálenosti 1, 4, 9, 16...)&lt;br /&gt;
&lt;br /&gt;
4) opakovaný hash - hashovací fci použijeme víckrát pokud dojde ke kolizi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Uzavřené rozptýlení - přímé adresování ==&lt;br /&gt;
&lt;br /&gt;
metody 2) a 3) nejsou vhodné, vzniká shlukování (clustering), proto je dobré použít způsob 4) nebo lepší hash funkci&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tabulky s uzavřeným rozptýlením a vnějším zřetězením ==&lt;br /&gt;
&lt;br /&gt;
= kombinace obou&lt;br /&gt;
&lt;br /&gt;
- adresujeme přímo, při kolizi si ale do tabulky na konec uložíme, kam budeme vnitžně zřetězovat. Hash funkce tedy může být při kolizi (třeba náhodná), nebo tabulku rozdělíme na 2 části, jednu pro vyhledávání klíčů, a druhou pro ukládání synonym. ta už může být dynamicky alokovaná.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metoda rozptýlených indexů ==&lt;br /&gt;
&lt;br /&gt;
To co bylo v předchozím případě v tabulce vyjmeme, a vytvoříme vedle. Uděláme si mapu synonym (synonyma v seznamu pro každý klíč) a tyto pak ukazují na index do pole.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyhledávání ==&lt;br /&gt;
&lt;br /&gt;
Má samozřejmě smysl jen pokud nemáme orákulum (= hashovací fci). Pokud orákulum máme, není třeba hledat protože ideální orákulum vždy ví, kam se podívat pro správná data  (The all-knowing Oracle is never surprised. How can she be, she knows everything. -- The Matrix: Revolution), reálné ví aspoň kde hledat.&lt;br /&gt;
&lt;br /&gt;
Jelikož je při přímém adresování orákulum pouhý index do tabulky (mno, to moc orákulum není, orákulum vždy ví, kam jít, aby nebyla kolize), alespoň nám napoví odkud hledat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sekvenční:'''&lt;br /&gt;
&lt;br /&gt;
Hledáme klíč lineárně, pokud na něj narazíme, vrátíme hodnotu&lt;br /&gt;
&lt;br /&gt;
+ snadná implementace&lt;br /&gt;
&lt;br /&gt;
+ tabulka nemusí být uspořádaná&lt;br /&gt;
&lt;br /&gt;
- pomalé hledání&lt;br /&gt;
&lt;br /&gt;
'''Binární'''&lt;br /&gt;
&lt;br /&gt;
Jako sekvenční, ale klíče musí být seřazeny, a nad nimi vytvoříme BVS, tedy hledáme vždy v půlce intervalu&lt;br /&gt;
&lt;br /&gt;
+ rychlejší (O(log n))&lt;br /&gt;
&lt;br /&gt;
- nutnost udržovat tabulku seřazenou&lt;br /&gt;
&lt;br /&gt;
'''Fibonacciho'''&lt;br /&gt;
&lt;br /&gt;
Jako binární, ale nerozdělujeme  v polovině, ale podle Fibonacciho posloupnosti (tedy ne 1:1 -&amp;gt; 1:(1:1) -&amp;gt; 1:((1:1): 1) ale (1:1) -&amp;gt; (1:(1:2)) - &amp;gt; (1:((2:3):2))&lt;br /&gt;
&lt;br /&gt;
Prvky vybíráme jako dvojice, první z dvojice je ve Fibonacciho posloupnosti na pozici odpovídající úrovni vnožení stromu (výška větve, ve které hledáme)&lt;br /&gt;
&lt;br /&gt;
Fibonacciho ppst: a1 = 1, a2 = 1, ai = ai-1 + ai - 2 , tedy 1,1,2,3,5,8,13,21,34,55, ....&lt;br /&gt;
&lt;br /&gt;
'''Podle sekundárního klíče'''&lt;br /&gt;
&lt;br /&gt;
Jen pouze pokud sekundární klíč existuje v datech, např seznam jmen, jméno je primární (není, ale pro vysvětlení řekněme, že je) a rok je sekundární. Vyhledáme jména v sekundárním klíči a v nich pak hledáme jméno podle primárního klíče.&lt;br /&gt;
&lt;br /&gt;
Sekundární klíče máme v seznamu, který obsahuje seznam primárních klíčů zabulky pro každý sekundární klíč&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Skip-list_-_pou%C5%BEit%C3%AD_a_implementace</id>
		<title>Skip-list - použití a implementace</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Skip-list_-_pou%C5%BEit%C3%AD_a_implementace"/>
				<updated>2014-02-20T06:44:18Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Skiplist je alternativa ke stromům, která je snadno implementovatelná. Operace se skiplistem jsou podobné složitosti jako u stromů (O(n log n)), ale paměťová náročnost může být o něco větší.&lt;br /&gt;
&lt;br /&gt;
Skiplist si lze představit následovně: seznam, ve kterém některé prvky ukazují i na vzdálenější prvky než jsou prvky bezprostředně následující. Tyto ukazatele &amp;quot;přeskakují&amp;quot; položky seznamu, odtud skiplist.&lt;br /&gt;
&lt;br /&gt;
Maximální výška uzlu = Maxlevel, každý prvek může mít 1 &amp;lt;= k &amp;lt;= Maxlevel ukazatelů na další prvky&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Skip-list.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Popisky (obrázek je z přednášky):&lt;br /&gt;
* '''a)''' vidíme nejjednoduší skiplist se skokem 1, tedy lineární spojový seznam&lt;br /&gt;
* '''b)''' skiplist se skokem 2. Každý druhý prvek obsahuje kromě hodnoty a ukazatele na následníka také ukazatel na následovníka následovníka (next[next[x]]). Už touto změnou zkrátíme vyhledávání na polovinu, jelikož abychom se dostali na prvek např. 25, stačí nám pouze 5 skoků (&amp;gt; 6, &amp;gt;9, &amp;gt;17, &amp;gt;21, &amp;gt;25) na rozdíl od seznamu, kde jich je 9&lt;br /&gt;
* '''c)''' skiplist se skokem 4. na prvek 25 se dostaneme pouze 2 skoky&lt;br /&gt;
* '''d)''' skiplist se skokem 8. na prvek se dostaneme 1 skokem =&amp;gt; ideální skip-list: každý 2i-tý prvek má ukazatel, který ukazuje o 2i prvků dopředu &lt;br /&gt;
* '''e)''' skiplist s náhodným skokem - ?? skoků, ale ve velkém skiplistu je rychlejší, než lineární seznam, a operace přidání a odebírání jsou jednodušší&lt;br /&gt;
&lt;br /&gt;
Výhody:&lt;br /&gt;
* Skiplist je extrémně rychlý (vyhledávání je log n)&lt;br /&gt;
* Velmi snadná implementace (pouze pole ukazatelů v každém prvku)&lt;br /&gt;
&lt;br /&gt;
Nevýhody:&lt;br /&gt;
* Pomalé operace insert a delete (je nutné reorganizovat skiplist)&lt;br /&gt;
&lt;br /&gt;
Řešení: skiplist s náhodnými velikostmi uzlů. Potom:&lt;br /&gt;
* Vložení - najdeme místo, kam prvek patří, pomatujeme si všechny předchůdce. Po nalezení vložíme prvek s náhodnou výškou 1 &amp;lt; k &amp;lt; Maxlevel, a napojíme všechny předchůdce do výšky tohoto prvku (samozřejmě na obě strany, předchůdci ukazují na tento prvek, a ten ukazuje na prvky, na které předchůdci ukazovali původně)&lt;br /&gt;
* Mazání - opačný proces, najdeme prvek a pomatujeme si předchůdce. Pro všechny předchůdce do výšky hledaného prvku upravíme ukazatele (předchůdci budou ukazovat na prvky, na které ukazoval hledaný prvek). Hledaný prvek smažeme.&lt;br /&gt;
&lt;br /&gt;
	Tento skip-list není zcela log n, a nelze (díky náhodnosti) jeho složitost určit. S vysokou pravděpodobností však všechny operace budou rychlejší než O(n) (samozřejmě můžeme mít smůlu a všechny prvky budou náhodně výšky 1).&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Stromov%C3%A9_struktury_(Avl,_BVS,_B,_Red-Black)_a_jejich_implementace</id>
		<title>Stromové struktury (Avl, BVS, B, Red-Black) a jejich implementace</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Stromov%C3%A9_struktury_(Avl,_BVS,_B,_Red-Black)_a_jejich_implementace"/>
				<updated>2014-02-20T06:44:11Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Strom je ADT uchovávající prvky v hierarchické struktuře předcůdce-následovník. Použití v reprezentaci znalostí a stavového prostoru, popis scény při zpracování obrazu, v databázových systémech, systémech souborů, pro rozhodovací stromy, komprese dat, raytracing. &lt;br /&gt;
&lt;br /&gt;
* '''Obecné stromy''' - uzly mohou mít libovolný počet následovníků. Implementace pomocí ukazatelů, ve vrcholech spojový seznam následovníku.&lt;br /&gt;
* '''N-ární stromy''' - uzel má nejvýše n následovníků. Implementace ukazateli, ve vrcholech pole následovníků. &lt;br /&gt;
* '''Binární stromy''' - uzel má nejvýše dva následovníky. Implementace ukazateli a výčtem následovníků, případne polem.&lt;br /&gt;
&lt;br /&gt;
Binární strom, kde nalevo od každého prvku jsou k prvky s nižším klíčem a napravo s vyšším (příp. obráceně), je binární vyhledávací strom (BVS). Kořenem obyčejného BVS je první vložený prvek, další prvky se vkládají nalevo nebo napravo od něj. Při postupném vkládání seřazené posloupnosti ale takový strom degraduje na lineární seznam, což zvyšuje složitost vyhledávání. Proto je na místě snaha o vyvážení stromu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AVL ==&lt;br /&gt;
&lt;br /&gt;
(Adelson-Velsky, Landis)&lt;br /&gt;
&lt;br /&gt;
BVS zachovávající pravidlo, že podstromy každého vrcholu se mohou výškou lišit nejvýše o 1. Vyvážení kontrolováno po každém vložení a výberu. Vrchol obsahuje navíc položku informující o rozdílu výšek obou jeho podstromu (-2, -1 levá strana, 0 vyvážený, 1, 2 pravá strana). Vložení stejné jako u BVS, po vložení prepocet rozdílu výšek (v každém kořenu na cestě z vloženého prvku do kořenu stromu sledujeme, jak se jeho vyvýžení změní). Při nevyváženosti v některém vrcholu rotace v tomto vrcholu.&lt;br /&gt;
&lt;br /&gt;
Rotace:&lt;br /&gt;
* '''Jednoduchá''' - nevyváženost způsobuje levá větev levého podstromu nebo pravá větev pravého podstromu. Kontrolujeme, zda kořen podstromu má stejné znamínko jako kořen nadstromu ???&lt;br /&gt;
* '''Dvojitá''' - nevyváženost způsobuje pravá vetev levého podstromu nebo levá větev pravého podstromu. Provedeme nejdříve rotaci spodní větve, a tím se dostaneme na předchozí problém. &lt;br /&gt;
&lt;br /&gt;
Odebrání stejné jako u BVS - nahrazení prvku symetrickým následovníkem, po odstranění prvku prepočty rozdílu výšek kontrola vyváženosti smerem ke kořeni (od původní pozice symetrického následovníka - prvky prohozeny a zde odstraňován).&lt;br /&gt;
&lt;br /&gt;
// přidat obrázek&lt;br /&gt;
&lt;br /&gt;
== Red-Black ==&lt;br /&gt;
&lt;br /&gt;
Další modifikace BVS. Vrcholy obsahují navíc položku s informací o barve (cervená nebo cerná). &lt;br /&gt;
Pravidla: &lt;br /&gt;
koren je vždy cerný, &lt;br /&gt;
cesty od korene do každého listu obsahují stejný pocet cerných vrcholu (cerná výška stromu), &lt;br /&gt;
cervený vrchol má pouze cerné následovníky. &lt;br /&gt;
&lt;br /&gt;
Vkládaný vrchol je na zacátku vždy cervený, postupne od jeho pozice ke koreni kontrola pravidel a prípadná náprava&lt;br /&gt;
&lt;br /&gt;
- přebarvením vrcholů: pokud je rodič červený a jeho bratr také, oba přebarvíme na černé a jejich rodiče na černé) &lt;br /&gt;
- pokud bratr rodiče červený není, přebarvíme na černo pouze rodiče a provedeme rotace &lt;br /&gt;
	 - pokud je rodič levým synem, a vkládaný také, provedeme rotaci do prava (rodič se stane kořenem)&lt;br /&gt;
	 - pokud je rodič levý, ale vkládaný pravý, provedeme nejprve rotaci do leva (vkládaný se stane rodičem) a tím získáme předchozí problém, tedy přebarvíme a zarotujeme do prava podle vkládaného prvku, který se stane kořenem. &lt;br /&gt;
&lt;br /&gt;
Rotace jsou stejné jako u AVL stromu. Odebrání - nahrazení symetrickým následovníkem, ten ale obarven barvou odebíraného vrcholu, a po té postupujeme stejně jako při vkládání, tedy od místa odebrání kontrola pravidel smerem ke koreni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== B-strom ==&lt;br /&gt;
&lt;br /&gt;
B-strom řádu m má v každém vrcholu nejvýše m následovníků. &lt;br /&gt;
&lt;br /&gt;
Pravidla:&lt;br /&gt;
* klíčů ve vrcholu je o 1 méně než následovníků&lt;br /&gt;
* všechny listy jsou stejně hluboko&lt;br /&gt;
* všechny vrcholy mají nejvýše m následovníků&lt;br /&gt;
* všechny vrcholy kromě kořene mají alespoň m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; následovníků&lt;br /&gt;
* kořen je buď list nebo má alespoň 2 následovníky&lt;br /&gt;
&lt;br /&gt;
Ve vrcholech klíce serazené, vrcholy razeny jako u BVS (menší klíce vlevo, vetší vpravo). Pri vkládání se pridávají klíce do listu, pokud je v listu prekrocen maximální pocet (pretecení stránky), je list rozdelen uprostred a prostrední klíc vložen do rodice (zde opet kontrola prekrocení poctu). Odebereme-li klíc z listu a ten má potom príliš málo podtecení stránky), muže si vypujcit od sousedu (klíc z rodice do vrcholu, klíc ze souseda do rodice), pokud sousedi mají minimální pocet, dojde ke sloucení vrcholu s jedním sousedem a klícem z rodice. Pri odebírání z vnitrních vrcholu je nutné místo vždy zaplnit - klíc od potomka. Nemají-li potomci dost klícu, sloucí se dva potomci do jednoho. Implementace ukazateli s následovníky seznamem nebo polem, prípadne pomocí dvourozmerných polí (jedno pro klíce, jedno pro indexy následovníku, index korenu).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Abstraktn%C3%AD_datov%C3%A9_typy_z%C3%A1sobn%C3%ADk_fronta,_seznamy,_%C5%99ady,_vektory_a_jejich_implementace</id>
		<title>Abstraktní datové typy zásobník fronta, seznamy, řady, vektory a jejich implementace</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Abstraktn%C3%AD_datov%C3%A9_typy_z%C3%A1sobn%C3%ADk_fronta,_seznamy,_%C5%99ady,_vektory_a_jejich_implementace"/>
				<updated>2014-02-20T06:44:03Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zásobník, fronta, seznam viz. PPA2&lt;br /&gt;
Obousměrná fronta - výběr a vložení možné na obou koncích (zásobník a fronta dohromady)&lt;br /&gt;
&lt;br /&gt;
Vektor - v podstatě spojový seznam, nebo seznam pomocí pole, kde má každá položka index od začátku, a tedy přístup pomocí indexů, a indexy jsou přerovnány (nevznikají díry). Nejde o pole, pokud do pole na index 3 uložíme hodnotu, bude vždy na indexu 3, ve vektoru se může posunovat prodáváním/mazáním prvků před ním.&lt;br /&gt;
	= ADT seznam, kde místo iterátoru použijeme indexer&lt;br /&gt;
&lt;br /&gt;
Řada - WTF? O tom jsem nikdy neslyšel, v přednáškách to není, na netu nic&lt;br /&gt;
&lt;br /&gt;
- SPEKULACE: Představil bych si ADT, kde je každý prvek stejného typu (do vektoů či seznamu by teoreticky bylo možné uložit i různé prvky, do řady ne. Otázkou je proč by to někdo potřeboval, když pak by bylo možné například ukládat pouze diference od předchozího objektu a možná ušetřit místo??&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=%C3%9Avod_do_technologie_programov%C3%A1n%C3%AD_a_programovac%C3%ADch_styl%C5%AF,_objektov%C4%9B_orientovan%C3%BD_n%C3%A1vrh,_z%C3%A1kladn%C3%AD_UML_diagramy,_psan%C3%AD_program%C5%AF_v_Jav%C4%9B</id>
		<title>Úvod do technologie programování a programovacích stylů, objektově orientovaný návrh, základní UML diagramy, psaní programů v Javě</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=%C3%9Avod_do_technologie_programov%C3%A1n%C3%AD_a_programovac%C3%ADch_styl%C5%AF,_objektov%C4%9B_orientovan%C3%BD_n%C3%A1vrh,_z%C3%A1kladn%C3%AD_UML_diagramy,_psan%C3%AD_program%C5%AF_v_Jav%C4%9B"/>
				<updated>2014-02-20T06:43:57Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Úvod ==&lt;br /&gt;
Programování je proces vytváření software splňující určité funkce. K programování využíváme programovací jazyky, dříve procedurální (nestrukturované (asembler) - bez podprogramů, pouze skoky v programu (goto), nebo strukturované (basic, c, pascal) - podprogramy, skoky jen velmi vyjímečně), dnes nejčastěji objektově zaměřené (objekty jsou stavební kameny a obalují funkce, využití technik OOP).&lt;br /&gt;
&lt;br /&gt;
Dříve bylo programování spojeno s testováním, nyní je proces rozdělen do několika fází:&lt;br /&gt;
&lt;br /&gt;
'''Analýza''' - Sbírání informací od zákzníka či zadavatele&lt;br /&gt;
&lt;br /&gt;
'''Návrh''' - Návrh SW tak, aby splňoval požadavky analýzy&lt;br /&gt;
&lt;br /&gt;
'''Kódování''' - Implementace návrhu&lt;br /&gt;
&lt;br /&gt;
'''Ladění''' - Testování a odstraňování chyb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Styly ==&lt;br /&gt;
&lt;br /&gt;
'''Vodopád''' - fáze jdou za sebou, nevracíme se, ani neodbočujeme (nejstarší), týmy se zapojují do procesu pokud je na řadě jejich blok&lt;br /&gt;
&lt;br /&gt;
'''Formální''' - návrh je matematicky zcela do detailu popsán a jednotlivé bloky modelu jsou poté 1:1 implementovány&lt;br /&gt;
&lt;br /&gt;
'''Evoluční''' - začíná se malým funkčním SW, na který nabalujeme další funkce, ale nevíme, jaké funkce bude v budoucnu mít&lt;br /&gt;
&lt;br /&gt;
'''Iterativní''' - proces je rozdělen na iterace, v každé iteraci je naplánováno několik funkčností, iterace stejně dlouhé, po iteraci je SW vždy v kompletní spustitelné podobě&lt;br /&gt;
&lt;br /&gt;
'''Komponentový''' - využití hotových komponent, či implementace vlastních, po té stavění SW z komponent jako z kostek&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objektově orientovaný návrh ==&lt;br /&gt;
&lt;br /&gt;
OO umožňuje, a klade si za cíle:&lt;br /&gt;
&lt;br /&gt;
'''Znovupoužitelnost''' - abstraktní části kódu jsou univerzální a je tedy možné je používat stále dokola&lt;br /&gt;
&lt;br /&gt;
'''Robustnost''' - návrh předpokládá všechny vstup, nejen ty, které jsou očekávané&lt;br /&gt;
&lt;br /&gt;
'''Přispůsobivost''' - návrh lze pouze s minimálními zásahy do kódu použít na různých platformách&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pilíře OO návrhu ==&lt;br /&gt;
&lt;br /&gt;
'''Dědičnost, Zapouzdření, Polymorfysmus''' - PPA2&lt;br /&gt;
&lt;br /&gt;
'''Modularita''' - rozdělení programu na bloky - moduly&lt;br /&gt;
&lt;br /&gt;
'''Abstrakce''' - Návrh na abstraktní úrovni je snadno implementovatelný&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jazyk UML ==&lt;br /&gt;
&lt;br /&gt;
Jazyk pro abstraktní návrh OO SW, modelování SW před implementací, navrhujeme pouze strukturu, nikoliv funkčnost.&lt;br /&gt;
Typy UML:&lt;br /&gt;
&lt;br /&gt;
'''diagram tříd a objektů''' - popisují statickou strukturu systému&lt;br /&gt;
&lt;br /&gt;
'''modely jednání (diagram případů užití)''' - dokumentují možné případy použití systému, události, na které musí systém reagovat&lt;br /&gt;
&lt;br /&gt;
'''scénáře činností (diagramy posloupností)''' - popisují scénář průběhu určité činnosti, těchto činností je model jednání složen&lt;br /&gt;
&lt;br /&gt;
'''diagramy spolupráce''' - zachycují komunikaci spolupracujících objektů&lt;br /&gt;
&lt;br /&gt;
'''stavové diagramy''' - popisují dynamické chování objektu nebo systému&lt;br /&gt;
&lt;br /&gt;
'''diagramy aktivit''' - průběh aktivit procesu nebo činností&lt;br /&gt;
&lt;br /&gt;
'''diagramy komponent''' - popisují rozdělení systému na funkční celky a definují náplň jednotlivých komponent&lt;br /&gt;
&lt;br /&gt;
'''diagramy nasazení''' - popisují umístění funkčních celků&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pro návrh diagramu tříd máme následující parametry:&lt;br /&gt;
&lt;br /&gt;
Atributy a metody - definujeme viditelnost a vlastnosti (+ public, # protected, - private, / readonly, in/out směr)&lt;br /&gt;
&lt;br /&gt;
Třída: obdélník, název tučně, pak seznam atributá a metod&lt;br /&gt;
&lt;br /&gt;
Objekt: Název:Třída&lt;br /&gt;
&lt;br /&gt;
Dědičnost - šipka od potomka k rodiči, může být i vícenásobná&lt;br /&gt;
&lt;br /&gt;
Asociace - 0..1  1..1 0..N 1...N  --&amp;gt; šipka od první třídy a ta obsahuje odkazy/využívá x..y objektů druhé třídy (např Podvozek 1 ---&amp;gt; 4 Kola ), nad šipkou název činnosti (pokud možno lepší než &amp;quot;má&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Kompozice - je li objekt v kompozici s jiným, je na něj silně vázán (například seznam a položka seznamu. seznam může existovat i bez položek, ale položka bez seznamu ne), značka prázdný kosočtverec&lt;br /&gt;
&lt;br /&gt;
Agregace  - volná vazba, abstrakce &amp;quot;používá&amp;quot;, objekty však mohou fungovat i nezávisle na sobě (například počítače v síti), značka plný kosočtverec&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Java ==&lt;br /&gt;
&lt;br /&gt;
'''Návrh''' - UML diagramy, CRC karty (karty, kde je pro každá blok sloupec Má za úkol a Vyžaduje). Je li toho na kartě příliš, je vhodné zvážit její rozdělení&lt;br /&gt;
&lt;br /&gt;
'''Implementace''' - podle návrhu, karta odpovídá třídě. &lt;br /&gt;
&lt;br /&gt;
'''Ladění  a testování''' - kontrolní výpisy, logování, watch na proměnných, ..., po té test pro různá data (generovaná, &amp;quot;nepříjemná&amp;quot;)  a sledování správnosti, rychlosti, využití zdrojů, uvolnění&lt;br /&gt;
&lt;br /&gt;
'''Dokumentace''' - štábní kultura, konvence pojmenovávání, komentáře, Javadoc komentáře a generovaná dokumentace&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Kategorie:Fav-kiv-bzinf</id>
		<title>Kategorie:Fav-kiv-bzinf</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Kategorie:Fav-kiv-bzinf"/>
				<updated>2014-02-20T06:42:04Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: založení&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kategorie okruhů státní závěrečné zkoušky&lt;br /&gt;
&lt;br /&gt;
[[KIV/BZINF - Státnice pro informatiky]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Klasifikace_probl%C3%A9m%C5%AF</id>
		<title>Klasifikace problémů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Klasifikace_probl%C3%A9m%C5%AF"/>
				<updated>2014-02-20T06:37:56Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rozhodovací problémy lze dělit do tříd složitosti&lt;br /&gt;
P (polynomiální) - problém je řešitelný pomocí (deterministického) Turingova stroje (&amp;lt;http://cs.wikipedia.org/wiki/Turing%C5%AFv_stroj&amp;gt;) v Polynomiálním čase (např problém řazení), lze dokázat, že všechny problémy P jsou podmnožinou problémů skupiny NP (NP problém s jednou větví, NP problém bez hádání či nápovědy)&lt;br /&gt;
NP (nedeterministicky polynomiální)  - Polynomiální čas, ale nedeterministický Turingův stroj (takový, který může rozvětvit program v libovolném kroku na více větví, ve kterých hledá řešení současně (zcela paralelně), případně lze mluvit o stroji, který &amp;quot;uhodne&amp;quot; kterou větví se vydat, případně mu něco &amp;quot;napoví&amp;quot; kudy se má vydat, aby řešení bylo správné. Také lze mluvit o problémech, jejichž řešení lze ověřit  v polynomiálním čase (zpětný postup, zjištění, zda je nalezené řešení opdpovídající problému), níkoliv jej získat  - pokud bychom všechny větve umístili řekněme do zásobníku (zásobníkový Touringův stroj), čas pro nalezení řešení by nutně nebyl polynomiální. Je otázkou, zda lze pro NP problémy najít P řešení.&lt;br /&gt;
NP-těžké - Problémy, na které lze v polynomiálním čase převést všechny problémy NP, nemusí však nutně v NP samy o sobě být (nemusí být ani rozhodovací)&lt;br /&gt;
NP-úplné - NP-těžké problémy, které jsou ve třídě NP, jde tedy o nejtěžší NP úlohy&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Np-problemy.jpg]] &lt;br /&gt;
&lt;br /&gt;
A dále je tu složitost problémů, viz 6&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Algoritmick%C3%A1_%C5%99e%C5%A1itelnost_probl%C3%A9m%C5%AF</id>
		<title>Algoritmická řešitelnost problémů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Algoritmick%C3%A1_%C5%99e%C5%A1itelnost_probl%C3%A9m%C5%AF"/>
				<updated>2014-02-20T06:37:23Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problém definujeme jako binární relaci mezi množinou instancí problému I (tj. množinou všech možností vstupu) a množinou rešení S. Dve instance mohou mít stejné rešení, stejne tak jedna muže mít více rešení. Algoritmická rešitelnost zkoumá, zda pro všechny formulovatelné problémy lze nalézt algoritmus rešení.&lt;br /&gt;
&lt;br /&gt;
Ve 30.l. 20.st. objevil Alan Turing formální opis algoritmu - Turinguv stroj, ve spojení s Alonzem Churchem vytvorili Churchovu-Turingovu tezi a sice, že každý algoritmus (ne problém!) lze vykonat Turingovým strojem. Tezi lze vyvrátit nalezením algoritmu nevykonatelného TS. Moderní programovací jazyky pak byly navrženy tak, aby libovolný program šlo prevést na TS a naopak. Problém, který nelze vyrešit pomocí TS, tedy ani pomocí programu, je pak algoritmicky nerešitelný.&lt;br /&gt;
&lt;br /&gt;
Vytvoríme-li takový rozhodovací problém (rešení je ano/ne), který pro každý rozhodovací algoritmus a alespon jeden jeho vstup dává pro tento vstup opacnou odpoved, než daný algoritmus se stejným vstupem, takový problém není rešitelný žádným z techto algoritmu a je tedy nerozhodnutelný. &lt;br /&gt;
&lt;br /&gt;
První takový problém - problém zastavení - našel sám Turing: program má o všech vytvoritelných programech rozhodnout, zda pro každý ze vstupu&lt;br /&gt;
daný program zastaví (tehdy vrací jeho výstup v podobe prirozeného císla + 1) nebo nezastaví (pak vrací 0). Takový program to ale nedokáže rozhodnout sám o sobe (pokud by byl vytvoritelný, patril by mezi zkoumané programy také a musel by ve svém výstupu vrátit svuj výstup + 1, což nejde).&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Rozhran%C3%AD</id>
		<title>Rozhraní</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Rozhran%C3%AD"/>
				<updated>2014-02-20T06:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Objektově orientované jazyky poskytují pro realizaci tříd, kromě dědičnosti, dalši prostředek - rozhraní. Rozhraní definuje soubor metod bez jejich implementace (podobně jako kompletně virtuální třída). Analogie je v rozepsané kuchařce, kdy víme co to bude za jídlo a z čeho budeme vařit, ale postup neznáme. Třída, která implementuje toto rozhrani (tj. implementuje - definuje - všechny jeho metody), je po té v polymorfovatelná do ukazatele definovaného tímto rozhraním, což znamená, ze klient ví, že tato třída má implementované všechny metody, které potřebuje (a které jsou definované v rozhraní).&lt;br /&gt;
&lt;br /&gt;
// trochu divoký vysvětlení&lt;br /&gt;
&lt;br /&gt;
Deklarace rozhraní je podobná deklaraci třídy&lt;br /&gt;
&lt;br /&gt;
 interface jmeno {&lt;br /&gt;
   // hlavicky metod, všechny samozřejmě virtuální a abstraktní&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
V Javě se implementace rozhraní zapiše pomoci kličoveho slova implements&lt;br /&gt;
&lt;br /&gt;
 Trida implements Rozhrani {&lt;br /&gt;
   ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
V jiných jazycích (C++, C#, ...) používáme dvojtečku, přičemž první třída za dvojtečkou je obvykle dědění, ostatní jsou implementace rozhraní (i když v C++ je to jedno, tam můžeme implementovat i dědit od více tříd). Implementovat můžeme i několik rozhraní (například implements Cloneable, Runnable)&lt;br /&gt;
&lt;br /&gt;
Může se stát, že 2 rozhraní mají stejné metody k implementaci. Implementovat je tedy možné &lt;br /&gt;
* '''Implicitně''' - Implementujeme metodu první nalezené metody s tímto jménem ve všech rozhraních, nebo selže, záleží na jazyku&lt;br /&gt;
* '''Explicitně''' - Implementujeme metodu tak, že řekneme kterou metodu kterého rozhraní implementujeme např:&lt;br /&gt;
 public this.type Cloneable.Clone() {&lt;br /&gt;
   // tělo &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Nejsilnější zbraní rozhraní je, že odděluje kód od definic (vhodné např. pro pluginové systémy) a je sdružuje třídy do jedné skupiny funkčnosti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=D%C4%9Bdi%C4%8Dnost</id>
		<title>Dědičnost</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=D%C4%9Bdi%C4%8Dnost"/>
				<updated>2014-02-20T06:37:10Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Základním stavebním blokem OOP je dědičnost. Dědění je způsob deklarace třídy tak, že využijeme jinou třídu jako předka. &lt;br /&gt;
Naše děděná třída tedy může &lt;br /&gt;
&lt;br /&gt;
Převzít metody a atributy předka&lt;br /&gt;
Definovat nové metody a atributy&lt;br /&gt;
Přepsat metody a atributy předka&lt;br /&gt;
&lt;br /&gt;
Ve většině jazyků jsou všechny třídy implicitně děděny od třídy Object. Ve většině jazyků (snad kromě C++) zle dědit pouze od jedné třídy. Pro další dědění lze použít rozhraní. &lt;br /&gt;
&lt;br /&gt;
V Javě dědíme pomocí klíčového slova extends, tedy&lt;br /&gt;
&lt;br /&gt;
Class B extends A {&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
V jiných jazycích (C++, C#, ...) používáme dvojtečku, přičemž první třída za dvojtečkou je obvykle dědění, ostatní jsou implementace rozhraní (i když v C++ je to jedno, tam můžeme implementovat i dědit od více tříd)&lt;br /&gt;
&lt;br /&gt;
S pojmem dědění úzce souvisí i pojem Polymorfismus. Ten nám umožňuje nejen hiearchii objektů rozšiřovat, ale také ji využívat opačným směrem, tedy dědí-li třída B od třídy A, můžeme použít konstrukci (přiřazení)&lt;br /&gt;
&lt;br /&gt;
B b = new B();&lt;br /&gt;
A a = b;&lt;br /&gt;
&lt;br /&gt;
To je extrémně důležité pro ADT, kdy vytvoříme strukturu pro A, a můžeme do ní ukládat objekty A i B.&lt;br /&gt;
&lt;br /&gt;
Otázka je, pokud voláme metody A.Metoda, a metoda B tuto metodu má také, co se děje?&lt;br /&gt;
Pro snažší pochopení řekněme, že máme typ pointeru a typ objektu. V předchozí ukázce je a typu A a b typu B, ale typ pointeru a je A a typ objektu (pod tímto pointerem) a je B.&lt;br /&gt;
&lt;br /&gt;
Některé jazyky podporují Virtualitu metod. Virtuální metoda je metoda, která (je li překryta) je volána vždy z typu objektu, který překrývá. Pokud překryta není (nebo pokud je volána z třídy, která tuto virtuální metodu obsahuje), volá se ona. Voláme-li tedy a.Metoda() z předchozího příkladu, zavolá se ve skutečnosti b.Metoda(), protože a ukazuje na typ b. Java má všechny metody virtuální. &lt;br /&gt;
&lt;br /&gt;
Druhou možností je použít nevirtuální metody. Taková metoda nemůže být překryta, nicméně může být znovu vytvořena (předefinována řekněme) pro daná objekt. V praxi to znamená, že je volána z typu Pointeru který na objekt ukazuje, tedy voláme li a.Metoda() zavoláme opravdu a.Metoda().&lt;br /&gt;
&lt;br /&gt;
Za poslední zmínku stojí Kovariance typů. Ta znamená, že je li typ kovariantní, lze vzájemně přiřazovat obalující typy, tedy lze provést např.&lt;br /&gt;
&lt;br /&gt;
pokud B extends A: &lt;br /&gt;
&lt;br /&gt;
List&amp;lt;A&amp;gt; a = new List&amp;lt;B&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
tedy je li B potomkem A, je li List&amp;lt;B&amp;gt; potomkem List&amp;lt;A&amp;gt;. Tento mechanismus však ve většině jazyků nefunguje, a je nutné vytvořit List&amp;lt;A&amp;gt; a naskládat do něj objekty B, a při výběru je jeden po druhém přetypovat zpět na B, jelikož List&amp;lt;A&amp;gt; vrací objekty typu A.&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Generi%C4%8Dnost</id>
		<title>Generičnost</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Generi%C4%8Dnost"/>
				<updated>2014-02-20T06:37:03Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Genericita je možnost programovaciho jazyka definovat místo typů jen „vzory typů“, kde typy proměnných, použité v definici typu (rozuměj v typu jako ADT), jsou vyvedeny vně definice jako parametry a jsou určeny později klientskou aplikací. Základnim užitím genericity jsou třidy kontejnerů, které jsou určené k udržování skupin objektů určitého typu, například vzor třidy Seznam je definovan vlastně jako Seznam&amp;lt;G&amp;gt;, kde G je typ objektů, ktere mohou být do seznamu vloženy (kouzlo genericity vynikne pak v kombinací s dědičností, kdy do seznamu mohou být vloženy nejen objekty typu G, ale i objekty všech možnych dědiců třídy (typu) G). Konkrétní typ, použitelný v textu programovacího jazyka pak vzniká, když G nahradíme skutečným existujícím typem.&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
&lt;br /&gt;
Máme List&amp;lt;T&amp;gt; kde T je libovolný typ. Když List alokujeme, použijeme List&amp;lt;int&amp;gt; intList = new List&amp;lt;int&amp;gt;(), a tento list poté akceptuje jen čísla typu int.&lt;br /&gt;
&lt;br /&gt;
Extrémní případy dovolují mnohé šílenosti, jako třeba &lt;br /&gt;
 List &amp;lt; List &amp;lt; List &amp;lt; HodnotaTabulky &amp;gt; &amp;gt; &amp;gt;&lt;br /&gt;
je seznam tabulek :D&lt;br /&gt;
&lt;br /&gt;
Pokud definujeme vzor (template, proto se používá T), používáme místo int prostě zástupce T&lt;br /&gt;
&lt;br /&gt;
Např.&lt;br /&gt;
&lt;br /&gt;
 public interface List&amp;lt;T&amp;gt; {      // vytváříme interface, který říká, že nad typem &amp;lt;T&amp;gt; bude list&lt;br /&gt;
   void add(T x);                // Operace přidání prvku (typu &amp;lt;T&amp;gt;)&lt;br /&gt;
   Iterator&amp;lt;T&amp;gt; iterator();       // Struktura má iterátor, který definujeme níže&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 public interface Iterator&amp;lt;T&amp;gt; {  // Iterátor pohybující se po prvcích typu &amp;lt;T&amp;gt;&lt;br /&gt;
   T next();                     // Metoda vrací další prvek v pořadí&lt;br /&gt;
   boolean hasNext();            // Jen aby bylo vidět, že nemusíme jen vracet &amp;lt;T&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Což je takhle k ničemu, protože typ T kromě hodnoty nemá nic, co bychom mohli využít. Použijeme tedy obalení do třídy, např&lt;br /&gt;
&lt;br /&gt;
 public class Wrapper {&lt;br /&gt;
   T value;&lt;br /&gt;
   Wrapper next();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
a s tou pak pracujeme.&lt;br /&gt;
&lt;br /&gt;
V některých jazycích lze T omezit, třeba jen na typy implementující Iterable.&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Doln%C3%AD_omezen%C3%AD_pro_porovn%C3%A1vac%C3%AD_%C5%99azen%C3%AD</id>
		<title>Dolní omezení pro porovnávací řazení</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Doln%C3%AD_omezen%C3%AD_pro_porovn%C3%A1vac%C3%AD_%C5%99azen%C3%AD"/>
				<updated>2014-02-20T06:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Celkem HC otázka, asi nejtěžší z PPA, kvůli matematice, kterou my programátoři moc nemusíme (kdo říká, že to není pravda, tak lže sám sobě, nebo neumí programovat s tím, co je k dispozici a vše si musí do podrobna analyzovat)&lt;br /&gt;
&lt;br /&gt;
Zkoumejme dolni omezeni počtu porovnani T(n) pro porovnávaci algoritmy řazení.&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Dolni-omezeni.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Předpokladejme, že všechny prvky posloupnosti a1, a2, ..., an jsou různé. Porovnavací řazeni můžeme znázornit rozhodovacim stromem. Ve vnitřních vrcholech jsou prvky, ktere algoritmus porovná a v listech je permutace všech prvků původni posloupnosti, ktera je seřazena.&lt;br /&gt;
&lt;br /&gt;
Přiklad rozhodovaciho stromu pro řazeni vkladanim tři prvků:&lt;br /&gt;
Jakykoliv 100% správný algoritmus (brutální síla) musi vytvořit každou z n! permutací prvků původní posloupnosti a zjistit, která je seřazená. Každou z takových permutací umístíme do stromu, ve kterém je v kořenech naznačeno porovnání, kterým se k permutacím dostaneme.&lt;br /&gt;
&lt;br /&gt;
Nejhoršim připadem počtu porovnani vykonanych algoritmem řazeni je nejdelši cesta od kořene stromu k listu, je tedy rovna vyšce stromu T(n) = h . &lt;br /&gt;
&lt;br /&gt;
Nyní musíme najít dolní omezení všech rozhodovacích stromů. Nechť rozhodovaci strom o výšce h má l  listů, potom l = 2h (binární strom má maximálně 2h listů). Současně listů musi byt alespoň tolik, kolik je permutaci, tedy n! = l. &lt;br /&gt;
Potom n! = l = 2h a po logaritmování (zjištění délky cesty, každá vrstva x grafu má 2x možných cest (2x listů), takže číslo vrstvy a tedy i délka ke kořeni je funkce inverzní, tedy log2x)&lt;br /&gt;
&lt;br /&gt;
	 log2 (n!) = log2 2h = h log22 = h * 1 = h = počet porovnání, kterým se dostneme k permutaci&lt;br /&gt;
&lt;br /&gt;
Použitim aproximace (n/e)n = n! je&lt;br /&gt;
&lt;br /&gt;
log2(n!)=n * log2 (n/e) = log2 n- n* log2 e,&lt;br /&gt;
&lt;br /&gt;
čim dostavame dolni omezeni pro nejhorši připad Ω(n*log2 n). (n * konstanta = n)&lt;br /&gt;
&lt;br /&gt;
Protože pro řazeni haldou a slučovanim jsou shora omezeny časem vypočtu Ω(n*log2 n), jsou tato řazeni asymptoticky optimalni.&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Algoritmy_%C5%99azen%C3%AD_O(N_logN)</id>
		<title>Algoritmy řazení O(N logN)</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Algoritmy_%C5%99azen%C3%AD_O(N_logN)"/>
				<updated>2014-02-20T06:36:50Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// přidat ukázky&lt;br /&gt;
&lt;br /&gt;
Společné pro všechny: Řadíme stromem.&lt;br /&gt;
&lt;br /&gt;
== Řazení haldou (heapsort) ==&lt;br /&gt;
&lt;br /&gt;
Na začátku je neseřazené pole. Postupně obnovujeme nad tímto polem haldu pro první dva, tři, čtyři atd. prvky, až&lt;br /&gt;
máme na poli vytvořenu haldu. Následně zaměníme nejvyšší prvek (vyjmeme ho) s posledním a obnovíme&lt;br /&gt;
vlastnost haldy na n−1 prvcích. Obnovení haldy je O(log n) a obnovujeme po každém výběru, tedy O(n log2n) &lt;br /&gt;
To opakujeme až zbude jednoprvková halda a celé pole je seřazené. Nestabilní (složitost závisí na vstupních datech).&lt;br /&gt;
&lt;br /&gt;
V kostce: na poli uděláme haldu a max prvky vyměňujeme s posledními prvky haldy a haldu obnovujeme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Shellovo řazení (shellsort) ==&lt;br /&gt;
&lt;br /&gt;
Posloupnost rozdělíme na podposloupnosti s krokem h (každý h-tý počínaje prvním, počínaje druhým až&lt;br /&gt;
počínaje h − 1-ním), které nezávisle seradíme vkládáním (insertsortem). Následne snižujeme hodnotu h a&lt;br /&gt;
provádíme totéž až do serazení s h = 1. Prvky daleko od své výsledné pozice se k ní dostanou v menším&lt;br /&gt;
počtu kroků, než u obyčejného insertsortu.&lt;br /&gt;
&lt;br /&gt;
* Shell - počátecní h = polovina délky pole, snížení vydělením dvěma&lt;br /&gt;
* Knuth - posloupnost 3i + 1, počáteční h = její prvek v nejbližší třetině délky pole&lt;br /&gt;
&lt;br /&gt;
Jednoduchý a efektivní algoritmus, složitá analýza, nestabilní.&lt;br /&gt;
&lt;br /&gt;
V kostce: rozdělení do stromu podle kroku (třeba na osminy), insertsort větví, a pak insertsort čtvrtin, polovin, konec&lt;br /&gt;
&lt;br /&gt;
Poměrně zajímavě udělaná ukázka z kartama: http://www.youtube.com/watch?v=QG8hs0wqmqk&lt;br /&gt;
&lt;br /&gt;
== Řazení dělením (splitsort, quicksort) ==&lt;br /&gt;
&lt;br /&gt;
Určíme prvek, jehož hodnota bude rozdělovat pole (pivot). Procházíme z obou stran pole a menší hodnoty&lt;br /&gt;
vpravo prohazujeme s vetšími vlevo, až se oba průchody potkají. Na tuto pozici přesuneme pivot - vlevo jsou&lt;br /&gt;
hodnoty menší, vpravo vetší. Totéž provedeme s částí pole vlevo od pivotu i vpravo od nej. Rekurze končí,&lt;br /&gt;
je-li předán pouze jeden prvek k seřazení. Nejčasteji se pivot určuje jako krajní prvek pole (nezasahuje pak&lt;br /&gt;
do procesu dělení). Lze použít zásobník místo rekurze. Snadno implementovatelné, nestabilní.&lt;br /&gt;
&lt;br /&gt;
V kostce: rozdělení do stromu podle pivotů (prvek velikostně cca uprostřed podstromu, ideálně medián, ale může být i náhodný), &lt;br /&gt;
v každém podstromu vzájemně vyměníme větší a menší prvky než pivot.&lt;br /&gt;
&lt;br /&gt;
Výukové videjko: http://www.youtube.com/watch?v=y_G9BkAm6B8&lt;br /&gt;
&lt;br /&gt;
== Řazení slucováním (mergesort) ==&lt;br /&gt;
&lt;br /&gt;
Pole je rekurzivně rozdělováno na poloviny. Dojdeme až na úroveň dvojic prvku, které seřadíme (sloučíme).&lt;br /&gt;
O úroven výše opět po dvojicích sloučíme (kopírujeme vždy menší prvek z obou polí a posuneme se za nej)&lt;br /&gt;
a postupujeme až sloučíme obě poloviny původního pole. Je to nejčasteji používaná metoda a je stabilní.)&lt;br /&gt;
&lt;br /&gt;
V kostce: jako když mícháme karty - 2 balíčky a děláme [[Soubor:Mergesort.jpg]]  &lt;br /&gt;
???????&lt;br /&gt;
&lt;br /&gt;
. Procházíme 2 podstromy a řadíme posunem &lt;br /&gt;
2 indexů, jeden v každém podstromu, a vždy zapíšeme větší prvek pod jedním z indexů, který posuneme&lt;br /&gt;
&lt;br /&gt;
Bezva video - http://www.youtube.com/watch?v=GCae1WNvnZM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nestabilní metody lze &amp;quot;zestabilnit&amp;quot; například zpřeházením dat na vstupu.&lt;br /&gt;
&lt;br /&gt;
Radix sort =???&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Halda</id>
		<title>Halda</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Halda"/>
				<updated>2014-02-20T06:36:41Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halda je datová struktura, která má následující vlastnosti:&lt;br /&gt;
&lt;br /&gt;
* Jde o strom&lt;br /&gt;
* Pokud C je potomkem P, potom hodnota h(C) &amp;lt;= h(P)&lt;br /&gt;
&lt;br /&gt;
Tato halda se nazývá MaxHeap (maximální halda), protože má v kořeni vždy větší prvek. Existuje také minHeap (minimální halda), které je seřazena opačně. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementace ==&lt;br /&gt;
&lt;br /&gt;
Nejjednodušší haldou může být seřazené pole či seznam. Nejčastěji se však používá binární halda, a pojmem halda tuto binární haldu většinou myslíme, existují však i další (binominální, Fibonacciho, měkká ...)&lt;br /&gt;
&lt;br /&gt;
Binární halda má ještě jednu vlastnost, vyváženost (vlastnost tvaru, úplnost stromu). Ta říká, že je halda buď vyvážená (všechny listy jsou na stejné úrovni h) a nebo je plněna zleva do prava.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vlastnosti ==&lt;br /&gt;
&lt;br /&gt;
Vyhledání nejvyššího prvku v haldě je triviální (jde o kořen haldy, tedy O(1))&lt;br /&gt;
&lt;br /&gt;
Vkládání prvku probíhá tak, že jej vložíme do nejnižší úrovně haldy, co nejvíce doleva. Pokud je tímto porušena vlastnost haldy, vyměníme prvek s jeho rodičem a opakujeme, dokud není vlastnost haldy zcela obnovena.&lt;br /&gt;
&lt;br /&gt;
Mazání prvku je podobné. V binární haldě jej provádíme tak, že najdeme prvek, který je na nejnižší úrovni zcela vlevo (mimochodem, to se dá v poli zařídit indexem, v objektech ukazatelem), vyměníme jej s mazaným prvkem a obnovíme vlastnost haldy. Mazaný prvek z haldy po té samozřejmě vyjmeme.&lt;br /&gt;
&lt;br /&gt;
Implementace na poli:&lt;br /&gt;
Má-li prvek na indexu k v poli potomky, jsou na indexech 2k+1 a 2k+2. Splněním doplňkového pravidla haldy v poli nebudou mezery, a pozice pro vložení prvku či výměnu prvku při mazání je na konci pole&lt;br /&gt;
&lt;br /&gt;
Implementace objektově&lt;br /&gt;
Jako spojová struktura, je však nutné udržovat pointer na rodiče nejnižší úrovně (to může být problematické a pomalé)&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Prioritn%C3%AD_fronta</id>
		<title>Prioritní fronta</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Prioritn%C3%AD_fronta"/>
				<updated>2014-02-20T06:35:57Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Speciální případ ADT podobne jako zásobník a fronta, výběr odebere prvek s nejvyšší či nejnižší prioritou (maximová resp. minimová PF) Vkládat lze prvky s libovolnou prioritou. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Implementace:''' polem / spoj.seznamem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Složitost podle přístupu: ==&lt;br /&gt;
&lt;br /&gt;
Rozhraní&lt;br /&gt;
* vytvoření prázdný fronty&lt;br /&gt;
* test prázdné fronty&lt;br /&gt;
* vložení a výběr prvku&lt;br /&gt;
&lt;br /&gt;
'''Lazy:''' &lt;br /&gt;
Pole či seznam je neuspořádaný, vkládáme prvek vždy na konec v poli (O(1)) a na začátek v seznamu (O(1)). Při výběru musíme najít maximum, v obou případech O(n)&lt;br /&gt;
&lt;br /&gt;
'''Eager:'''&lt;br /&gt;
Pole či seznam je uspořádaný, prvek vkládáme tak, aby byla struktura seřazena. Vložení je O(n), ale výběr je O(1) (ze začátku seznamu / konce pole)&lt;br /&gt;
&lt;br /&gt;
'''Kombinace:'''&lt;br /&gt;
Implementace pomocí BVS nebo haldy - vložení i výber O(log2n)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modifikovatelná prioritní fronta ==&lt;br /&gt;
&lt;br /&gt;
Pomocí haldy, a &lt;br /&gt;
# přidáme mapu prvek-&amp;gt;pozice v haldě. Změnou priority a obnovením haldy je možné v O(log2n) prioritu i měnit &lt;br /&gt;
# bez mapy je hledání prvku v haldě další O(log2n) čas, celkem tedy hledání O(log2n) + obnovení haldy O(log2n)&lt;br /&gt;
&lt;br /&gt;
Pokud proritu příliš neměníme, způsob 1 je výhodnější, ale paměťově náročnější&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Rozptylov%C3%A9_tabulky_s_s_vn%C4%9Bj%C5%A1%C3%ADm_%C5%99et%C4%9Bzen%C3%ADm</id>
		<title>Rozptylové tabulky s s vnějším řetězením</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Rozptylov%C3%A9_tabulky_s_s_vn%C4%9Bj%C5%A1%C3%ADm_%C5%99et%C4%9Bzen%C3%ADm"/>
				<updated>2014-02-20T06:35:51Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HASH&lt;br /&gt;
Pokud máme množinu záznamů, ve které mohou v klíčích existovat duplicity pro různé hodnoty (například tabulka slov podle prvího písmena). Pro tento přístup je nemožné používat přímé adresování, jelikož by docházelo ke kolizím.&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Rozptylova-tabulka.jpg]]&lt;br /&gt;
&lt;br /&gt;
Můžeme ale v poli využít prázdná místa a do nich duplicitní hodnoty ukládat. Vyhladávání a ukládání potom obecně nebude v konstantním čase. Můžeme tedy například uložit duplicitní hodnotu do následujícího prázdného místa v tabulce. Problémy jsou však následující:&lt;br /&gt;
&lt;br /&gt;
Můžeme zabrat místo pro klíč, který má na toto místo právoplatný nárok (kolize tedy nastanou nejen pro hodnoty se stejným klíčem, ale i obecně pro libovolný klíč)&lt;br /&gt;
Odsuneme-li i tento klíč, dojde k vytváření shluků (a nabalovíní dalších klíču na tyto shluky, na obr. skluk od písmene A)&lt;br /&gt;
Dochází také k fragmentaci, je tedy nutné hledat až do prvního prázdného klíče, což je při shlukování a vyšší saturaci tabulky pomalé&lt;br /&gt;
 &lt;br /&gt;
       &lt;br /&gt;
Tento přístup tedy použijeme, pokud vímě, že jsou klíče hodnot rovnoměrně rozmístěny, a že hodnot není více než klíčů, a nazývá se vnitřní zřetězení.&lt;br /&gt;
&lt;br /&gt;
Vnější zřetězení znamená, že ke kažnému klíči přiřadíme seznam hodnot. Nedochází tedy ke kolizím, ale vyhledání hodnoty je O(m), kde m je počet hodnot ke každému klíči, tedy nejhůže O(n) (všechny hodnoty jsou v jednom klíči). Tento způsob však zvládá i situace, kde je více hodnot než klíčů&lt;br /&gt;
&lt;br /&gt;
Rozptýlení klíčů.&lt;br /&gt;
&lt;br /&gt;
Pro vnitřní zřetezení lze použít lepší vyhledáváci (a ukládací) funkci, než lineární posun, třeba kvadratickou fci. Kvadratická funkce se může protonout s jinou kv. fcí s jiným počátkem jen jednou) Tím omezíme clustery a kolize, a ukládání a hledání je rychlejší.&lt;br /&gt;
&lt;br /&gt;
Pro vnější zřetezení, nebo pokud je při vnitřním zřetězení mnoho podobných klíčů, je vhodné použít orákulum, rozptylovou (hashovací) funkci. Ta má 2 vlastnosti:&lt;br /&gt;
&lt;br /&gt;
Namapuje hodnoty do rozsahu počtu klíčů&lt;br /&gt;
Ideálně zruší nebo alespoň naruší vztahy mezi podobnými klíči&lt;br /&gt;
&lt;br /&gt;
Příklad: Slovník se vnitřním zřetězením. Slovo převedeme na číslo součtem ASCII hodnot znaků&lt;br /&gt;
&lt;br /&gt;
Vlastnost 1: na toto číslo použijeme operaci modulo. Tato operace je pomalá (jde o dělení), použijeme tedy ideálně velikosti tabulky, které jsou mocninou 2, a po té je dělení pouhým bitovým posunem&lt;br /&gt;
Vlastnost 2: vazby v tomto postupu existují (například anagramy se namapují do stejného pole). Použijeme tedy například následující postup: (( (1. písmeno * (2k+1) ) + 2. písmeno) * (2k+1)) + ... Tím zrušíme vazby mezi podobnými slovy. (2k+1)  použijeme, protože jde o bitový posun a přičtení 1, což je velmi rychlé a 1 přičítáme, protože by poté modulo ztratilo význam.&lt;br /&gt;
&lt;br /&gt;
Mohli bychom použít i kdyptografické hashování, jako MD5, to je však pro O(1) přístup k seznamům příliš pomalé.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Tabulka_s_p%C5%99%C3%ADm%C3%BDm_adresov%C3%A1n%C3%ADm</id>
		<title>Tabulka s přímým adresováním</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Tabulka_s_p%C5%99%C3%ADm%C3%BDm_adresov%C3%A1n%C3%ADm"/>
				<updated>2014-02-20T06:35:46Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Máme skupinu záznamů, které jsou jednoznačně identifikovány klíčem a mají přiřazenou hodnotu (například slova ve slovníku, nebo seznam studentů podle osobního čísla). Takováto struktura se nazývá ADT Tabulka.&lt;br /&gt;
&lt;br /&gt;
Složitost operací lze podle způsobu implementace rozdělit následovně:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tabulka obsahuje mnoho hodnot vzhledem k počtu klíčů ==&lt;br /&gt;
(např. seznam otázek k SZZ z předmětu PPA2). Zde je vhodné použít pole, otázky jsou číslovány, a tyto čísla použít jako index do pole otázek. Každá otázka pak má Předmět, zadání, .... Hledání v takové tabulce je pak O(1). Do této skupiny by mohly patřit i problémy, kdy je možné prvky v lineárním čase indexovat tak, že je tento index získán v konstantním čase (například den v roce pro adresování stránky v deníku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tabulka obsahuje mnoho klíčů a méně hodnot ==&lt;br /&gt;
(Například počty výskytů slov této otázky. Čěština má cca 300 000 slov, ale v textu jich unikátních bude hrstka). Pro takové problémy se implementace pomocí pole nehodí, protože plýtváme pamětí (vetšina pole bude hodnota 0). &lt;br /&gt;
Pro adresování tedy použijeme například spojový seznam. Vložení klíče je O(1), ale hledání klíče je O(n), protože musíme projít všechny položky a pro &lt;br /&gt;
každou se podívat, jaký klíč obsahuje. &lt;br /&gt;
Toto lze zrychlit použitím například BVS, potom bude hledání O(log n) a zásid také O(log n), kde n je počet klíčů stromu. Pokud bychom měli příklad se slovy v článku, bylo by rychlejší použít například strukturu Trie, která má vyhledávání a zápis závislý na délce slova (za předpokladu, že Trie použije v každém uzlu tabulku s přímým adresováním podle znaku. Použijeme trochu více paměti, ale pořád méně než při ad 1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tabulka obsahuje mnoho hodnot pro menší množství klíčů ==&lt;br /&gt;
Tato možnost se přímým adresováním řešit nedá, klíče nejsou unikátní. Je nutné použít rozptylové tabulky&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Topologick%C3%A9_%C5%99azen%C3%AD</id>
		<title>Topologické řazení</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Topologick%C3%A9_%C5%99azen%C3%AD"/>
				<updated>2014-02-20T06:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Máme množinu prvků, ve které je definována množina dvojic, které jsou uspořádánvy v určitém pořadí. Tuto množinu lze zakreslit jako orientovaný graf, kdy každá hrana reprezentuje pořadí prvků. &lt;br /&gt;
&lt;br /&gt;
Jako příklad může posloužit proces oblékání.&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Topologicke-razeni-1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Dvojice jsou (musíme obléci):&lt;br /&gt;
* Ponožky dříve než boty&lt;br /&gt;
* Spodky dříve než kalhoty&lt;br /&gt;
* Kalhoty dříve než boty&lt;br /&gt;
* Košili dříve než sako&lt;br /&gt;
* a hodinky nezávisle na zbytku&lt;br /&gt;
&lt;br /&gt;
V grafu vidíme, že obsahuje 3 komponenty, a že neobsahuje cykly. Pokud orientovaný graf neobsahuje cykly, nazývá se orientovaný acyklický graf (anglicky DAG, directed acyclyc graph). V takovém grafu lze nalézt uspořádání takové, že prvky budou chronologicky za sebou podle toho, v jakém pořadí je třeba je projít (vykonat jejich akce, obléci daný kus oblečení), např. takto&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Jedním z algoritmů je Topologické řazení pomocí DSF:&lt;br /&gt;
&lt;br /&gt;
Projdeme graf pomocí DFS, a při každé operaci (každém obarvení: nalezení/přesun na vrchol (šedá) a dokončení vyhledávání okolních vrcholů (černá)) pamatujeme čas, ve kterém jsme operaci provedli. První číslo udává &amp;quot;čas&amp;quot; nalezení vrcholu, druhé &amp;quot;čas&amp;quot; zpracování vrcholu.&lt;br /&gt;
Pokud je vrchol dokončen, vložíme jeho prvek jej do zásobníku&lt;br /&gt;
Výběrem všech prvků zásobníku získáme pořadí, ve kterém lze prvky [vykonat, použít, vypsat] tak, že jsou splněny jejich závislosti na poředí vykonání&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Topologicke-razeni-2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Na obrázku je vidět, že seřazení může být různé pro různé výchozí body hledání (v našem případě spodky, košile, sako). Je úplně jedno, v jakém vrcholu začneme graf prohledávat, protože díky ukládání do zásobníku se ve výsledku vždyy seřadí tak, jak potřebujeme. (př: když začneme od kalhot, tak se na dno zásobníku uloží boty a nad ně kalhoty. Tady jsme skončili, takže pokračujeme v prohledávání od jiného nenavštíveného uzlu - třeba od spodků. Ty se tedy uloží nad boty a kalhoty, takže když vybíráme ze zásobníku, dostaneme správně spodky-&amp;gt;kalhoty-&amp;gt;boty. Pokud bychom místo spodků pokračovali třeba ponožkami, nic se nestane, jen bude do této podloupnoosti vložen ještě prvek ponožky: spodky-&amp;gt;ponožky-&amp;gt;kalhoty-&amp;gt;boty, ale posloupnost bude stále zachována taková, aby položky následovaly tak jak mají.)&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Prohled%C3%A1v%C3%A1n%C3%AD_graf%C5%AF</id>
		<title>Prohledávání grafů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Prohled%C3%A1v%C3%A1n%C3%AD_graf%C5%AF"/>
				<updated>2014-02-20T06:35:34Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Barvení grafu ==&lt;br /&gt;
Pro přehlednost při procházení grafem jednostlivé vrcholy obarvujeme&lt;br /&gt;
&lt;br /&gt;
* '''bílá''' - tento vrchol algoritmus ještě nezpracoval&lt;br /&gt;
* '''šedá''' - vrchol byl navštíven, ale ještě se k němu budeme vracet&lt;br /&gt;
* '''černá''' - vrchol je zpracován, už se k němu vracet nebudeme&lt;br /&gt;
&lt;br /&gt;
Na začátku jsou všechny vrcholy samozřejmě bílé a postupně během průchodu je teprve bravujeme.&lt;br /&gt;
&lt;br /&gt;
Prohledávací algoritmus končí v případech, kdy:&lt;br /&gt;
* nalezneme požadovaný vrchol&lt;br /&gt;
* nebo jsou všechny vrcholy grafu obarvené na černo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prohledávání do šírky ==&lt;br /&gt;
(breadth-first search, BFS)  &lt;br /&gt;
&lt;br /&gt;
Realizace pomocí fronty&lt;br /&gt;
&lt;br /&gt;
Vybereme počátecní vrchol, obarvíme na šedo a projdeme všechny jeho sousedy. Nenalezneme-li řešení, obarvíme počáteční vrchol na černo a pokračujeme výběrem každého z jeho sousedů a opet projdeme jejich sousedy, které obarvujeme. Sousedy zatím nevybíráme, zpracováváme nejprve vrcholy právě vybraného vrcholu tak dlouho, dokud tento není obarven na černo.&lt;br /&gt;
&lt;br /&gt;
Lze také k vrcholům ukládat předchudce a pocet hran od pocátecního vrcholu, címž získáme (nejkratší) cestu k počátečnímu vrcholu a její délku. Prohledáním celého grafu získáme BFS strom. Implementace pomocí fronty, složitost O(|H| + |V|).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prohledávání do hloubky ==&lt;br /&gt;
(depth-first search, DFS) &lt;br /&gt;
&lt;br /&gt;
Realizace pomocí zásobníku&lt;br /&gt;
&lt;br /&gt;
Z počátecního vrcholu jdeme do jeho prvního souseda, z něj do jeho prvního souseda atd., které obarvujeme na šedo. Vybíráme ze sousedů vrcholy, které jsou bílé, které okamžite barvíme na šedo. Pokud projdeme všechny vrcholy, obarvíme vrchol na černo. a vracíme se na šedý vrchol.&lt;br /&gt;
Pokračujeme do nalezení hledaného vrcholu nebo prohledání všech.&lt;br /&gt;
&lt;br /&gt;
Prohledáním celého grafu získáme DFS strom. Implementace rekurzí nebo zásobníkem, složitost O(|H|+|V |). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hrany orientovaného grafu: Stromové hrany (patrící do stromu, jejich směr je od výchozího vrcholu), Zpětné hrany (opačná hrana ke hraně stromové, vytváří malý cyklus, směr je do výchozího bodu), dopředné (nemusí ležet ve strome, ale její vyrcholy v něm leží, jakésy zkratky stromem) a križující (opacné k dopredným, nebo hrany mezi stromy lesa). Zpětné a křižující hrany indikují cykly v grafu.&lt;br /&gt;
&lt;br /&gt;
Je-li graf rozdelen do nekolika izolovaných cástí, zbudou po prvním prohledávání bílé vrcholy. Mužeme vybrat jeden jako další pocátecní a znovu z neho spustit vyhledávání, prípadne postup opakovat, pokud zustanou opet bílé vrcholy. Získáme tím les stromů.&lt;br /&gt;
&lt;br /&gt;
Jsou-li grafy orientovány, je vhodné začínat na vrcholu, do kterého nevede hrana, aby nedošlo ke zbytečnému roztržení grafu na komponenty&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Grafy_a_jejich_implementace</id>
		<title>Grafy a jejich implementace</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Grafy_a_jejich_implementace"/>
				<updated>2014-02-20T06:35:27Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Graf je reprezentován množinou vrcholů (uzlů) V, které mohou být spojeny určitým počtem hran H. Graf je poté definován jako G(V,H)&lt;br /&gt;
&lt;br /&gt;
* '''Neorientovaný graf''': Hrany grafu nejsou orientované, tedy pokud vede hrana z uzlu 1 do uzlu 5, vede i z uzlu 5 do uzlu 1 a platí tedy (u1, u2) = (u2, u1)&lt;br /&gt;
* '''Orientovaný graf''': Hrany grafu jsou orientované (jednosměrné), tedy pokud vede hrana z uzlu 1 do uzlu 5, nevede automaticky zpět z uzlu 5 do uzlu 1 a platí tedy (u1, u2) != (u2, u1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Ohodnocený graf''': Každá hrana má přižezenou svoji hodnotu (číslo). Tyto hodnoty pak udávají například délku hrany, propustnost nebo třeba cenu za přechod po dané hraně.&lt;br /&gt;
* '''Neohodnocený graf''': Všechhny hrany grafu jsou si rovny (v podstatě jsou všechny ohodnoceny stejným číslem), takže nemá smysl uchocácat informaci o jejich ohodnocení.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementace grafu pomocí spojového seznamu (seznam sousednosti) ==&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Graf-spojovy-seznam.jpg|500px]]&lt;br /&gt;
&lt;br /&gt;
Máme seznam vrcholů a pro každý z nich máme seznam vrcholů, se kterými sousedí. Lze tak implementovat všechny 3 typy grafů (v obousměrných budou sousednosti v seznamech obou vrcholů sdílejících hranu, ohodnocení vrcholů je uloženo v seznamu vrcholů, ohodnocení hran je v seznamu sousednosti)&lt;br /&gt;
&lt;br /&gt;
Problém metody je v složitosti hledání existence hrany, jelikož musíme procházet seznamy sousednost (Pro velké grafy pomalé, na druhou stranu pro řídké grafy méně pamětově náročné)&lt;br /&gt;
&lt;br /&gt;
== Implementace grafu pomocí matice sousednosti ==&lt;br /&gt;
&lt;br /&gt;
Stejný graf jako v předchozím případě&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Graf-seznam-sousednosti.jpg]] &lt;br /&gt;
&lt;br /&gt;
Vytvoříme matici v*v prvků, kde v je počet vrcholů a hrany reprezentujeme jedničkami, zbytek matice jsou nuly.&lt;br /&gt;
&lt;br /&gt;
Vidíme, že neorientovaný graf produkuje symetrickou matici, je tedy možné horní polovinu zanedbat a ušetřit tak paměť. Věškeré operace jsou O(1) (pokud použijeme 2rozměrné pole), paměťově je však tato implementace náročnější, jelikož alokujeme paměť i pro místa, kde hrany nejsou. Tato metoda je tedy vhodná pro časté vyhledávání ve větších grafech.&lt;br /&gt;
&lt;br /&gt;
Ohodnocení lze provést uložením hodnoty místo jedniček, na diagonále lze ohodnotit vrcholy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// co třeba hledání kostry grafu a podobný vylomeniny?&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Strom,_pr%C5%AFchody_stromem,_bin%C3%A1rn%C3%AD_vyhled%C3%A1vac%C3%AD_stromy</id>
		<title>Strom, průchody stromem, binární vyhledávací stromy</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Strom,_pr%C5%AFchody_stromem,_bin%C3%A1rn%C3%AD_vyhled%C3%A1vac%C3%AD_stromy"/>
				<updated>2014-02-20T06:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Strom je ADT - matematicky jde o typ grafu, který neobsahuje cykly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definice ==&lt;br /&gt;
&lt;br /&gt;
* '''Vrchol (uzel)''' - jeden prvek stromu. Má jednoho předchůdce a 0 - N následovníků.&lt;br /&gt;
* '''Hrana (větev)''' - spojení dvou vrcholů&lt;br /&gt;
* '''List''' - nrchol bez následovníků&lt;br /&gt;
* '''Kořen''' - vrchol, který nemá žádné předchůdce. Z kořene je pak možné se dostat do jakéhokoliv uzlu stromu. Každý strom má jen jeden kořen.&lt;br /&gt;
* '''Podstrom''' - // dopsat&lt;br /&gt;
* '''Cesta stromem''' - cesta od libovolného vrcholu ke kořeni stromu. Tato cesta je ve stromu unikátní.&lt;br /&gt;
* '''Hloubka vrcholu''' - délka cesty od kořene do daného vrcholu.&lt;br /&gt;
* '''Výška stromu''' - nejdelší možná cesta ve stromu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// přidat obrázek s popisem částí stromu&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Strom.jpg]]&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Implementace: &lt;br /&gt;
Objektově - každá prvek má ukazatele Parent a např. pole ukazatelů Childern, výodné, jednoduché&lt;br /&gt;
Polem - složité pro obecné stromy, je nutné ukládat indexy kořenů podstromů, počty podstromů těchto kořenů a data vrcholů jako taková. Speciálně lze implementovat stromy s konstatntním počtem podstromů v každém vrcholu (BVS, Octree, ...), kde je implementace jednodušší&lt;br /&gt;
&lt;br /&gt;
Adresářová struktura, sportovní výsledky, reprezentace stromů v přírodě :), ....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Průchod stromem ==&lt;br /&gt;
&lt;br /&gt;
'''Do šířky''' - Projdeme vrcholy po patrech, tedy kořen, postupně kořeny jeho podstromů, kořeny všech těchto podstromů atd. Jelikož ve stromech obecně neznáme sousedy, musíme se často vracet. Měřením cesty vrcholů však múžeme prohledávání do šířky převést na prohledávání do hloubky, i když ne zrovna elegantní (vyhledáme všechny vrcholy o hloubkách 0, pak 1, pak 2, ...)&lt;br /&gt;
&lt;br /&gt;
'''Do hloubky''' - Procházíme vrcholy do hloubky, tedy dojdeme-li do vrcholu, projdeme jeho podstromy a poté se teprve vracíme&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procházení stromu může být průchod do hloubky dvojího druhu, podle priority operací:&lt;br /&gt;
* '''Preorder''' - Nejprve vyzvedneme data vrcholu a poté projdeme postupně všechny podstromy&lt;br /&gt;
 preorder(node) {&lt;br /&gt;
   print node.value&lt;br /&gt;
   if node.left ≠ null then preorder(node.left) &lt;br /&gt;
   if node.right ≠ null then preorder(node.right)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* '''Postorder''' - Nejprve projdeme všechny podstromy, a poté vyzvedneme data vrcholu&lt;br /&gt;
 postorder(node) {&lt;br /&gt;
   if node.left ≠ null then postorder(node.left) &lt;br /&gt;
   if node.right ≠ null then postorder(node.right)&lt;br /&gt;
   print node.value&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Procházení binárního stromu má navíc ještě jeden způsob:&lt;br /&gt;
* '''Inorder''' - Projdeme levý podstrom, poté vyzvedneme data vrcholu, a poté pravý podstrom. Při výpisu BVS touto metodou dojdeme k seřazenému poli.&lt;br /&gt;
&lt;br /&gt;
== Binární vyhledávací strom (BVS) ==&lt;br /&gt;
&lt;br /&gt;
BVS je binární strom (strom, který má maximálně 2 podstromy v kažném vrholu) vytvořený tak, že kořen levého podstromu každého vrcholu má nižší hodnotu než tento vrchol a ten má nižší hodnotu než kořen pravého podstromu.&lt;br /&gt;
&lt;br /&gt;
Pri přidáváni vrcholu začínáme u kořene, a rozhodujeme se, kterou hranou jít dále, tedy je li vkládaný prvek menší , nebo větší než tento kořen. Takto postupujeme i vybraným podstromem až najdeme místo, kam vrchol umístit. Umístěný vrchol je vždy listem stromu.&lt;br /&gt;
&lt;br /&gt;
Mazání je složitější. Nejprve vrchol najdeme ve stromu a podle toho jaký je:&lt;br /&gt;
* Pokud je listem, je to triviální&lt;br /&gt;
* Pokud vrchol má pouze jeden podstrom, vrchol smažeme a na jeho místo umístíme kořen jeho (jediného) podstromu&lt;br /&gt;
* Pokud má dva, vydáme se doprava a poté jdeme stále doleva dokud nenarazíme na list, který smažeme, ale jeho hodnotu přiřadíme původně mazanému vrcholu.&lt;br /&gt;
&lt;br /&gt;
Tento strom je nevyvážený, tedy může nastat situace, kdy bude jeden podstrom kořenu mít výrazně větší výšku než podstrom druhý.&lt;br /&gt;
První vložený prvek bude vždy kořen stromu. Při načítání prvků do stromu je tedy vhodné alespoň pro tento prvek nalézt medián.&lt;br /&gt;
&lt;br /&gt;
Přidání prvku do pole a mazání je maximálně O(n) (pro strom, který byl vytvořen ze seřazené posloupnosti - je to tedy pouze lineární spojový seznam), očekávaná složitost operací je však O(log2 n) jelikož je strom v každém vrcholu rozdělen na 2 skupiny hodnot.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Z%C3%A1sobn%C3%ADk,_fronta,_seznam</id>
		<title>Zásobník, fronta, seznam</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Z%C3%A1sobn%C3%ADk,_fronta,_seznam"/>
				<updated>2014-02-20T06:35:14Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Všechny tyto ADT implementují IsEmpty (prázdná struktura) a Size (pošet prvků ve struktuře)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zásobník ==&lt;br /&gt;
&lt;br /&gt;
Interface: operace Push, Pop, Peek&lt;br /&gt;
* '''Push''' vkládá data do zásobníku za sebe&lt;br /&gt;
* '''Pop''' vybírá nejpozději  vložená data&lt;br /&gt;
* '''Peek''' vrátí nejpozději vložená data bez výběru prvku ze struktury&lt;br /&gt;
= LIFO pamět (Last In First Out)&lt;br /&gt;
 &lt;br /&gt;
Všechny operace jsou O(1)&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Zasobnik.jpg]]&lt;br /&gt;
 &lt;br /&gt;
Head: vrchol zásobníku&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Implementace objektově: &lt;br /&gt;
* Prvky (objekty) obsahují data a ukazují na nižžší  prvky v zásobníku (na prvky pod sebou)&lt;br /&gt;
* '''Konstruktor:''' Vytvoříme ukazatel Head, který nastavíme na null&lt;br /&gt;
* '''Modifikátor:''' Push vytvoří pro data nový prvek, který ukazuje na prvek Head (Head bude předchozí), a změní ukazatel Head na vytvořený prvek&lt;br /&gt;
* '''Selektor:''' Peek vrátí data prvku Head, pokud Head != null. Pop vrátí stejná data jako Peek, ale před návratem změní ukazatel Head na předchozí prvek (Head = Head.Previous)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Implementace na poli:&lt;br /&gt;
* Máme pole typu stejného jako data&lt;br /&gt;
* '''Konstruktor:''' Alokace pole a indexu Head, nastavení Head na -1&lt;br /&gt;
* '''Modifikátor:''' Push zvýší index Head o 1 a zapíše data do pole na tento index. Pokud je index mimo pole, zvětšení pole (např. 2x), a po té zápis&lt;br /&gt;
* '''Selektor:''' Peek vrátí prvek pole pod indexem Head, pokud Head &amp;gt;= 0. Pop jako peek, ale před návratem provede Head--, pokud Head &amp;gt;= 0.&lt;br /&gt;
&lt;br /&gt;
== Fronta ==&lt;br /&gt;
&lt;br /&gt;
Interface: operace Push, Pop, Front&lt;br /&gt;
* '''Push''' vkládá data do fronty za sebe&lt;br /&gt;
* '''Pop''' vybírá nejdříve vložená data&lt;br /&gt;
* '''Peek''' vrátí nejdříve vložená data bez výběru prvku ze struktury&lt;br /&gt;
= FIFO pamět (First In First Out)&lt;br /&gt;
 &lt;br /&gt;
[[Soubor:Fronta.jpg]]&lt;br /&gt;
&lt;br /&gt;
First: začátek fronty; Last: konec fronty&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Implementace objektově: &lt;br /&gt;
* Prvky obsahují data a ukazují na následující prvky fronty&lt;br /&gt;
* '''Konstruktor:''' Vytvoříme pouze ukazatele First a Last, ukazující na null.&lt;br /&gt;
* '''Modifikátor:''' Push vytvoří pro data nový prvek, upraví prvek Last (pokud != null) tak, aby ukazoval na tento prvek, a změní ukazatel Last na tento prvek. Je-li ukazatel First nastaven na null, nastaví tento také na vytvořený prvek.&lt;br /&gt;
* '''Selektor:''' Front vrátí data prvku First, pokud First != null. Pop vrátí stejná data jako Front, ale před návratem změní ukazatel First na následující prvek, pokud First != null (First = First.Next)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Implementace na poli (cyklicky):&lt;br /&gt;
Máme pole typu stejného jako data a indexy First a Last. Indexy neukazují přímo do pole, nýbrž je proveden přepočet (Index mod Delka pole)&lt;br /&gt;
abychom využili celé pole. Tato fronta má omezenou délku.&lt;br /&gt;
* '''Konstruktor:''' Alokace pole a indexů, nastavení Last na -1 a First na -1&lt;br /&gt;
* '''Modifikátor:''' Pokud ((Last + 1) mod Delka) != (First mod Delka), Push provede Last++ a zapíše data do pole na tento index, jinak chyba (plná fronta). Pokud First = -1, pak First = 0 (první prvek).&lt;br /&gt;
* '''Selektor:''' Front vrátí prvek pole pod indexem First, pokud First &amp;lt;= Last. Pop jako Front, ale před návratem provede First++.&lt;br /&gt;
&lt;br /&gt;
Speciálním případem je například prioritní fronta, která řadí prvky ve frontě podle priority&lt;br /&gt;
&lt;br /&gt;
== Seznam ==&lt;br /&gt;
 &lt;br /&gt;
Interface - Iterator nad seznamem: Add, Remove, Get; First, Next, IsLast, případně další (Previous, Last, IndexOf, ...)&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Seznam.jpg]]&lt;br /&gt;
&lt;br /&gt;
* '''Add''' vkládá data na pozici iterátoru. Složitost dle implementace.&lt;br /&gt;
* '''Remove''' maže data na pozici iterátoru&lt;br /&gt;
* '''Get''' vrátí data na pozici iteratoru&lt;br /&gt;
* '''First''' vrátí iterátor na začátek seznamu&lt;br /&gt;
* '''Next''' posune iterátor dále&lt;br /&gt;
* '''IsLast''' indikuje koncová prvek&lt;br /&gt;
* (Previous v obousměrných seznamech posune iterator na předchozí prvek)&lt;br /&gt;
* (Last posune iterator na poslední prvek)&lt;br /&gt;
* (IndexOf vyhledá prvek ve struktuře)&lt;br /&gt;
= struktura, do které je možné libovolně zapisovat a číst (na libovolné pozici)&lt;br /&gt;
 &lt;br /&gt;
Iterator: ukazatel do struktury&lt;br /&gt;
&lt;br /&gt;
Implementace objektově - nástřel: &lt;br /&gt;
&lt;br /&gt;
[[Soubor:Zasovnik-fronta-seznam-objektove.jpg]]&lt;br /&gt;
&lt;br /&gt;
Prvky ukazují na následující prvky seznamu. Iterátor je dobré implementovat tak, že ve skutečnosti ukazuje na předchozí prvek (Pokud tedy seznam není obousměrný, pak máme metodu Previous a je to jedno). Metoda add vloží prvek za prvek, na který ukazuje iterátor tak, že pouze upraví ukazatele prvků:&lt;br /&gt;
 &lt;br /&gt;
Remove je opačný proces, Get vrátí data (Tedy Iterator.Next.Data), První prvek seznamu si uložíme, abychom se mohli rychle vracet, stejně jako poslední prvek. Next provede Iterator.Next = Iterator.Next.Next. Kontrolujeme, zda nejsme mimo seznam.&lt;br /&gt;
&lt;br /&gt;
* Obousměrný seznam: Prvky mají i ukazatele na předchozí prvky, a je tedy možné se po nich pohybovat na obě strany.&lt;br /&gt;
* Kruhový seznam: Poslední prvek neukazuje na null, ale na první prvek. Tyto seznamy jsou použitelné ve speciálních případech (například nastavení segmentů sedmisegmentovky pro digitální hodiny)&lt;br /&gt;
&lt;br /&gt;
Implementace na poli (nástřel):&lt;br /&gt;
Pole má nevýhodu, že je nutné přesunout prvky doprava od iterétoru, pokud vkládáme prvky. Při mazání lze prvky posunout doleva, nebo do pole uložit hodnotu, která se zcela jistě nebude v poli nebude vyskytovat, nebo vytvořit stínové pole, ve kterém si smazané prvky označíme, a při posunu iterátoru je poté vynecháme. Tento přístup je dobrý pokud pole často upravujeme.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Abstraktn%C3%AD_datov%C3%A9_typy</id>
		<title>Abstraktní datové typy</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Abstraktn%C3%AD_datov%C3%A9_typy"/>
				<updated>2014-02-20T06:34:35Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ADT je matematický model dat a operace nad těmito daty. Využívá základních datových typů pro konstrukci komplexnějších ADT, které využíváme pro snadnější organizaci dat a často pro optimalizaci algoritmů. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Abstraktní datový typ ==&lt;br /&gt;
&lt;br /&gt;
* je zcela oddělený blok, s klientským programem komunikuje pomocí rozhraní&lt;br /&gt;
* je nezávislý na implementaci, na venek se projevuje jen veřejnými metodami&lt;br /&gt;
* vše ostatní, kromě ovládacích metod, je uživateli skryto (samotná data a přístup k nim např.) (integrita)&lt;br /&gt;
* je (klientsky) nezávislým blokem, může jej využívat kdokoliv, kdo zná rozhraní (pokud je ADT tedy třeba v DLL knihovně, můžeme jej používat i z jiných jazyků) (modularita)&lt;br /&gt;
* je pevně a jasně definován&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ADT definuje a podporuje tyto operace&lt;br /&gt;
* '''kostruktor''' - vytvoří istanci ADT&lt;br /&gt;
* '''selektor''' - vyhledá žádaný prvek (indexer, At(), Pop()...)&lt;br /&gt;
* '''modifikátor''' - upraví data ve struktuře (indexer, Push(), Add()...)&lt;br /&gt;
&lt;br /&gt;
Těmito operacemi jsou data jako taková uživateli skryta. Dynamická množina - množina dat, které předchozí operace podporuje, základ většiny ADT&lt;br /&gt;
&lt;br /&gt;
Příklady ADT:&lt;br /&gt;
* Seznam&lt;br /&gt;
* Fronta&lt;br /&gt;
* Zásobník&lt;br /&gt;
* Trie&lt;br /&gt;
* Binární vyhledávací strom&lt;br /&gt;
* Hashmapa&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
ADT je často využíváno návrhovými vzory. V některých jazycích lze ADT vytvořit jako generické, tedy vhodné pro uchování libovolného datového typu (např List&amp;lt;int&amp;gt;). Tyto generické ADT jsou také často v jazyce již implementovány jako knihovny (C# v Generics, C++ v Standard Template Library). U jazyků, které toto nepodporují lze využít Objekt, a ten přetypovávat, což není ideální, ale funguje. U jazyků nemajících objekt je to horší, musíme přijít s vlastní specifickou implementací.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Rekurze</id>
		<title>Rekurze</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Rekurze"/>
				<updated>2014-02-20T06:34:29Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rekurzí rozumíme sebevolání, tedy kód, který volá sám sebe či svojí část (přímá rekurze), případně volá kód, který posléze volá kód volající (nepřímá rekurze).&lt;br /&gt;
&lt;br /&gt;
Rekurze je vhodná pro řešení rekurzivních problémů (například výpočet faktoriálu nebo Fibonacciho posloupnosti, fraktály), je však paměťově velmi náročný (každé rekurzivní volání vyžaduje vlastní paměťový prostor), doporučuje se tedy pouze pro vhodné problémy (rekurzivní výpis řetězce na obrazovku je nesmysl).&lt;br /&gt;
&lt;br /&gt;
Rekurze musí mít následující podmínky: &lt;br /&gt;
* musí být konečná, tedy musí existovat vstup, pro který rekurzivní funkce nevolá sama sebe, tedy musí být testována tato konečnost před voláním sebe sama&lt;br /&gt;
* problém se musí rekurzí zjednodušovat, aby rekurze ke koncové podmínce dospěla (případně můžeme definovat maximální počet vnoření jako pojistku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Typy rekurze ==&lt;br /&gt;
&lt;br /&gt;
* '''Přímá''' - metoda volá sama sebe&lt;br /&gt;
* '''Nepřímá''' - metoda volá metodu, která volá zpětně ji&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Lineární''' - metoda volá pouze jednu svoji kopii (faktorial)&lt;br /&gt;
* '''Stromová''' - metoda volá více svých kopií (Fibonacci, průchod adresářovou strukturou, často Divide &amp;amp; Conquer algoritmy)&lt;br /&gt;
&lt;br /&gt;
Rekurze však často umožňuje zjednodušení kódu a ušetření času při programování. Často lze rekurzivní problémy řešit také čistě iteračním algoritmem, nebo použitím zásobníku.&lt;br /&gt;
&lt;br /&gt;
Příklad: Procházení adresářové struktury.&lt;br /&gt;
Vytvoříme metodu ProjdiAdresář(string cesta);&lt;br /&gt;
&lt;br /&gt;
Iteračně (nesmysl?):&lt;br /&gt;
&lt;br /&gt;
# Vytvoříme ukazatel na položku adresářové struktury ukazující &amp;quot;před?&amp;quot; výchozí adresář a uložíme tuto hodnotu do vedlejší proměnné&lt;br /&gt;
# Posuneme ukazatel na další položku adresáře&lt;br /&gt;
# Je-li pod ukazatelem označená položka, nebo prázdno, vrátíme se na předchozí položku a zpět na 2, nebo ukončíme, pokud jsme na uložené položce &amp;quot;před?&amp;quot;&lt;br /&gt;
# Je-li pod ukazatelem adresář, označíme jej jako zpracovaný (i když je otázka jak) a posuneme ukazatel na jeho první položku&lt;br /&gt;
# Je-li pod ukazatelem soubor, [otevře, vypíše název, zpracuje, přidá do vlastní datové struktury,...], a označíme soubor jako zpracovaný &lt;br /&gt;
# Zpět na bod 2&lt;br /&gt;
&lt;br /&gt;
Zásobníkem: &lt;br /&gt;
&lt;br /&gt;
# Načte obsah adresáře 'cesta' do zásobníku&lt;br /&gt;
# Prochází položky zásobníku:&lt;br /&gt;
## Je - li položka soubor, [otevře, vypíše název, zpracuje, přidá do vlastní datové struktury,...]&lt;br /&gt;
## Je - li položka adresář, načte jeho obsah do zásobníku&lt;br /&gt;
# Opakuje body 2 a 3 dokud není zásobník prázdný&lt;br /&gt;
&lt;br /&gt;
Rekurzivně:&lt;br /&gt;
&lt;br /&gt;
# Načíst obsah adresáře 'cesta' a prochází jednotlivé položky&lt;br /&gt;
# Narazí - li na soubor, [otevře, vypíše název, zpracuje, přidá do vlastní datové struktury,...]&lt;br /&gt;
# Narazí - li na adresář, volá sama sebe na  jeho cestu&lt;br /&gt;
&lt;br /&gt;
Vidíme, že pro rekurzi neimplementujeme vlastní zásobník (viz však níže), a kód je přehlednější (Rekurze cca 5 řádek, iteračně mnohem více)&lt;br /&gt;
&lt;br /&gt;
Pár slov k implementaci rekurze:&lt;br /&gt;
V imperativním programování je většinou rekurze vnitřně řešena jak jinak než na zásobníku, jelikož je stav volající funkce uložen na vnitřní zásobník. Technicky vzato je tedy rekurze nahrazena zásobníkovým způsobem. Pri chybě rekurze (nesplnění koncové podmínky) většina jazyků vyhodí Stack Overflow (přetečení zásobníku) případně Access violation (Chyba přístupu do chráněné paměti), záleží na způsobu vnitřní implementace zásobníku.&lt;br /&gt;
&lt;br /&gt;
// http://www.abclinuxu.cz/clanky/ruzne/komiks-xkcd-244-stolni-rpg pro ty, to ví co je Dungeons &amp;amp; Dragons&lt;br /&gt;
&lt;br /&gt;
== Příklady ==&lt;br /&gt;
&lt;br /&gt;
Výpočet faktoriálu: &lt;br /&gt;
&lt;br /&gt;
 int faktorial(int f) {&lt;br /&gt;
   if (f &amp;lt;= 1) &lt;br /&gt;
     return 1;&lt;br /&gt;
   else &lt;br /&gt;
     return f * faktorial(f - 1);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Fibonacciho posloupnost:&lt;br /&gt;
&lt;br /&gt;
 int fibonacci(int n) {&lt;br /&gt;
   if (n &amp;lt;= 2)&lt;br /&gt;
    return 1;&lt;br /&gt;
  else&lt;br /&gt;
    return fibonacci(n - 1) + fibonacci(n - 2);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Anal%C3%BDza_program%C5%AF</id>
		<title>Analýza programů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Anal%C3%BDza_program%C5%AF"/>
				<updated>2014-02-20T06:34:21Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Analýza programu se zabývá nároky programu na zdroje, tedy čas, paměť, šířka pásma... Máme-li problém, lze pro jeho řešení zpravidla použít více algoritmů, a každý algoritmus může mít několik implementací. Analýza programů se zabývá právě vztahem implementace řešení původního problému vzhledem k požadovanému zdroji.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Časová náročnost ==&lt;br /&gt;
&lt;br /&gt;
Nejčastěji nás zajímá časová náročnost programu. Analyzujeme, jakou dobu bude implementovanému algoritmu trvat výpočet. Tuto dobu ovlivňuje způsob implementace (počet nutně provedených operací) a velikost vstupních dat (počet prvků, které algoritmus zpracovává, případně jejich uspořádání). Definujeme elementární čas pro všechny operace c&amp;lt;sub&amp;gt;operace&amp;lt;/sub&amp;gt; a jejich skádáním počítáme celkový čas potřebný pro provedení algoritmu. &lt;br /&gt;
&lt;br /&gt;
Příklad: Naplnění již alokovaného pole náhodnými čísly (c#)&lt;br /&gt;
&lt;br /&gt;
 for (int i = 0, i &amp;lt; pole.Length; i++)&lt;br /&gt;
 {&lt;br /&gt;
   pole[i] = rand.Next();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* máme pole délky n = pole.Length:&lt;br /&gt;
* alokace proměnné trvá c&amp;lt;sub&amp;gt;aloc&amp;lt;/sub&amp;gt;&lt;br /&gt;
* operace přiřazení trvá c&amp;lt;sub&amp;gt;přiřazení&amp;lt;/sub&amp;gt;&lt;br /&gt;
* operace porovnání trvá c&amp;lt;sub&amp;gt;porovnání&amp;lt;/sub&amp;gt;&lt;br /&gt;
* operaci inkrementace lze definovat jako c&amp;lt;sub&amp;gt;inkrement&amp;lt;/sub&amp;gt; = c&amp;lt;sub&amp;gt;přiřazení&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;součet&amp;lt;/sub&amp;gt;&lt;br /&gt;
* řekněme, že generování náhodného čísla trvá konstantní čas c&amp;lt;sub&amp;gt;rand&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Inicializace cyklu for: alokace + přiřazení = c&amp;lt;sub&amp;gt;aloc&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;přiřazení&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Běh cyklu: porovnání (i &amp;lt; length) + přiřazení (do pole) + náh. číslo + inkrementace (i++) = c&amp;lt;sub&amp;gt;porovnání&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;přiřazení&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;rand&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;inkrement&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Cyklus for proběkne n-krát, tedy: n * ( c&amp;lt;sub&amp;gt;porovnání&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;přiřazení&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;rand&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;inkrement&amp;lt;/sub&amp;gt; )&lt;br /&gt;
* Celkem: c&amp;lt;sub&amp;gt;aloc&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;přiřazení&amp;lt;/sub&amp;gt; +  n * ( c&amp;lt;sub&amp;gt;porovnání&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;přiřazení&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;rand&amp;lt;/sub&amp;gt; + c&amp;lt;sub&amp;gt;inkrement&amp;lt;/sub&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
== Asymptotická složitost ==&lt;br /&gt;
&lt;br /&gt;
Ve většině případů neznáme čas potřebný pro konstantní operace, ale víme, že je velmi malý. Dobu výpočtu předchozího příkladu můžeme tedy přepsat na '''a''' + '''n''' * '''b''', kde '''a''' a '''b''' jsou doby, které mají určitou délku, která nás však přísliš nezajímá.&lt;br /&gt;
&lt;br /&gt;
Více než doba výpočtu nás tedy zajímá počet operací, které je třeba vykonat (stejně budou operace na každém systému vykonávány jinou dobu (PC vs. mobilní telefon např.)). Složitostí programu myslíme právě počet operací potřebný pro výpočet vzhledem k počtu prvků na vstupu algoritmu, omezený shora a/nebo zdola. Tato složitost se pro libovolný počet prvků asymptoticky blíží k určité funkci. Nás zajímá, ke které.&lt;br /&gt;
Rozlišujeme také složitost algoritmu a složitost problému (ta by měla patřit do otázky PPA1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Theta notace''' Θ(f(x)) vyjadřuje A.S., omezenou složitostní funkcí c&amp;lt;sub&amp;gt;1,2&amp;lt;/sub&amp;gt; * f(x) shora, resp zdola. Hledáme tedy 2 konstatnty, pro které je analyzovaná složitost omezena.&lt;br /&gt;
&lt;br /&gt;
Tato notace říká, že algoritmus nebude asymptoticky složitější než c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; * f(x), a nebude rychlejší než c&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; * f(x).&lt;br /&gt;
To znamená, že problém lze řešit algoritmem, který nebude asymptoticky složitější než c&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; * f(x), ale zároveň nikdy nebude lepší než c&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; * f(x).&lt;br /&gt;
&lt;br /&gt;
'''Omikron notace''' O(f(x)) vyjadřuje A.S. omezenou funkcí c * f(x) pouze shora. Jinými slovy, jde o maximální možnou složitost algoritmu. Jde o první podmínku theta notace. &lt;br /&gt;
&lt;br /&gt;
'''Omega notace''' Ω(f(x)) vyjadřuje A.S. omezenou funkcí c * f(x) pouze zdola. Říká, že algoritmus pro alespoň jeden vstup bude této složitosti. Druhá podmínka theta notace.&lt;br /&gt;
&lt;br /&gt;
Pokud platí omikron a omega notace pro stejnou f(x), mluvíme o theta notaci.&lt;br /&gt;
&lt;br /&gt;
Konstanty v notaci zanedbáváme, jelikož vzhledem k většímu n nehrají roli. Sčítáním složitostí tedy nedochází k jejich zhoršení, jsou-li stejného řádu (např n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = 2n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; =&amp;gt; n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;, 200 operací je asymptoticky stejné jako 100, ale n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; =&amp;gt; n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; ,  100 * 100 operací je vzhledem k  100 * 100 * 100 zanedbatelné).&lt;br /&gt;
&lt;br /&gt;
Předchozí příklad je tedy složitosti  Θ(n) , jelikož je vždy lineární vzhledem k délce pole (netrvá kratší, ani delsí dobu/počet operací)&lt;br /&gt;
&lt;br /&gt;
== Očekávaná složitost ==&lt;br /&gt;
&lt;br /&gt;
Většina algoritmů je asymptoticky omezena pro extrémní případny na vstupu (např. Quicksort je Ω(n) (pole již seřazeno) a O(n2) (pole je seřazeno opačně)). Chování algoritmu má však očekávanou složitost, která nastává pro většinu případů (jak víme O(n logn) pro QuickSort). Využívá se také Theta/Omikron/Omega notací.&lt;br /&gt;
&lt;br /&gt;
Je-li algoritmus závislý na vstupních datech (resp. na jejich uspořádání), a potřebujeme, aby složitost byla pokud možno vždy očekávaná, lze využít náhodného přeuspořádání dat na vstupu (za předpokladu, že je to možné - např. pro řazení ano, pro výpis znaků na obrazovku evidentně ne). Toto přeuspořádání může být konstatní složitosti (např 100x přeházíme vzájemně prvky pole s náhodnými indexy pokud je pole rozumné odpovídající délky), případně lineární, složitost algoritmu tedy neovlivňuje (za předpokladu, že algoritmus samotný není očekávané sublineární časové složitosti).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klasifikace složitosí ==&lt;br /&gt;
&lt;br /&gt;
'''Polynomiální''' - složitost O(n * c) kde c je konstanta. Polynomiální algoritmy jsou použitelné. Ideální jsou algoritmy rychlejší (lineární, logaritmické,...), ne vždy je však možné takový algoritmus vymyslet.&lt;br /&gt;
&lt;br /&gt;
'''Exponenciální''' - složitost O(c&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;). Tyto algoritmy nejsou příliš dobré, a je vhodné se zamyslet a pokusit se vymyslet jiný, polynomiálně složitý algoritmus. Zpravidla algoritmy hrubé síly jsou této složitosti, jelikož procházejí všechny kombinace vstupu a hledají řešení. Pro malé n jsou však použitelné díky menší režii a přípravě, paměťovým nárokům atd.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Postupy výše lze aplikovat i na složitosti paměťové, šířky pásma, ...&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Spr%C3%A1vnost_program%C5%AF</id>
		<title>Správnost programů</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Spr%C3%A1vnost_program%C5%AF"/>
				<updated>2014-02-20T06:34:08Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Testováním programu, tj. ověřením, že pro daný vstup získáme správný výsledek, nemůžeme obecně prokázat správnost programu. Množství vstupů je většinou tak veliké, že testování není možné ani za použití velice rychlých počítačů. Na druhé straně testování může alespoň prokázat chybu v programu. Protože empirickým testováním nemůžeme zaručit správnost programu, musíme ho nahradit analytickým přístupem pro porozumění správnosti programu. Sekvence příkazů (přiřazení, alternativy a cyklu) umožňuje dokázání správnosti programu tak, že můžeme napsat tvrzení o hodnotách proměnných před vykonáním příkazu, které nazýváme předpoklad a tvrzení po jeho vykonání, které nazýváme důsledek.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Příkazy sekvenčně ==&lt;br /&gt;
&lt;br /&gt;
Například pokud máme dva příkazy sekvenčně za sebou, tak vyjdeme z požadovaného&lt;br /&gt;
důsledku druhého příkazu. Na základě důsledku stanovíme požadovaný předpoklad pro druhý&lt;br /&gt;
příkaz, což je také požadovaný důsledek pro první příkaz atd. až získáme hodnoty možných&lt;br /&gt;
vstupů.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Příkazy alternativy ==&lt;br /&gt;
&lt;br /&gt;
Příkazy alternativy zachovávají sekvenční vykonávání příkazu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Příkazy cyklu ==&lt;br /&gt;
&lt;br /&gt;
Pro pochopení příkazů opakování zavedeme pojem invariant cyklu.&lt;br /&gt;
Pro invariant cyklu musíme obecně ukázat tři vlastnosti:&lt;br /&gt;
* '''Inicializace''' - je splněn před vykonáním prvního cyklu.&lt;br /&gt;
* '''Udržování''' - je-li splněn pře vykonáním cyklu, zůstává splněn i po něm.&lt;br /&gt;
* '''Skončení''' - když příkaz cyklu skončí, invariant nám ukáže správnost algoritmu (dokážeme-li, že inicializace platí, a cyklus je udržován pro všechny iterace).&lt;br /&gt;
&lt;br /&gt;
Přiklad na řazeni pole vkládáním:&lt;br /&gt;
* '''Inicializace''': Po začátečním přiřazení i = 1 je pole s prvky s indexy 0, ..., i-1 osahující jeden prvek triviálně seřazeno.&lt;br /&gt;
* '''Udržování''': Cyklus while posouvá již seřazené prvky a[i-1], a[i-2], ... o jednu pozici doprava dokud se nenajde správné místo pro a[i]. Výsledkem je, že prvky pole a[0] ... a[i] jsou seřazeny. Invariant je tedy splněn i pro následující opakování, kdy i je v hlavičce cyklu inkrementováno.&lt;br /&gt;
* '''Skončení''': Cyklus for skončí když i=n, kde n je počet prvků pole. Dosazením do textu invariantu cyklu dostáváme, že prvky s indexy 0 ... n-1 obsahují seřazené původní prvky pole, co je to co jsme požadovali.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Spojov%C3%A9_datov%C3%A9_struktury</id>
		<title>Spojové datové struktury</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Spojov%C3%A9_datov%C3%A9_struktury"/>
				<updated>2014-02-20T06:33:58Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pokud potřebujeme ukládat data do paměti a nevíme předem, kolik jich bude (kolik prvků bude nutné uložit), nebo mění-li se v runtimu jejich počet, používáme spojové datové struktury. Každý prvek - záznam - struktury je reprezentován např. jako objekt, který ukazuje na svého následovníka (ukazatel, pointer), případně na další objekty (předchozí, začátek...). Ukazatel je vlastně adresa objektu, takže pomocí něho můžeme k jiným objektům přistupovat. &lt;br /&gt;
&lt;br /&gt;
Vyhledávání prvků struktury je většinou iterační, posunujeme se z jednoho objektu na druhou (na rozdíl od pole, kde přistupujeme přímo, indexem). Díky tomu je vyhledávání ve spojových datových strukturách pomalejší než v polích (kde je O(1)), ale zato není potřeba předem alokovat velké množství paměti, kterou si spojová datová struktura bere až za běhu programu (na rozdíl od statickéého pole, kde se alokuje při spuštění).&lt;br /&gt;
&lt;br /&gt;
Jednotlivé záznamy mohou obsahovat metody pro operace se strukturou (zápis, vložení, čtení, posun po prvcích) a, pokud vyžadujeme dědičnost, je možné implementovat spojové struktuře rozhraní, které potřebné operace implementuje.&lt;br /&gt;
&lt;br /&gt;
Příkladem jsou:&lt;br /&gt;
* fronty&lt;br /&gt;
* zásobníky&lt;br /&gt;
* seznamy (jednosměrné, obousměrné)&lt;br /&gt;
* stromy&lt;br /&gt;
* skip-list&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Objekt,_t%C5%99%C3%ADda</id>
		<title>Objekt, třída</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Objekt,_t%C5%99%C3%ADda"/>
				<updated>2014-02-20T06:33:31Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Třída ==&lt;br /&gt;
&lt;br /&gt;
'''Třída:''' Elementární stavební prvek objektově orientovaného programování. Obsahuje předpis, podle kterého lze vytvořit instanci třídy - objekt. Obsahuje členské atributy a metody. &lt;br /&gt;
&lt;br /&gt;
'''Zapouzdření:''' Třída zapouzduje atributy a funkce jako &amp;quot;její&amp;quot;. Na venek komunikuje pomocí rozhraní, nebo odhaluje některé atributy či metody pomocí přístupových práv, většinou&lt;br /&gt;
* Public - veřejné, k třídě či jejím public atributům a metodám lze přistupovat odkudkoliv&lt;br /&gt;
* Protected - třídě či jejím protected atributům  a metodám lze přistupovat pouze z ní (this v případě objektu, statický přístup) nebo z odděděných tříd&lt;br /&gt;
* Private - třídě či jejím private atributům a metodám lze přistupovat pouze z ní&lt;br /&gt;
&lt;br /&gt;
Některé jazyky podporují i další práva, např Internal v jazyce C#, který dovoluje přistupovat k třídě z její assembly (aplikace, ddl knihovna,...)&lt;br /&gt;
&lt;br /&gt;
'''Typy tříd:'''&lt;br /&gt;
* &amp;quot;Klasická&amp;quot; třída - dovoluje instancování na objekty, každá instance dostane přidělenu vlastní paměť&lt;br /&gt;
* Statická třída a členové - klíčové slovo static - Třída, která není instancovatelná, a její metody jsou přístupné pouze statickým způsobem, tedy Třída.Metoda() (nikoliv instanceTřídy.Metoda()). Klasická třída může obsahovat statické členy, které jsou pro včechny případné instance společné (například static parametr počet instancí, který se v konstruktoru zvýší). V jazycích, které statické třídy nepodporují se používá návrhový vzor singleton.&lt;br /&gt;
* Abstraktní třída - abstract - obsahuje abstraktní metody, není instancovatelná. Je nutné od ní oddědit a abstraktní metody doimplementovat (např abstraktní třída Čtečka s metodou Čti(), od které dědí FlashČtečka, DiskČtečka, CDROMČtečka....(To není zrovna dobrý příklad, jelikož čtení provádí OS, ale jako idea je to OK))&lt;br /&gt;
* Koncová třída (final v Javě, sealed v C#, v C++ není) - třída, kterou nelze dědit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Objekt ==&lt;br /&gt;
&lt;br /&gt;
'''Objekt:''' Instance třídy, obraz třídy v paměti, referenční datový typ. Přebírá atributy a metody své třídy. Je nutné jej vytvořit pomocí operátoru new, případně uvolnit pomocí většinou delete (pokud není garbage collector). &lt;br /&gt;
&lt;br /&gt;
'''Třída vs Struktura:''' Třída a struktura (struct, record,...) mohou mít společné vlastnosti. Rozdíly se projevují podle jazyka, většinou je však platný ten rozdíl, že členské prvky struktury jsou public zatímco členské prvky třídy jsou private. V C# je další rozdíl v uložení (třída v paměti, struktura na zásobníku). Java struktury nemá, používá se final class&lt;br /&gt;
&lt;br /&gt;
'''Konstruktor a destruktor:''' Metoda, která inicializuje, respektive uvolňuje třídu do/z paměti. Většinou nastavuje atributy třídy na výchozí hodnoty.&lt;br /&gt;
&lt;br /&gt;
'''Gettery a Settery:''' Veřejné metody, které nastavují privátní atributy objektu či třídy. Používáme je, abychom zamezili entitám využívající atributy třídy nastavit tyto atributy na nesmyslné hodnoty.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Vykon%C3%A1n%C3%AD_programu</id>
		<title>Vykonání programu</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Vykon%C3%A1n%C3%AD_programu"/>
				<updated>2014-02-20T06:32:44Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vykonávání programu je hlavní činnost počítače. Hlavními částmi, které se podílí na výpočtu, jsou procesor a hlavní paměť.&lt;br /&gt;
V hlavní paměti je uložen program ve strojovém kódu jako posloupnost instrukcí a dat (von Neumannova koncepce ). V procesoru (CPU) se vykonávají instrukce, sekvenčně, pokud není pořadí změněno instrukcemi skoku. Programy lze tedy větvit na základě podmínek a pořadí vykonávání instrukcí je závislé na jejich splnění.&lt;br /&gt;
&lt;br /&gt;
Drtivá většina programů napsána ve vyšších jazycích, je proto nutné je upravit tak, aby jim počítač rozuměl, tedy jednotlivé příkazy převést na instrukce procesoru. K tomu existují 2 postupy:&lt;br /&gt;
&lt;br /&gt;
'''Kompilace:'''&lt;br /&gt;
Program je přeložen najednou do strojové podoby, která je platformově závislá. Operační systém tento program nahraje do operační paměti a spustí. O překlad se stará překladač nebo kompilátor, který přeloží příkazy vstupního souboru na instrukce. Jelikož je v konvenčních pratformách použito jednoho adresního prostoru pro jednu aplikaci, některé prog. jazyky také vyžadují také linker, který převádí adresy jednotlivých funkcí a instrukcí (obsažených v jednotlivých modulech programu) z abstraktní podoby na konečnou absolutní. Kompilovaný program je platformově závislý a vyžaduje specifický překladač pro danou platformu, jeho běh je však nativní a zpravidla rychlý, a je možno využít knihoven dané platformy (například API uživatelského rozhraní WinForms). Příkladem je C, C++, Pascal&lt;br /&gt;
&lt;br /&gt;
'''Interpretace:'''&lt;br /&gt;
Program je interpretován přímo ze zdrojového kódu, příkazy jsou z kódu přečteny, interpretovány (&amp;quot;tlumočeny&amp;quot;) a okamžitě provedeny. Lze interpretofat příkazy jednotlivě, nebo interpretovat celý kód najednou při spuštění. Tento přístup vyžaduje interpreter, který je shopen pro danou platformu příkazy tlumočit. Příklady: PHP, BASIC, Perl, Python&lt;br /&gt;
&lt;br /&gt;
'''Hybridní vykonávání:'''&lt;br /&gt;
Některé jazyky využívají kombinace  předchozího přístupu, tedy kompilaci zdrojového kódu do univerzálního platormově nezávislého jazyka, který je poté interpretován. Příkladem je Java (překlad do byte-code (class) souborů, které jsou spouštěny na virtuálním stroji) nebo C# (překlad do nezávislého Common Intermediate Language, který je poté přeložen do nativní podoby a spuštěn, je li potřeba (JITerem))&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	<entry>
		<id>https://www.512.cz/index.php?title=Probl%C3%A9m,_algoritmus,_program</id>
		<title>Problém, algoritmus, program</title>
		<link rel="alternate" type="text/html" href="https://www.512.cz/index.php?title=Probl%C3%A9m,_algoritmus,_program"/>
				<updated>2014-02-20T06:32:21Z</updated>
		
		<summary type="html">&lt;p&gt;Acolade: kategorizace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problém ==&lt;br /&gt;
&lt;br /&gt;
'''Problém:''' Otázka či stav, pro jejíž zodpovězení hledáme řešení, případně existenci řešení. Takovýto stav je nežádoucí a je tedy na nás jej změnit (problém vyřešit)&lt;br /&gt;
&lt;br /&gt;
'''Postup:''' Zjistíme, že problém nastal (nelze situaci zvládnout známými postupy), zadefinujeme problém (vstupy a výstupy), nalezneme způsob žešení, zjistíme, zda je způsob řešení efektivní a případně optimalizujeme způsob žešení. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rozhodovací problémy lze dělit do tříd složitosti&lt;br /&gt;
* P (polynomiální) - problém je řešitelný pomocí (deterministického) [http://cs.wikipedia.org/wiki/Turing%C5%AFv_stroj Turingova stroje]  v polynomiálním čase (např problém řazení), lze dokázat, že všechny problémy P jsou podmnožinou problémů skupiny NP (NP problém s jednou větví, NP problém bez hádání či nápovědy)&lt;br /&gt;
* NP (nedeterministicky polynomiální)  - Polynomiální čas, ale nedeterministický Turingův stroj (takový, který může rozvětvit program v libovolném kroku na více větví, ve kterých hledá řešení současně (zcela paralelně), případně lze mluvit o stroji, který &amp;quot;uhodne&amp;quot; kterou větví se vydat, případně mu něco &amp;quot;napoví&amp;quot; kudy se má vydat, aby řešení bylo správné. Také lze mluvit o problémech, jejichž řešení lze ověřit  v polynomiálním čase (zpětný postup, zjištění, zda je nalezené řešení opdpovídající problému), níkoliv jej získat  - pokud bychom všechny větve umístili řekněme do zásobníku (zásobníkový Touringův stroj), čas pro nalezení řešení by nutně nebyl polynomiální. Je otázkou, zda lze pro NP problémy najít P řešení.&lt;br /&gt;
* NP-těžké - Problémy, na které lze v polynomiálním čase převést všechny problémy NP, nemusí však nutně v NP samy o sobě být (nemusí být ani rozhodovací)&lt;br /&gt;
* NP-úplné - NP-těžké problémy, které jsou ve třídě NP, jde tedy o nejtěžší NP úlohy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Soubor:Problemy.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vztah mezi P a NP je jedním ze sedmi problémů tisíciletí, které vypsal Clayův matematický ústav 24. května 2000, za rozhodnutí vztahu nabízí 1 000 000 dolarů.&lt;br /&gt;
 &lt;br /&gt;
Pro zasmání: http://www.abclinuxu.cz/clanky/komiks-xkcd-287-np-uplnost&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algoritmus ==&lt;br /&gt;
&lt;br /&gt;
'''Algoritmus:''' Obecný postup pro nalezení řešení, ověřený že funguje. Jde o konečnou sekvenci známých operací (některé definice říkají, že tyto operace musí být elementýrní) které vedou k vyřešení problému.&lt;br /&gt;
&lt;br /&gt;
* Každý bod algoritmu musí být jednoznačně určen a musí být proveditelný (pochopitelný strojem)&lt;br /&gt;
* Algoritmus musí mít konečný počet kroků, tedy musí skončit po konečném počtu operací (narozdíl od výpočetní metody)&lt;br /&gt;
* Algoritmus má 0 - N vstupů&lt;br /&gt;
* Algoritmus má 1 - N výstupů&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Výpočetní metoda:''' &amp;quot;Algoritmus&amp;quot;, který není konečný (event-driven systémy jako třeba automat na kávu, snímače JIS karet, digitální hodinky...)&lt;br /&gt;
&lt;br /&gt;
'''Program:''' Výpočetní metoda (interaktivní aplikace) či algoritmus (dávkové aplikace) zapsaný v souladu s pravidly programovacího jazyka tak, aby bylo možné algoritmus přenést a použít na počítači či jiném stroji. Programovací jazyk je nástroj programátora pro snazší programování, převede se na strojový jazyk, kterému počítač rozumí. Součástí programu může být i popis použitých datových struktur, se kterými algoritmus či výpočetní metoda pracuje.&lt;br /&gt;
&lt;br /&gt;
{{fav-kiv-bzinf}}&lt;br /&gt;
[[Kategorie:fav-kiv-bzinf]]&lt;/div&gt;</summary>
		<author><name>Acolade</name></author>	</entry>

	</feed>