b Vladan Majerech - NTIN061 Algoritmy a datové struktury II

Vladan Majerech - NTIN061 Algoritmy a datové struktury II

Last Modified: 18.2.2024

Valid HTML 4.01 Strict ... vlastně už jen HTML, ale jaký obrázek?

Index

zápočtové příklady, odkazy, cvičení 1, cvičení 2, cvičení 3, cvičení 4, cvičení 5, cvičení 6, cvičení 7, cvičení 8, cvičení 9, cvičení 10, cvičení 11, cvičení 12, cvičení 13

Pro získání zápočtu z NTIN061 je potřeba získat (3/5 z možných bodů za domácí úkoly zadávané v průběhu semestru).


Zápočtové příklady

Pokud není uvedeno jinak, počet přidělených bodů rychle klesá v případě použití časově neoptimálních algoritmů. Za odevzdání po termínu je jen poloviční počet bodů. Termín je do počátku cvičení příslušného dne (15:40), odevzdáváme v běžném čitelném formátu (např v těle mailu či v příloze .pdf,.jpg,.png) e-mailem. Příklady s body uvedenými v závorce jsou bonusové, body je možno získat, ale nepočítají se do limitu požadovaných bodů. Domácí úlohy i souhrny cvičení budu nejspíš pravidelně publikovat až po čtvrtečních cvičeních.
Kód Body Termín odevzdání Zadání
interval1019.10.2023Je při vypisování intervalu hodnot v binárním vyhledávacím stromu délka absolvovaného sledu (nemáme explicitní next pointery) $\in O(h + r)$, kde $h$ je hloubka stromu a $r$ počet vypsaných hodnot? Přesvědčivě zdůvodněte (v duchu cvičení, procházíme pomocí iterátoru Next())!
jehly1026.10.2023Spočtěte, kolikrát se dané jehly vyskytují v daném seně (podslova v textu). Zajímají mne počty každé jehly zvlášť.
podposloupnost102.11.2023Spočtěte, kolikrát se daná jehla vyskytne v daném seně (dva řetězce, seno mnohem delší) jako podposloupnost (možnost proložení jinými znaky).Například v BARBARAR je BAR 9 krát.
věže109.11.2023Máme šachovnici $m\times n$ a na některých políčkách stojí sloupy. Na políčka (bez sloupů) je možno umísťovat věže. Každá věž ohrožuje políčka ve stejné řadě a stejném sloupci, ale pouze k nejbližšímu sloupu v daném směru. Otázkou je, kolik věží je možno rozmístit tak, aby žádná nestála na políčku ohroženém jinou věží. No a na Vás je popsat, jak nalézt odpověď (můžete používat „známé“ algoritmy jako podprogramy).
kluby1016.11.2023Na kolejích jsou různé kluby, koleják může být součástí libovolného počtu klubů. Jste postaveni před úlohu vybrat z každého klubu předsedu a místopředsedu a to tak, aby každý koleják byl vybrán za nejvýš jeden klub a pro něj do právě jedné funkce.
porovnání1023.11.2023Vytvořte co nejmělčí hradlovou síť, která pro n-bitová čísla $a$, $b$ vydá $1$ právě když $a\le b$.
souvislost1030.11.2023Vytvořte co nejmělčí hradlovou síť, která pro matici sousednosti neorientovaného grafu $G$ vydá true, právě, je-li graf $G$ souvislý.
mult107.12.2023Nastiňte konstrukci hradlové sítě pro vynásobení dvou n-bitových čísel. Řešte nezávisle úlohu zaměřenou na minimalizaci hloubky od úlohy zaměřené na minimalizaci velikosti (odhadněte vždy oba rozměry). (Přesné rozměry nepožaduji, stačí „asymptotický odhad“, nicméně optimalizujte pro $n=2^{16}$).
cesty1014.12.2023Pro dané vrcholy $u$, $v$ v orientovaném grafu nalezněte maximální počet vrcholově disjunktních cest z $u$ do $v$.
Hamilton10Hamiltonovská cesta v grafu, je cesta obsahující všechny vrcholy grafu (právě jednou). Hamiltonovská kružnice je Hamiltonovská cesta, kde navíc z koncového vrcholu vede hrana do počátečního vrcholu cesty. Ukažte, že jak v orientovaných, tak v neorientovaných grafech je (až na polynom) stejně náročné rozhodnout, zda v něm existuje Hamiltonovská cesta, jako to, že v něm existuje Hamiltonovská kružnice. Ukažte, že je stejně náročné (až na polynom) rozhodnout, zda existuje Hamiltonovská cesta, ve všech variantách v závislosti na tom, které koncové vrcholy cesty jsou zadány. Řešte pomocí transformací (tedy nikoli voláním druhého programu polynomiální počet krát).


Id studenta celkem rozpad bodů
h34interval(2), jehly(6), podposloupnost(6), věže(10), kluby(10), porovnání(0), souvislost(0), cesty(0)
l57interval(2), jehly(8/2), podposloupnost(4/2), věže(10/2), kluby(10), porovnání(10), souvislost(6), mult(8), cesty(10)
o53interval(5), jehly(6), podposloupnost(9), věže(10), kluby(10), porovnání(6), mult(7)
t10interval(2), jehly(6/2), podposloupnost(0/2), věže(10/2)
y14interval(4), jehly(6), podposloupnost(3), věže(1)
z18jehly(6), podposloupnost(4), věže(1), kluby(4/2), porovnání(5)
Á2jehly(4/2)
Č33podposloupnost(6), věže(10), kluby(10), mult(7), cesty(0)
A62interval(10), jehly(10), podposloupnost(6), věže(10), kluby(10), porovnání(10), mult(6)
B68interval(10), jehly(8), podposloupnost(10), věže(10), kluby(10), porovnání(10), souvislost(10)
C62interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(5), souvislost(8)
D67interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), souvislost(8)
E63interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), mult(4)
F66interval(10), jehly(6), podposloupnost(10), věže(10), kluby(10), porovnání(10), souvislost(10)
G60interval(10), jehly(6), podposloupnost(10), věže(10), kluby(10), souvislost(10), cesty(4)
H65interval(10), jehly(6), podposloupnost(9), věže(10), kluby(10), porovnání(10), souvislost(10)
I62.5interval(10), podposloupnost(10), věže(10), kluby(10), souvislost(5+5/2), cesty(10), porovnání(10/2)
J66interval(10), jehly(6), podposloupnost(10), věže(10), kluby(10), porovnání(10), souvislost(10)
K68.5interval(10), jehly(10), podposloupnost(9/2), věže(10), kluby(10), porovnání(5), souvislost(0), mult(9), cesty(10)
L62interval(6), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), souvislost(7)
M65interval(7), jehly(6), podposloupnost(6+2/2), věže(10), kluby(8), porovnání(2), souvislost(7), mult(8), cesty(10)
N63interval(7), jehly(6+4/2), podposloupnost(10), věže(0), kluby(10), porovnání(10), souvislost(10), mult(8)
O60interval(6+4/2), jehly(6+4/2), podposloupnost(6), věže(4+6/2), kluby(10), porovnání(0+10/2), souvislost(0+10/2), mult(5), cesty(4+6/2), Hamilton(2)
P60interval(10), jehly(10), podposloupnost(6), věže(10), kluby(10), porovnání(5), souvislost(9)
Q61.5interval(6), jehly(10), podposloupnost(4), věže(10), kluby(10), porovnání(5), souvislost(5+5/2), mult(9)
R67interval(10), jehly(10), podposloupnost(6+2/2), věže(10), kluby(10), porovnání(10), souvislost(10)
S69interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), souvislost(10)
T62.5interval(10), jehly(10), podposloupnost(9), kluby(10), věže(10), porovnání(10), mult(7/2)
U64interval(4), jehly(6), podposloupnost(9), věže(10), kluby(10), porovnání(5), souvislost(10), cesty(10)
V60.5interval(10), jehly(4+1/2), podposloupnost(9), věže(4), kluby(10), porovnání(5), souvislost(10), mult(8)
W60interval(8), jehly(6), podposloupnost(9), věže(5), kluby(10), porovnání(5), souvislost(8), mult(9)
X61interval(10), jehly(10), podposloupnost(6), věže(10/2), kluby(10), porovnání(10), souvislost(10)
Y69interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnávání(10), souvislost(10)
Z63interval(8), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), souvislost(6)
a60.5interval(8), jehly(6), podposloupnost(6+3/2), věže(10), kluby(10), porovnání(10), souvislost(9)
b64interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), cesty(10/2)
c69interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), souvislost(10)
d66.5interval(10), jehly(6), podposloupnost(3+7/2), věže(10), kluby(4+6/2), porovnání(10), souvislost(10), mult(7)
e69interval(10), jehly(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), souvislost(10)
f62interval(10), jehly(10), podposloupnost(6/2), věže(10), kluby(10), souvislost(9), cesty(10)
g65interval(6), jehly(10), podposloupnost(8/2), věže(10/2), kluby(10), porovnání(10), souvislost(10), cesty(10)
i63interval(2), jehly(6), podposloupnost(8), věže(10/2), kluby(10/2), porovnání(10), souvislost(10), mult(7), cesty(10)
j67interval(6), jehly(6), podposloupnost(6), věže(10), kluby(10), porovnání(10), souvislost(9), cesty(10)
k68interval(10), jehly(6), podposloupnost(9), věže(10), kluby(10), souvislost(4), mult(9), cesty(10)
m63.5interval(5+3/2), jehly(10), podposloupnost(4), věže(10), kluby(10), porovnání(6), souvislost(10), mult(7)
n64interval(5), jehly(10), podposloupnost(10), věže(10), kluby(10), porovnání(10), souvislost(4), cesty(10/2)
p67.5interval(5+5/2), jehly(6), podposloupnost(9), věže(10), kluby(10), souvislost(9), mult(6), cesty(10)
q61interval(8), jehly(10), podposloupnost(9), kluby(10), věže(10), porovnání(10), mult(4)
r64.5interval(8+2/2), jehly(6), podposloupnost(9+2/2), věže(10), kluby(10), porovnání(10), souvislost(10)
s60interval(10), podposloupnost(9), věže(10), kluby(10), porovnání(10), mult(5), cesty(6)
u64interval(6), jehly(6), podposloupnost(6), věže(10), kluby(10), porovnání(10), souvislost(6), cesty(10)
v69interval(10), jehly(4), podposloupnost(10/2), věže(10), kluby(10), porovnání(10), souvislost(10), cesty(10)
w60interval(4+6/2), jehly(4+6/2), podposloupnost(6), věže(1+9/2), kluby(5+5/2), porovnání(10), souvislost(10), mult(7), cesty(0)
x61interval(4), podposloupnost(8+2/2), kluby(4+6/2), porovnání(5), souvislost(10), mult(6), cesty(10), jehly(10/2), věže(10/2), hamilton(0)


Odkazy na obdobné stránky

Cvičení či materiály k nim Jana Hrice, moje loňská cvičení.


Cvičení 1

Na všech proběhlých cvičeních jsme prodávali datové struktury. Vždy zazněly (kromě jiných) prioritní fronty, vyhledávací stromy, slovníky a struktura na spojování tříd ekvivalence. Vždy byly první prezentované vyhledávací stromy neprodejné, a bylo potřeba vylepšit reklamní kampaň. Vždy jsme řešili možnosti optimalizace vyhodnocování SQL dotazů.

Vždy jsme zmínili rozměry složitosti střední hodnota (průměrná přes pravděpodobnosti vstupu) (php attack problém), randomizovaná (průměr pro jeden vstup přes chování náhodného generátoru) a pro datové struktury i amortizovaná (umožňující spočítat celkový čas za průběh algoritmu, ač některá zavolání mohou mít výrazně větší čas než jiná).


Cvičení 2

Věnovali jsme se vyhledávání v textu. Nejprve jsme si chvíli povídali o vyhledávání na internetu, tedy jak velmi zhruba funguje příprava podkladů pro vyhledávání na internetu a jak zhruba může být dotaz vyhodnocován. Pak jsem zmínil možnost obráceného přístupu, tedy předzpracování sena, což umožňuje následné efektivní vyhledávání libovolných předem neznámých jehel (intelisense, na konci druhého cvičení jsme zmínili Suffix trees ... předzpracování se dá udělat v čase $O(n)$ a vyžaduje $O(n)$ prostoru (s multiplikativní konstantou řekněme 20)).

Nálsedně jsme se věnovali vyhledávání jehly(el) v seně metodou, kdy předzpracujeme jehlu(y).

Následně jsme Knut-Moris-Prat algoritmus víceméně odbyli, víc jsem se věnovali Aho-Corrasick algoritmus, jež je jeho zobecněním a zjednodušení datové struktury pro cestu místo stromu, kde stačí pole čísel je implementační detail. Věnovali jsme se tedy Aho-Corrasic algoritmu, a předvedli jsme si jej na příkladě. Na prvním cvičení jsme odbočili k datové struktuře (písmenkový strom) Trie a zařadili ji v kontextu tržnice datových struktur (paměťová hierarchie!). Řekli jsme si o možnosti reprezentace hran trie ve slovníku, ale i o tradičních metodách pole odkazů. Bavili jsme se o snížování prostorové náročnosti při reprezentaci statické množiny pomocí eliminace vrcholů stupně 1 i pomocí reprezentace ofsetů do jednoho pole s překrývajícími se intervaly hodnot (s nepřekrývajícími se nenilovými odkazy), nerozmysleli jsme si, jak musíme modifikovat vyhledávání, abychom se nezacyklili a lokalizovali jen slova z množiny.

U AC algoritmu jsme se nevěnovali důkazům, toho, že postupujeme správně, nicméně jsme všechny jednotlivé kroky zdůvodnili. Implicitně jsme dokázali složitost vyhledávání i složitost vybudování fail podpůrných pointerů. Co se týče hlášení nalezených jehel, využil jsem příležitost k odbočce k funkcionálně persistentní datové struktuře srůstajících seznamů. Zmínil jsem se o tom, co to je částečná a plná persistence, a zmínil využití částečné persistence v úloze lokalizace bodů v rovině (na druh0m cvičení).

Na obou cvičeních jsem zmínil algoritmus s plovoucí hašovací funkcí (Robin Karp), který umí s velikou pravděpodobností vyloučit pozice, kde se jehla určitě nenachází, s tím, že pozici, kde se jehla nachází nikdy nevyloučí. Existuje i xorovací, shiftovací hashovací funkce, jejíž výpočet i aktualizace bude mít lepší multiplikativní konstantu než standardní modulo polynomiální funkce, tuto funkci jsem ale zatloukal. (Pomocí "zobrist hashing" triku se každému písmenku přiřadí náhodné např. 128 bitové číslo, toto číslo se rotuje podle toho na které pozici se daný znak vyskytuje. Není to polynom o základu $2^k$, vyhledem k cyklickému doplnění bitů nízkých řádů a výsledný hash získáme xorem mezivýsledků. Posunutí slova se projeví rotací hashe celého slova, takže je akualizace v $O(1)$.)


Cvičení 3

Bavili jsme se o dvou algoritmech hledání toků v sítích (na obou cvičeních jsme stihli 4 varianty postupné maximalizace pomocí nějakých toků Ford Fulkerson, Edmonds Karp, Dinic, efektivní implementace Dinicova algoritmu), na prvním cvičení jsme stihli odkrokovat algoritmus vycházející z maxima a postupně zajišťující to, aby šlo o tok, nestihli jsme rozbor složitosti algoritmu. Na druhém cvičení jsme se k algoritmu vycházejícího z maxima a postupně zajišťujícího, že jde o tok, nedostali.


Cvičení 4

Nejprve jsme dokončili druhý algoritmus na hledání toku v síti (rozbor časové složitosti) a vylepšenou heuristiku a vylepšený rozbor složitosi.

Pak jsem se vrátil k Dinicově algoritmu a ukázal jsem jak pro husté vrstevnaté sítě hledat blokující tok efektivněji (v $O(n^2)$ místo $O(m\log n)$ ... algoritmus 3 indů). Ukázal jsem i slíbený příklad na kterém Ford Fulkerson může konvergovat k zanedbatelnému toku oproti tomu, jaký v síti existuje. (Vhodná volba zlepšujících cest kde zbytkové kapacity na dané trojici hran až na pořadí v $i$-tém kroku rovny $0,q^{i+1},q^i$, kde $q>0, 1=q+q^2$ ...).

V krátkém zbytku hodiny jsme začali řešit úlohy na toky v sítích (například na rovnost maximálního toku s minimálním řezem).


Cvičení 5

Páté cvičení mělo kvůli rektorskému dni jen pondělní verzi, na které jsme řešili úlohy na toky v sítích. Kromě svišťů otevírání dolů a dopředné krále.


Cvičení 6

Vrátili jsme se k úloze o dolech, povídali si o květinkovém algoritmu na hledání maximálního párování v obecném grafu a začali jsme se bavit o hradlových sítích. (Našli jsme univerzální hradla s minimálním počtem vstupů.)

Cvičení 7

Věnovali jsme se hradlovým sítím. Nejprve technice zmenšení hloubky obvodu pomocí počíání mezifunkcí místo mezivýsledků, takže můžeme počítat průběžně (paralelně). Pak jsme vytvořili obvod pro selector a s obvodem pro porovnání (DU) vytvořili komparátor. Pomocí komparátorů jsme popsali obvody pro bitonic a merge sort.

Cvičení 8

Věnovali jsme se násobení a to především pomocí násobení polynomů přes Fourierovu transformaci.

Cvičení 9

Zkoušeli jsme vynásobit dva (malé) polynomy pomocí Fourierovy transformace (jak vs komplexních číslech tak vs modulární aritmetice). Na prvním cvičení jsme se zasekli na nerekurzivním algoritmu ($bdquo;barva hran nezávisí na rovnoběžnosti“).

Cvičení 10

Probírali jsme geometrické algoritmy Kirkpatrick-Seidel konvexní obal, konvexní obal dle přednášky, Delanayova triangulace/Voronoy diagram, Welzl Matoušek nejmenší kruh opsaný množině bodů.

Cvičení 11

Probírali jsme NP-úplnost a příklady převodů, na čtvrtečním cvičení jsme před tím začali promítáním animace tvorby Voronoy diagramu a ukázkou toho, proč abstraktní Welzlův randomizovaný algoritmus pro nejmenší kruh opsaný množině bodů nemusí dávat správný výsledek. Na wikipedii to vydrželo o 14 dní kratší dobu, než jsem očekával. A konečně vím kde byl problém (křížení msw algoritmu s welzl algoritem).

Cvičení 12

Zabývali jsme NP-úplností a aproximací sovisejících problémů.

Cvičení 13

Na posledním cvičení jsme se věnovali testování prvočíselnosti a faktorizaci (Millerův test, zmínka o deterministickém algoritmu a rozšířené Riemanově hypotéze, Pollard p-1, Lenstra Elltiptic Curve, Quadratic Sieve, (General Number Field Sieve)).