Sada úkolů pro předmět DSA
Transkript
Sada úkolů pro předmět DSA
Sada úkolů pro předmět DSA A7B36DSA http://neuron.felk.cvut.cz/dsa/index.html Ing. Martin Chlumecký Katedra počítačů ČVUT v Praze, FEL Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Domácí úkoly z předmětu DSA Domácí úkoly Domácí úkoly mají dvě varianty: lehčí a těžší. Lehčí varianta je za jeden bod, těžší vzhledem k větší míře samostatné práce za čtyři body. U řešitelů těžších domácích úkolů se předpokládá znalost Featherweight Javy. Přístupové údaje k repozitáři URL vašeho repozitáře je https://cvut.repositoryhosting.com/svn/cvut_<login>/ URL pro brouzdání po vašem repozitáři na webu je https://cvut.repositoryhosting.com/trac/cvut_<login>/browser Login je vaše uživatelské jméno v síti ČVUT Počáteční heslo je shodné s vaším uživatelským jménem (není se sítí ČVUT synchronizováno) URL pro přihlášení do administračního rozhraní na webu je https://cvut.repositoryhosting.com Zadání lehčích domácích úkolů Lehčí domácí úkoly odevzdávejte přes repozitář. Každý úkol umístěte do adresáře homeworks a souboru homework<n>.java, kde <n> je číslo úkolu. Všechny odevzdávané třídy dělejte neveřejné (aby mohly být v jednom souboru) a neumísťujte je do žádného balíčku. Kromě vašeho kódu neodevzdávejte nic jiného - třídy a rozhraní, která jsou součástí zadání, si k vašemu kódu přilinkujeme sami. Pokud chcete ve zdrojácích používat češtinu, používejte kódování ISO8859-2. Pokud se ještě s testovacím systémem objeví problémy, dejte o nich (mailem) vědět přednášejícímu nebo cvičícím - jinak se nápravy nedočkáte. První Naimplementujte třídu Homework1 implementující rozhraní Mergesort. interface int[] int[] int[] int[] } Mergesort { getFirstHalfOf(int[] array); // vrati nesetridenou kopii prvni poloviny (horni celou cast) pole array getSecondHalfOf(int[] array); // vrati nesetridenou kopii druhe poloviny (dolni celou cast) pole array merge(int[] firstHalf, int[] secondHalf); // slije prvky v firstHalf a secondHalf do jednoho pole a vrati ho mergesort(int[] array); // vrati setridenou kopii pole array Druhý Naimplementujte třídu Homework2 implementující rozhraní Matrix. Násobení matic musí být implementováno Strassenovým algoritmem, tzn. metoda times volaná na netriviální matici (matici větší než 1×1) musí svůj výsledek získat pouze pomocí volání metod plus, minus a times na podmaticích. Všechny vaše metody by měly fungovat s jakoukoli korektní implementací rozhraní Matrix. /** Rozhrani Matrix reprezentuje ctvercovou matici, jejiz rozmer je mocnina dvojky. */ interface Matrix { /* Vrati rozmer matice. */ int getSize(); /* Vrati prvek na indexu n, m (1 <= n <= getSize(), 1 <= m <= getSize()). */ int getElement(int n, int m); /* Vrati levou horni podmatici. */ Matrix getTopLeftSubmatrix(); /* Vrati pravou horni podmatici. */ public Matrix getTopRightSubmatrix(); /* Vrati levou dolni podmatici. */ public Matrix getBottomLeftSubmatrix(); /* Vrati pravou dolni podmatici. */ public Matrix getBottomRightSubmatrix(); /* Vrati soucet matic this a other (muzete predpokladat, ze this.getSize() == other.getSize()). */ public Matrix plus(Matrix other); /* Vrati rozdil matic this a other (muzete predpokladat, ze this.getSize() == other.getSize()). */ public Matrix minus(Matrix other); /* Vrati soucin matic this a other (muzete predpokladat, ze this.getSize() == other.getSize()). */ public Matrix times(Matrix other); } class Homework2 implements Matrix { /** Vytvori novou matici (muzete predpokladat, ze contents je ctvercove pole, jehoz rozmer je mocnina dvojky). */ public Homework2(int[][] contents) { /* ... */ } /* Zbytek tridy Homework2. */ } Třetí Naimplementujte třídu Homework3 implementující rozhraní HeapStorage a třídu Heap. Za korektní implementaci třídy Homework3 získáte jeden bod, za korektní implementaci třídyHeap další. interface DSAComparable<E> { /** Vrati true, pokud je this (ostre) mensi nez other, false jinak. */ boolean less(E other); /** Vrati nejmensi prvek ze vsech prvku typu E (tzn. prvek, ktery je mensi nez * jakykoli jiny prvek typu E). Vracena hodnota nezavisi na this, jen na E. */ E getLeastElement(); /** Vrati nejvetsi prvek ze vsech prvku typu E (tzn. prvek, ktery je vetsi * nez jakykoli jiny prvek typu E). Vracena hodnota nezavisi na this, jen na E. */ E getGreatestElement(); } /** Rozhrani HeapStorage reprezentuje pole, do ktereho si halda uklada svoje prvky. */ interface HeapStorage<E extends DSAComparable<E>> { /** Vrati aktualni velikost HeapStorage. */ int getSize(); /** Vrati true, pokud je aktualni velikost HeapStorage nulova. */ boolean isEmpty(); /** Vrati prvek na indexu index (1 <= index <= getSize()). Pokud je index * mensi nebo roven nule, vrati nejvetsi prvek. Pokud je index vetsi nez * velikost pole, vrati nejmensi prvek. V obou pripadech muzete predpokladat, * ze v HeapStorage je alespon jeden prvek. */ E getElement(int index); /** Prohodi prvky na indexech index a index2 (1 <= index, index2 <= getSize()). */ void swap(int index, int index2); /** Odstrani posledni prvek (tzn. snizi velikost teto HeapStorage) a vrati jeho hodnotu. */ E extractLast(); /** Vlozi prvek a vrati jeho index. Muzete predpokladat, ze ve spodnim poli je dost mista. */ int insertLast(E element); } class Homework3<E extends DSAComparable<E>> implements HeapStorage<E>{ /** Vytvori novy objekt HeapStorage nad polem elements, jeho velikost je stejna jako delka pole. */ Homework3(E[] elements) { /* kod */ } /* metody */ } /** Trida Heap reprezentuje haldu (s maximem ve vrcholu). */ class Heap<E extends DSAComparable<E>> { HeapStorage<E> storage; /** Vytvori haldu nad danym HeapStorage (tzn. zavola algoritmus build heap). */ Heap(HeapStorage<E> storage) { /* kod */ } /** Zavola algoritmus heapify nad uzlem na indexu index. */ void heapify(int index) { /* kod */ } /** Vlozi do haldy novy prvek. Muzete predpokladat, ze v poli uvnitr HeapStorage na nej misto je. */ void insert(E element) { /* kod */ } /** Odstrani a vrati z haldy maximalni prvek. */ E extractMax() { /* kod */ } /** Vrati true, pokud je halda prazdna. */ boolean isEmpty() { /* kod */ } /** Pomoci algoritmu trideni haldou vzestupne setridi pole array. */ static <E extends DSAComparable<E>> void heapsort(E[] array) { /* kod */ } } Soutěž Pokud chcete, můžete se zúčastnit soutěže o nejelegantnější implementaci třetího domácího úkolu. Kritéria elegance jsou zejména: srozumitelnost kódu, jeho kompaktnost a jeho snadná modifikovatelnost. Pro přihlášení do soutěže pošlete email přednášejícímu, uzávěrka přihlášek je shodná s datem odevzdání úkolu, tj. 14. 11. O vítězi rozhodně porota složená z cvičících předmětu, hlavní cena je bod za aktivitu. Čtvrtý Naimplementujte třídu DSAHashTable (kvůli omezení Javy musíte generické pole alokovat takto: (Set<Pair<K, V> >[]) new Set<?>[size]). import java.util.Iterator; import java.util.Set; /** Trida Pair reprezentuje dvojici (klic, hodnota). */ class Pair<K,V> { K key; V value; Pair(K k, V v) { key = k; value = v; } public int hashCode() { return key.hashCode() + 3 * value.hashCode(); } public boolean equals(Object other) { if (! (other instanceof Pair<?,?>)) return false; Pair<?,?> o = (Pair<?,?>) other; return key.equals(o.key) && value.equals(o.value); } } /** Trida DSAHashTable reprezentuje rozptylovaci tabulku se zřetězením (první varianta v učebnici). */ class DSAHashTable<K,V> { /** Vytvori prazdnou instanci DSAHashTable, delka vnitrniho pole je nastavena na size, obsah vnitrniho pole * je inicializovan na prazdne mnoziny. */ DSAHashTable(int size) { /* kod */ } /** Ulozi dvojici (key, value) do rozptylovaci tabulky. Pokud uz v tabulce je jina dvojice se stejnym klicem, * je smazana. Klic ani hodnota nesmi byt null. Pokud by pocet dvojic v tabulce po vykonani put mel vzrust nad * dvojnasobek delky vnitrniho pole, vnitrni pole zdvojnasobi. */ void put(K key, V value) { /* kod */ } /** Vrati hodnotu asociovanou s danym klicem nebo null, pokud dany klic v tabulce neni. */ V get(K key) { /* kod */ } /** Smaze dvojici s danym klicem. Pokud v tabulce dany klic neni, nedela nic. */ void remove(K key) { /* kod */ } /** Vrati vnitrni pole. Prvni vnitrniho pole mohou byt instance trid v balicku java.util, tzn. nemusite psat * vlastni implementaci rozhrani java.util.Set. */ Set<Pair<K,V>>[] getArray() { /* kod */ } /** Pro dany klic vrati index v poli. Jako hashovaci funkce se pouzije key.hashCode. */ int getIndexOf(K key) { /* kod */ } /** Pokud je pocet prvku mensi nebo roven dvojnasobku delky vnitrniho pole, vrati true, jinak vrati false. */ boolean isBigEnough() { /* kod */ } /** Zmeni delku vnitrniho pole, nainicializuje jej prazdnymi mnozinami a zkopiruje do nej vsechny dvojice. */ void resize(int newSize) { /* kod */ } /** Vrati iterator pres vsechny dvojice v tabulce. Iterator nemusi mit implementovanou metodu remove. */ Iterator<Pair<K,V>> iterator() { /* kod */ } } Pátý Naimplementujte třídu Tree. import java.util.Iterator; interface DSAComparable<E extends DSAComparable<E>> { boolean lessOrEqual(E other); boolean greater(E other); boolean equal(E other); } class Node<E extends DSAComparable<E>> { E contents; private Node<E> parent; Node<E> left, right; /** Vrati naslednika (tzn. uzel obsahujici nejblizssi vyssi hodnotu) tohoto uzlu. */ Node<E> succ() { if (right != null) { Node<E> temp = right; while (temp.left != null) temp = temp.left; return temp; } else { Node<E> temp = this; Node<E> parent = this.parent; while (parent != null && parent.right == temp) { parent = parent.parent; temp = temp.parent; } return parent; } } Node(E elem, Node<E> parent) { this.contents = elem; this.parent = parent; } void setParent(Node<E> p) { parent = p; } } /** * Trida Tree reprezentuje binarni vyhledavaci strom, ve kterem pro kazdy uzel n plati * n.left == null || n.left.contents.lessOrEqual(n.contents) a * n.right == null || n.right.contents.greater(n.contents). */ class Tree<E extends DSAComparable<E>> { Node<E> root; /** Vrati minimum z tohoto stromu nebo null, pokud je strom prazdny. */ E minimum() { /* kod */ } /** Vrati minimum ze zadaneho podstromu nebo null, pokud je podstrom prazdny. */ E subtreeMin(Node<E> n) { /* kod */ } /** Vrati maximum z tohoto podstromu nebo null, pokud je strom prazdny. */ E maximum() { /* kod */ } /** Vrati maximum ze zadaneho podstromu nebo null, pokud je podstrom prazdny. */ E subtreeMax(Node<E> n) { /* kod */ } /** Vlozi prvek do stromu, pripadne duplicity ponechava (tzn. stejny prvek muze * byt ve stromu vickrat). */ void insert(E elem) { /* kod */ } /** * Projde strom smerem za uzlem s hodnotou elem a vrati: * - uzel s hodnotou elem, pokud existuje, * - posledni potkany koncovy uzel (=uzel s maximalne jednim potomkem), pokud uzel s hodnotou elem neexistuje nebo * null pokud je cely strom prazdny. */ Node<E> find(E elem) { /* kod */ } /** Vrati true, pokud tento strom obsahuje prvek elem. */ boolean contains(E elem) { /* kod */ } /** Odstrani jeden vyskyt prvku elem z tohoto stromu. */ void remove(E elem) { /* kod */ } /** Vrati iterator pres cely strom (od nejmensiho po nejvetsi). */ Iterator<E> iterator() { /* kod */ } /** Vrati iterator prochazejici pres interval [lowerBound, higherBound] vcetne. */ Iterator<E> boundedIterator(E lowerBound, E higherBound) { /* kod */ } /** Vrati korenovy uzel tohoto stromu. */ Node<E> getRootNode() { /* kod */ } } Šestý Dynamické programování je vlastně rekurze zkřížená s memoizací. Samotný rekurzivní popis algoritmu je pro každou úlohu jiný, ale memoizace je pořád stejná - řešení podúloh se zaznamenává do tabulky a znovupoužívá, když je potřeba. Vaším úkolem je naprogramovat metodu Machine.solve, ve které bude právě ta memoizace. Metodasolve by při zavolání měla: 1. mrknout do tabulky a pokud v ní řešení už je, vrátit ho, 2. pokud v tabulce řešení není, měla by si ze zadané úlohy vytáhnout možná podřešení a vybrat to nejlepší (s nejvyšší hodnotou) a 3. před vrácením nejlepšího řešení by si ho měla uložit do tabulky. import import import import java.util.HashMap; java.util.HashSet; java.util.Map; java.util.Set; /** Trida Pair reprezentuje dvojici. */ class Pair<First, Second> { First first; Second second; Pair(First f, Second s) { first = f; second = s; } First getFirst() { return first; } Second getSecond() { return second; } } /** Instance rozhrani Task reprezentuji optimalizacni ulohu. */ interface Task<T extends Task<T, S, W>, S extends Solution<T, S, W>, W extends Comparable<W>> { /** Vrati vsechna mozna (ne nutne optimalni) reseni teto ulohy. Vzdy vrati alespon jedno reseni. */ Set<S> getPossibleSolutions(); } /** Instance rozhrani Solution reprezentuji reseni nejake konkretni optimalizacni ulohy. */ interface Solution<T extends Task<T, S, W>, S extends Solution<T, S, W>, W extends Comparable<W>> { /** Vrati hodnotu tohoto reseni. */ W getWorth(Machine<T, S, W> m); } class Machine<T extends Task<T, S, W>, S extends Solution<T, S, W>, W extends Comparable<W>> { Map<T, Pair<S, W>> cache = new HashMap<T, Pair<S, W>>(); Pair<S, W> solve(T task) { /* kod */ } } class RodTask implements Task<RodTask, RodSolution, Integer> { final int length; final int[] table; final Set<RodSolution> sols = new HashSet<RodSolution>(); static int instanceCount; RodTask(int length, int[] table) { this.length = length; this.table = table; for (int i = 1; i <= length; i++) sols.add(new RodSolution(i, length - i, table)); instanceCount++; } public Set<RodSolution> getPossibleSolutions() { return sols; } public int hashCode() { int code = length; for (int i : table) code += 3 * i; return code; } public boolean equals(Object o) { if (!(o instanceof RodTask)) return false; RodTask other = (RodTask) o; if (length != other.length || table.length != other.table.length) return false; for (int i = 0; i < table.length; i++) if (table[i] != other.table[i]) return false; return true; } } class RodSolution implements Solution<RodTask, RodSolution, Integer> { final int first; final int rest; final int[] table; RodSolution(int first, int rest, int[] table) { this.first = first; this.rest = rest; this.table = table; } public Integer getWorth(Machine<RodTask, RodSolution, Integer> m) { int worth = table[first]; if (rest > 0) worth += m.solve(new RodTask(rest, table)).getSecond(); return worth; } } Sedmý Naprogramujte B-strom. import java.util.List; /** Instance tridy Tree reprezentuji B-strom. */ class Tree { /** Koren tohoto stromu. */ Node root; /* atributy */ /** Vytvori prazdny B-strom se zadanou kapacitou uzlu. Kapacita uzlu je * maximalni pocet klicu, ktere se v jednom uzlu mohou objevit. */ Tree(int nodeCapacity) { /* kod */ } /** Indikuje, jestli tento strom obsahuje zadany klic. */ boolean contains(Integer key) { /* kod */ } /** Prida zadany klic do stromu. Pokud tento strom zadany klic uz obsahuje, * neudela nic. */ void add(Integer key) { /* kod */ } /** Odebere zadany klic ze stromu. Pokud tento strom zadany klic neobsahuje, * neudela nic. */ void remove(Integer key) { /* kod */ } /* kod */ } class Node { /* atributy */ /** Vrati klice ulozene v tomto uzlu serazene vzestupne. */ List<Integer> getKeys() { /* kod */ } /** Vrati ukazatele na podstromy ulozene v tomto uzlu serazene v poradi odpovidajicim * poradi klicu. Pozor: vzdy musi platit, ze pocet_ukazatelu_na_podstromy = pocet_klicu + 1, * u listovych uzlu proto musite vracet seznam nullu. */ List<Node> getSubtrees() { /* kod */ } } Zadání těžších domácích úkolů První Ve Featherweight Javě naimplementujte datovou strukturu v C. Okasaki: Purely Functional Data Structures označovanou jako persistent binary random-access list. Pro počáteční nasměrování a dodatečné informace kontaktujte přednášejícího. Základní knihovnu FJ z minulého semestru najdete nahttps://cvut.repositoryhosting.com/trac/cvut_lectures/browser/Lecture14/src/lecture14/Lecture14.java Druhý Naimplementujte níže uvedené třídy a rozhraní a s jejich pomocí napište následující algoritmy: řazení vkládáním, řazení sléváním, quicksort, quick seleck a řazení haldou. Pokud bude potřeba, můžete níže uvedenou strukturu tříd obohatit o nové metody nebo mírně změnit, ale měli byste zachovat stejného ducha. /** Instance implementujici toto rozhrani reprezentuji multimnozinu, * ktera se po vytvoreni uz nezmeni. */ interface ImmutableMultiset<E> { /** Vrati sjednoceni teto a zadane multimnoziny. */ ImmutableMultiset<E> union(ImmutableMultiset<E> other); /** Vrati rozdil teto a zadane multimnoziny. */ ImmutableMultiset<E> difference(ImmutableMultiset<E> other); /** Vrati, zda tato multimnozina obsahuje zadany prvek. */ ImmutableBoolean contains(E elem); /** Vrati velikost teto multimnoziny. */ ImmutableInteger size(); } /** Instance teto tridy reprezentuji prazdnou multimnozinu. */ class EmptyMultiset<E> implements ImmutableMultiset<E> { static <E> EmptyMultiset<E> createEmptyMultiset(); } /** Instance teto tridy reprezentuji multimnozinu s jednim prvkem. */ class SingletonMultiset<E> implements ImmutableMultiset<E> { static <E> SingletonMultiset<E> createSingletonMultiset(E elem); } /** Instance teto tridy reprezentuji sjednoceni dvou multimnozin. */ class Union<E> implements ImmutableMultiset<E> { static <E> Union<E> createUnion(ImmutableMultiset<E> first, ImmutableMultiset<E> second); } /** Instance teto tridy reprezentuji rozdil dvou multimnozin. */ class Difference<E> implements ImmutableMultiset<E> { static <E> Difference<E> createDifference(ImmutableMultiset<E> first, ImmutableMultiset<E> second); } /** Instance implementujici toto rozhrani reprezentuji sekvenci, * ktera se po vytvoreni uz nezmeni. */ interface ImmutableSequence<E> { /** Vrati spojeni teto a zadane sekvence. */ ImmutableSequence<E> concat(ImmutableSequence<E> other); /** Vrati podsekvenci zadane sekvence. Prvni prvek sekvence ma index nula. */ ImmutableSequence<E> subsequence(ImmutableInteger from, ImmutableInteger to); /** Vrati delku teto sekvence. */ ImmutableInteger size(); /** Vrati prvek na zadanem indexu. Prvni prvek ma index nula. */ E elementAt(ImmutableInteger position); } /** Instance teto tridy reprezentuji prazdnou sekvenci. */ class EmptySequence<E> implements ImmutableSequence<E> { static <E> EmptySequence<E> createEmptySequence(); } /** Instance teto tridy reprezentuji sekvenci delky jedna. */ class SingletonSequence<E> implements ImmutableSequence<E> { static <E> SingletonSequence<E> createSingletonSequence(E elem); } /** Instance teto tridy reprezentuji spojeni dvou sekvenci. */ class Concatenation<E> implements ImmutableSequence<E> { static <E> Concatenation<E> createConcatenation(Sequence<E> first, Sequence<E> second); } /** Instance teto tridy reprezentuji podsekvenci nejake sekvence. */ class Subsequence<E> implements ImmutableSequence<E> { static <E> Subsequence<E> createSubseqence(Sequence<E> seq, ImmutableInteger from, ImmutableInteger to); } /** Instance teto tridy reprezentuji cele cislo, ktere se po vytvoreni jiz nezmeni. */ interface ImmutableInteger { /** Vrati soucet tohoto a zadaneho cisla. */ ImmutableInteger plus(ImmutableInteger other); /** Vrati rozdil tohoto a zadaneho cisla. */ ImmutableInteger minus(ImmutableInteger other); /** Vrati soucin tohoto a zadaneho cisla. */ ImmutableInteger times(ImmutableInteger other); /** Vrati podil tohoto a zadaneho cisla. */ ImmutableInteger dividedBy(ImmutableInteger other); /** Indikuje, zda je toto cislo mensi, nez zadane. */ ImmutableBoolean less(ImmutableInteger other); /** Indikuje, zda je toto cislo shodne jako zadane. */ ImmutableBoolean equal(ImmutableInteger other); /** Indikuje, zda je toto cislo vetsi, nez zadane. */ ImmutableBoolean greater(ImmutableInteger other); } /** Instance teto tridy reprezentuji konstantu. */ class Constant implements ImmutableInteger { static Constant createConstant(int c); } /** Instance teto tridy reprezentuji soucet dvou cisel. */ class Plus implements ImmutableInteger { static Plus createPlus(ImmutableInteger first, ImmutableInteger second); } /** Instance teto tridy reprezentuji rozdil dvou cisel. */ class Minus implements ImmutableInteger { static Minus createMinus(ImmutableInteger first, ImmutableInteger second); } /** Instance teto tridy reprezentuji soucin dvou cisel. */ class Product implements ImmutableInteger { static Product createProduct(ImmutableInteger first, ImmutableInteger second); } /** Instance teto tridy reprezentuji podil dvou cisel. */ class Division implements ImmutableInteger { static Division createDivision(ImmutableInteger first, ImmutableInteger second); } /** Instance implementujici toto rozhrani reprezentuji pravdivostni hodnotu, * ktera se po vytvoreni jiz nezmeni. */ interface ImmutableBoolean { /** Vrati negaci teto hodnoty. */ ImmutableBoolean not(); /** Vrati konjunkci teto a zadane hodnoty. */ ImmutableBoolean and(ImmutableBoolean other); /** Vrati disjunkci teto a zadane hodnoty. */ ImmutableBoolean or(ImmutableBoolean other); } /** Instance teto tridy reprezentuji pravdu. */ class True implements ImmutableBoolean { static True createTrue(); } /** Instance teto tridy reprezentuji nepravdu. */ class False implements ImmutableBoolean { static False createFalse(); } /** Instance teto tridy reprezentuji negaci nejake pravdivostni hodnoty. */ class Negation implements ImmutableBoolean { static Negation createNegation(); } /** Instance teto tridy reprezentuji konjunkci dvou pravdivostnich hodnot. */ class Conjunction implements ImmutableBoolean { static Conjunction createConjunction(ImmutableBoolean other); } /** Instance teto tridy reprezentuji disjunkci dvou pravdivostnich hodnot. */ class Disjunction implements ImmutableBoolean { static Disjunction createDisjunction(ImmutableBoolean other); } /** Instance teto tridy reprezentuji multimnozinu. Obsah multimnoziny je reprezentovan * v promenne inner. */ class DSAMultiset<E> { ImmutableMultiset<E> inner; /* Vytvori a vrati prazdnou multimnozinu. */ static DSAMultiset createEmptyMultiset(); /* Vytvori a vrati multimnozinu s jednim prvkem. */ static <E> DSAMultiset<E> createSingletonMultiset(E elem); /* Prida zadany prvek do teto multimnoziny. */ void add(E elem); /* Prida vsechny prvky v zadane multimnozine do teto multimnoziny. */ void addAll(DSAMultiset<E> ms); /* Odstrani zadany prvek z teto multimnoziny. */ void remove(E elem); /* Odstrani vzechny prvky v zadane multimnozine z teto multimnoziny. */ void removeAll(DSAMultiset<E> elem); /* Vyrobi kopii teto multimnoziny. */ DSAMultiset<E> clone(); /* Vrati velikost teto multimnoziny. */ ImmutableInteger size(); /* Indikuje, zda tato mnozina obsahuje zadany prvek. */ ImmutableBoolean contains(E elem); } /** Instance teto tridy reprezentuji sekvenci. Obsah sekvence je reprezentovan * v promenne inner. */ class DSASequence<E> { ImmutableSequence<E> inner; /* Vytvori a vrati prazdnou sekvenci. */ static DSASequence createEmptySequence(); /* Vytvori a vrati multimnozinu o delce jedna. */ static <E> DSASequence<E> createSingletonSequence(E elem); /* Pripoji zadanou sekvenci do teto sekvence. */ DSASequence<E> append(DSASequence<E> other); /* Pripoji zadanou sekvenci na zacatek teto sekvence. */ DSASequence<E> prepend(DSASequence<E> other); /* Vrati podsekvenci teto sekvence (jako nezavisly objekt). */ DSASequence<E> subseq(ImmutableInteger from, ImmutableInteger to); /* Vrati velikost teto sekvence. */ ImmutableInteger size(); /* Vrati prvek na zadanem indexu, prvni prvek ma index nula. */ E elementAt(ImmutableInteger elem); }
Podobné dokumenty
1 Úvod do Turbo Pascalu
Nechť máme nesetříděné pole pěti čísel, vezmeme prvek (tzv. pivota) na prostřední
pozici (zde 3), který nám pole rozdělí na 2 části. V levé části nalezneme maximum, v
pravé minimum a porovnáme je s...
Generátor sestav
1.2.2 Správci IS uživatelské organizace
Správci IS (pracovníci útvarů automatizace, informatiky a technicky zaměření pracovníci útvarů
vnitřní správy) uživatelských organizací mohou v mnoha případe...