DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Podobné dokumenty
2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Úvod do programování - Java. Cvičení č.4

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Poslední nenulová číslice faktoriálu

Spojová implementace lineárních datových struktur

Dynamické datové struktury III.

5 Rekurze a zásobník. Rekurzivní volání metody

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Základní datové struktury III: Stromy, haldy

Část I Spojové struktury

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

II. Úlohy na vložené cykly a podprogramy

Programování v C++, 2. cvičení

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Kolekce, cyklus foreach

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Stromy, haldy, prioritní fronty

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Základy programování (IZP)

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Stručný návod k programu Octave

1 Nejkratší cesta grafem

8 Třídy, objekty, metody, předávání argumentů metod

TGH07 - Chytré stromové datové struktury

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Hledání k-tého nejmenšího prvku

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Více o konstruktorech a destruktorech

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Abstraktní datové typy

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

1. Téma 12 - Textové soubory a výjimky

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

PŘIJÍMACÍ TEST z informatiky a matematiky pro navazující magisterské studium Fakulta informatiky a managementu Univerzity Hradec Králové

Konstruktory a destruktory

Principy indukce a rekursivní algoritmy

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

PŘETĚŽOVÁNÍ OPERÁTORŮ

Dynamické datové struktury I.

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Řídicí struktury. alg3 1

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Reprezentace dat v informačních systémech. Jaroslav Šmarda

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

5 Přehled operátorů, příkazy, přetypování

ROZHODOVACÍ PROCEDURY A VERIFIKACE PAVEL SURYNEK, KTIML

Rekurzivní algoritmy

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Implementace LL(1) překladů

TGH07 - Chytré stromové datové struktury

Programování v Javě I. Leden 2008

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

typová konverze typová inference

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

4. Kombinatorika a matice

Programování I. Martin Pergel,

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Dynamické datové struktury IV.

OOPR_05. Případové studie

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Algoritmizace a programování

ALGEBRA. Téma 5: Vektorové prostory

ALGORITMIZACE A PROGRAMOVÁNÍ

Předmět: Algoritmizace praktické aplikace

Algoritmy a datové struktury

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Úvod do programovacích jazyků (Java)

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Zápis programu v jazyce C#

Basic256 - úvod do programování Příklady. ing. petr polách

Výčtový typ strana 67

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Transkript:

Indukcí dokažte následující výrok: pokud lef t a right jsou parametry funkce f a platí left right, pak volání f(array, left, right) vrátí minimální hodnotu z hodnot všech prvků v poli array na indexech left až right včetně a vždy skončí v konečném počtu kroků. int f(int[] array, int left, int right) { if (left == right) return array[left]; int l = f(array, left, (left + right) / ); // celociselne deleni, zaokrouhluje dolu int r = f(array, (left + right) / + 1, right); return (l < r)? l : r; Dlouhou vodorovnou čarou oddělte důkaz prvního a druhého indukčního kroku, u druhého indukčního kroku zřetelně napište, jak vypadá indukční předpoklad a co se z něj snažíte dokázat. První krok: máme dokázat, že pro left = right vrátí volání f(array, left, right) po konečném počtu kroků minimum z množiny array[lef t]. To zjevně platí: funkce se vrátí hned na prvním řádku (na kterém nejsou žádné cykly ani volání dalších funkcí) a vrátí array[lef t]. Indukční krok: předpokládáme, že volání f(array, left, (left + right)/) po konečném počtu kroků vrátí minimum z množiny L = {array[left],..., array[(left+ right)/], a že volání f(array, (left + right)/ + 1, right) po konečném počtu kroků vrátí minimum z množiny R = {array[(left+right)/+1],..., array[right]; chceme dokázat, že volání f(array, lef t, right) po konečném počtu kroků vrátí minimum z množiny A = {array[left],..., array[right]. Konečnost počtu kroků je zjevná: kromě rekurzivních volání (která podle indukčního předpokladu skončí v konečném počtu kroků) se vykoná ještě první a poslední řádek. Oba neobshují žádné cykly ani volání funkcí, proto skončí v konečném počtu kroků. Ad parciální správnost: platí A = L R, funkce f vrátí to menší z minim L a R, takže nutně musí vrátit minimum z A. Indukcí dokažte následující výrok: pokud lef t a right jsou parametry funkce f a platí left right a pokud pole array obsahuje hodnotu elem alespoň na jednom z indexů mezi left až right včetně, pak volání f(array, elem, left, right) v konečném počtu kroků vrátí hodnotu true, jinak f alse. boolean f(int[] array, int elem, int left, int right) { if (left == right) return array[left] == elem; boolean l = f(array, elem, left, (left + right) / ); // celociselne deleni, zaokrouhluje dolu boolean r = f(array, elem, (left + right) / + 1, right); return l r; Dlouhou vodorovnou čarou oddělte důkaz prvního a druhého indukčního kroku, u druhého indukčního kroku zřetelně napište, jak vypadá indukční předpoklad a co se z něj snažíte dokázat. První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right) po konečném počtu kroků jestli elem {array[lef t]. To zjevně platí: funkce

se vrátí hned na prvním řádku (na kterém nejsou žádné cykly ani volání dalších funkcí) a vrátí zda elem = array[left]. Indukční krok: předpokládáme, že volání f(array, left, (left + right)/) po konečném počtu kroků vrátí zda elem L, kde L = {array[left],..., array[(left+ right)/], a že volání f(array, (left + right)/ + 1, right) po konečném počtu kroků vrátí zda elem R, kde R = {array[(left+right)/+1],..., array[right]; chceme dokázat, že volání f(array, lef t, right) po konečném počtu kroků vrátí zda elem A, kde A = {array[left],..., array[right]. Zjevně platí A = L R, platí tedy elem A elem L elem R, což je přesně to, co funkce f vrací. Konečnost je taky zjevná: druhý a třetí řádek skončí v konečném čase podle indukčního předpokladu, první ani čtvrtý řádek neobsahují žádný cyklus ani volání funkce. Napište, jakou hodnotu vrací průměrně funkce r pro daná n a k. Napište zřetelně postup vašeho odvození. O typu double uvažujte jako o typu s neomezenou přesností. double r(int n, int k) { Random rnd = new Random(); double[] b = new double[n]; for (int i = 0; i < k; i++) b[rnd.nextint(n)] = 1.0; //nahodne cislo 0..n-1 double s = 0.0; for (int i = 0; i < n; i++) s += b[i]; return s; Nadefinujme si vektor náhodných veličin (indikátorů) tak, že B i = 1, pokud je po projití prvního for cyklu v b[i] jednička, a B i = 0 jinak. Pravděpodobnost, že v b[i] je nula (tzn. že B i = 0), je P r{b[i] = 0 = ( ) n 1 k. n Průměrná hodnota sumy všech prvků v poli je pak E [ n 1 ] n 1 n 1 B i = E[B i ] = (0 P r{b[i] = 0 + 1 P r{b[i] = 1) = ( ( ) ) k n 1 = n 1 n Popište, co vytiskne funkce cp. Napište, kolik řádků vytiskne pro obecná n a k. Demonstrujte své závěry na příkladu volání cp(4, ). void cp(int n, int k) { cp(new int[n], k, 0); void cp(int[] n, int k, int i) { if (i == n.length) { for(int a: n)

System.out.print(a); System.out.println(); return; if(i < n.length-k) { n[i] = 0; cp(n, k, i + 1); if(k > 0) { n[i] = 1; cp(n, k-1, i + 1); //pokracuje na radce //konec radky Funkce vytiskne všechny nciferné řetězce složené z k jedniček a n k nul. Těch je stejně jako kprvkových podmnožin nprvkové množiny, tedy ( n k). Napište tvrzení, které bude platit pro návratovou hodnotu metody f, pokud tato metoda na vstupu obdrží celočíselné pole délky n, kde n je celé číslo větší než nula. int f(int[] array) { int i = 0; for (int j = 1; j < array.length; j++) if (array[i] > array[j]) i = j; return i; Funkce f vrátí index prvního minima v poli array. Funkce f vrátí i takové, že j {1,..., array.length 1 : array[i] < array[j] (array[i] = array[j] i j). Napište tvrzení, které bude platit pro návratovou hodnotu metody f, pokud tato metoda na vstupu obdrží celočíselné pole délky n, kde n je celé číslo větší než nula. int f(int[] array) { int i = 0; for (int j = 1; j < array.length; j++) if (array[i] < array[j]) i = j; return i; Funkce f vrátí index prvního maxima v poli array. Funkce f vrátí i takové, že j {1,..., array.length 1 : array[i] > array[j] (array[i] = array[j] i j). Čtvercová matice M o rozměru k k obsahuje kladné a záporné prvky. Prvek na pozici (i, j) je kladný, pokud číslo i + j je sudé, jinak je záporný. Algoritmus A

prochází po řádcích odshora dolů celou matici M. Pokud je prvek na pozici (i, j) kladný, provede s ním algoritmus A právě k + i specifických operací. Pokud je prvek na pozici (i, j) záporný, provede s ním algoritmus A pouze k specifických operací. Indexy řádků i sloupců začínají od 0. Napište odvození vztahu, který pro dané sudé k určí, kolik specifických operací algoritmus A provede v matici M o rozměru k k. Matice počtu prováděných operací vypadá takto: k + 0 k... k + 0 k k k + 1... k k + 1....... k + (k ) k... k + (k ) k k k + (k 1)... k k + (k 1) Celkový počet operací na sudých sloupcích je k/ 1 k k + k + a = k a=0 + [k + (k + k )] k celkový počet operací na lichých sloupcích je k/ 1 k k + k + a + 1 = k a=0 + [k + 1 + (k + k 1)] k = k 4 + 3k k 4 = 5k k, 4 = k 4 + 3k 4 = 5k 4. Sudých i lichých řádků je k, celkový počet operací na všech sloupcích je proto ( k 5k ) k + 5k = 5 4 4 4 k3 1 4 k. Alternativně, sčítáno po řádcích: k 1 ( k k + k ) (k + i) = k k 1 (k + i) = k 3 + k = k 3 + k [0 + (k 1)]k k 1 i = = 4k3 4 + k3 k = 5 4 4 k3 1 4 k. Když je procedura P zavolána s kladným celočíselným parametrem n, nejprve vytvoří (n 1) nových diskových souborů a nakonec zavolá sama sebe s parametrem (n 1). Pokud je P zavolána se záporným parametrem nebo s nulou, neprovede nic a skončí. Víme, že velikost každého nového diskového souboru je 00 B. Procedura P byla zavolána s neznámou hodnotou parametru n a po jejím skončení na disku ubylo 65 000 Bytů volného místa. Určete hodnotu neznámého parametru n, napište, jak jste odvozovali přislušné vztahy. Podle zadání ubyde po volání P (n) n k=1 (k 1) 00 B volného místa. Tedy 65000 = n (0+n 1) n k=1 (k 1) 00 = 00 = (n n) 100, n n 650 = 0 a n = 6.

Funkce f zpracovává jednosměrný spojový seznam definovaný datovými typy LinkedList a Node. Popište jednou větou, co vrací funkce f, a implementujte ji znovu tak, aby pracovala co nejefektivněji. class Node { int value; //Hodnota ulozena v prvku spojoveho seznamu Node next; //Odkaz na nasledujici prvek v seznamu class LinkedList { Node head; //Odkaz na prvni prvek spojoveho seznamu int f(linkedlist l) { Node mark = l.head; int t = 0; while (mark!= null) { Node x = f1(l.head, mark); t = t + x.value; mark = x.next; return t; Node f1(node n, Node mark) { if (n == mark) return n; else return f1(n.next, mark); Funkce vrací součet prvků v zadaném spojovém seznamu. int f(linkedlist l) { int r = 0; for (Node t = l.head; t!= null; t = t.next) r += t.value; return r; Funkce f zpracovává obousměrný spojový seznam definovaný datovými typy DoubleLinkedList a Node. Popište jednou větou, co vrací funkce f, a implementujte ji znovu tak, aby pracovala co nejefektivněji. class Node { int value; //Hodnota ulozena v prvku spojoveho seznamu Node next; //Odkaz na nasledujici prvek v seznamu Node prev; //Odkaz na predchazejici prvek v seznamu class DoubleLinkedList {

Node head; //Odkaz na prvni prvek spojoveho seznamu Node tail; //Odkaz na posledni prvek spojoveho seznamu int f(doublelinkedlist l) { Node n = l.head; Node mark = l.tail; int t = 1; while (mark!= null) { Node x = f1(l.head, mark); t = t * x.value; mark = mark.prev; return t; Node f1(node n, Node mark) { if (n == mark) return n; else return f1(n.next, mark); Funkce vrací součin prvků v zadaném spojovém seznamu. int f(linkedlist l) { int r = 1; for (Node t = l.head; t!= null; t = t.next) r *= t.value; return r;