Exam Flashcards
Prepare for the exam :')
Teorija: Neusmeren graf
Definicija, terminologija(1)
- Skup čvorova i kolekcija grana gde svaka povezuje neuređen par čvorova.
- Definicija: susedne grane, incidentnost, stepen čvora
- Podgraf: podskup grana grafa i povezanih čvorova
Teorija: Neusmeren graf
Povezanost, put (2)
- Put: sekvenca čvorova povezanih granama.
- Staza: put bez ponovljenih čvorova
- Kontura: put sa bar jednom granom čiji su prvi i poslednji čvor isti.
- Dva čvora povezana ako postoji put između.
- Povezan graf: postoji put između svaka dva čvora; u suprotnom, skup povezanih komponenti koji predstavljaju maksimalno povezane podgrafove.
Teorija: Neusmeren graf
Stablo, bipartitnost (3)
- Stablo: acikličan povezan graf. Ima V-1 granu i nema konture, povezan je, ali uklanjanjem jedne grane neće biti, ako mu se doda jedna grana dobija konturu i tačno jedna snaza povezuje svaki par čvorova.
- Šuma: disjunktan skup stabala.
- Pokrivajuće stablo je podgraf koji sadrži sve čvorove u stablu.
- Pokrivajuća šuma je unija pokrivajućih stabala povezanih komponenti datog grafa.
- Bipartitan graf: može da podeli svoje čvorove u 2 disjunktna skupa tako da sve grane povezuju čvorove iz različith skupova.
API: Graph
public class Graph Graph(int V) Graph(In in) int V() int E() void addEdge(int v, int w) Iterable<Integer> adj(int v); String toString()
Teorija: reprezentacije grafa
- Matrica susedstva: V×V boolean niz, v×w true ako postoji grana između njih
* prostor: V²
* dodavanje grane, provera postojanja grane u konstantnom vremenu (multi grane zabranjene)
* iteracija kroz susede čvora: V - Niz grana: klasa Edge i dve instance tipa int, direktna reprezentacija jednostavna, implemenacija adj() zahteva prolazak kroz sve grane
* prostor: E
* dodavanje grane u konstantnom vremenu
* provera postojanja grane i iteracija kroz susede čvora: E - Lista susedstva: niz čvorova i liste sa susedima
* prostor: V+E
* dodavanje grane u konstantnom vremenu
* provera postojanja grane i iteracija kroz susede čvora: degree(v)
Teorija: pretraživanje grafa u dubinu
Neusmeren graf
Cilj korišćenja DFS-a: sistematičan prolazak kroz graf (prolazak kroz lavirint)
Primena: za pronalazak svih čvorova povezanih sa datim i pronalazak puta između 2 čvora
Dizajn: pretraživanje grafa u dubinu
Neusmeren graf
public class Paths Paths(Graph G, int s) boolean hasPathTo(int v) Iterable<Integer> pathTo(int v)
DFS(to visit a vertex v)
Mark v as visited
Recursively visit all unmarked vertices w adjacent to v
Strukture:
marked[] - boolean niz za obeležavanje posećenih čvorova
edgeTo[] - integer niz za čuvanje puteva
stack za rekurziju
Pretpostavka: DFS označava sve čvorove povezane sa s u vremenu E+V.
Tačnost: ako je w označeno, onda je povezano sa s, jer DFS pronalazi čvorove isključivo praćenjem grana.
Vreme: svaki čvor povezan sa s je posećen jednom.
Pretpostavka: može se proveriti da li je v povezano sa s u konstantnom vremenu i može se naći v-s put (ako postoji) u vremenu proporcionalnom njegovoj dužini.
edgeTo[] predstavlja stablo sa korenom u s (dokaz indukcijom).
Kompleksnost: DFS kod neusmerenih grafova
Preprocessing time: E+V
Query: konstantno
Prostor: E+V
Teorija: tabele simbola
- struktura za parove vrednost-ključ; očekuje se da je klijentu dostupno ubacivanje vrednosti u tabelu i da je pretražuje po zadatom ključu
- upotreba: rečnik, web pretraga, account management…
- u tabeli nema duplikata, ubacivanje novog para sa istim vrednostima radi samo update vrednosti vezane za prosleđeni ključ; ključ ne može biti null i ne može biti vezan za null vrednost
API: tabela simbola
Neuređena lista
Prednosti: odličan za male ST
Mane: spor za velike ST
public class ST<Key, Value> ST() void put(Key key, Value value) Value get(Key key) void delete(Key key) boolean contains(Key key) boolean isEmpty() int size() Iterable<Key> keys()
API: tabela simbola
Uređen niz
Sve metode kao za standardni ST + operacije koje zavise od poretka
Prednosti: optimalna pretraga i prostor, operacije zavise od uređenosti
Mane: sporo ubacivanje
public class ST<Key extends Comparable<Key>, Value> Key min() Key max() Key floor(Key key) Key ceiling(Key key) int rank(Key key) Key select(int k) void deleteMin() void deleteMax() int size(Key low, Key high) Iterable<Key> keys(Key low, Key high)
Kompleksnost: tabela simbola
Neuređena lista
- Pretraživanje i ubacivanje (zagarantovano): N
- Pretraživanje (hit): N/2; ubacivanje: N (average case)
- Ključni interfejs: equals()
- Sve operacije osim uređene iteracije: N; uređena iteracija: N log N
Average: posle N random ubacivanja
Kompleksnost: tabela simbola
Uređeni niz
- Pretraživanje: log N; ubacivanje N (zagarantovano)
- Pretraživanje (hit): log N; ubacivanje N/2 (average case)
- Ključni interfejs: compareTo()
- Ubacivanje, brisanje i uređena iteracija: N
- Pretraživanje, floor/ceiling, rank: log N
- min/max, select: konstantno vreme
Average: posle N random ubacivanja