Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø rodsjo@stud.ntnu.no



Like dokumenter
Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing

Øvingsforelesning 2 - TDT4120. Grafer og hashing. Benjamin Bjørnseth

INF1020 Algoritmer og datastrukturer

Grunnleggende Grafalgoritmer

Hashtabeller. Lars Vidar Magnusson Kapittel 11 Direkte adressering Hashtabeller Chaining Åpen-adressering

Grunnleggende Grafalgoritmer II

Grunnleggende Grafteori

Innhold. Innledning 1

Algdat - øvingsforelesning

INF Algoritmer og datastrukturer

Øvingsforelesning 4. Topologisk sortering, Strongly Connected Components og Minimale spenntrær. Magnus Botnan

Magnus Moan (Undertegnede) Enkle datastrukturer, trær, traversering og rekursjon

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

INF Algoritmer og datastrukturer

Pensum: fra boken (H-03)+ forelesninger

Pensum: fra boken (H-03)+ forelesninger

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

... HASHING. Hashing. Hashtabeller. hash(x)

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

IN Algoritmer og datastrukturer

Studentnummer: Side 1 av 1. Løsningsforslag, Eksamen i TDT4120 Algoritmer og datastrukturer August 2005

INF Algoritmer og datastrukturer

Eksamen i tdt4120 Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

INF Algoritmer og datastrukturer

SIF8010 ALGORITMER OG DATASTRUKTURER

Notater til INF2220 Eksamen

Definisjon av binært søketre

PG4200 Algoritmer og datastrukturer Forelesning 10

GRAFER. Korteste vei i en vektet graf uten negative kanter. Korteste vei, en-til-alle, for: Minimale spenntrær

Uretta grafar (1) Mengde nodar Mengde kantar som er eit uordna par av nodar

Uke 5 Disjunkte mengder

Korteste vei i en vektet graf uten negative kanter

IN Algoritmer og datastrukturer

O, what a tangled. Fjerde forelesning. Robot-eksemplet som ikke ble gjennomgått sist blir frivillig selvstudium (ut fra foilene :-)

Vi skal se på grafalgoritmer for:

INF2220: Forelesning 3

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

Innledning. IN2010/INF Algoritmer og datastrukturer. Tirsdag 27. november 2018 Kl (4 timer)

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

INF2220: Forelesning 3

Trær. Består av sammenkoblede noder Hver node har 0 eller flere barne-noder. Må være asyklisk. Et tre med n noder har n-1 kanter.

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Evt. forklar på tavla. Diskuter kjøretid (best-/ worst-case). Innsetting og søk. Rekursjon igjen. A C E G

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

INF2220: Forelesning 3. Map og hashing Abstrakte datatyper (kapittel 3.1) Map (kapittel 4.8) Hashing (kapittel 5)

Innledning Grafer. Grafer / Nettverk. Hva er en graf? Hva er en graf? Eksempler på grafer? Hva er en graf? Elementære Graf-Algoritmer

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Hashing: Håndtering av kollisjoner

Dagens plan: INF Algoritmer og datastrukturer. Grafer vi har sett allerede. Det første grafteoretiske problem: Broene i Königsberg

Oppgave 1. Sekvenser (20%)

Enkle datastrukturer. Lars Greger Nordland Hagen. Introduksjon til øvingsopplegget og gjennomgang av python

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Litt om grafer og traversering, og om hashing. Jeg gikk en tur i. Tredje forelesning

Algoritmer og Datastrukturer IAI 21899

Disjunkte mengder ADT

INF1020 Algoritmer og datastrukturer GRAFER

Kapittel 14, Hashing. Tema. Definere hashing Studere ulike hashfunksjoner Studere kollisjonsproblemet 17-1

Algoritmer og Datastrukturer

Eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Det første grafteoretiske problem: Broene i Königsberg

INF1010 Hashing. Marit Nybakken 8. mars 2004

Anvendelser av grafer

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

INF1020 Algoritmer og datastrukturer GRAFER

Vi skal se på grafalgoritmer for:

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

Lars Vidar Magnusson Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 99HINDB / 99HINEA / 00HDESY ( 2DA / 2DB / 2EA / DESY )

KONTINUASJONSEKSAMEN

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

EKSAMEN med løsningsforslag

INF2220: Forelesning 2

INF Algoritmer og datastrukturer

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Algdat-ninja på 60 minutter: Et galskapsprosjekt. Magnus Lie Hetland

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

GRAFER. Hva er en graf? Det første grafteoretiske problem: Broene i Königsberg. Grafer vi har sett allerede

Øvingsforelesning 12 Maks flyt

All good things. Fjortende forelesning

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

Binære trær: Noen algoritmer og anvendelser

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Søk i tilstandsrom. Backtracking (Kap. 10) Branch-and-bound (Kap. 10) Iterativ fordypning. Dijkstras korteste sti-algoritme A*-søk (Kap.

UNIVERSITETET I OSLO

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

Transkript:

Alg. Dat Øvingsforelesning 3 Grafer, BFS, DFS og hashing Børge Rødsjø rodsjo@stud.ntnu.no

Dagens tema Grafer Terminologi Representasjon av grafer Bredde først søk (BFS) Dybde først søk (DFS) Hashing Hashfunksjoner, hashtabeller Kollisjonshåndtering Øving 2: Redd Ratatosk Øving 3: Kobra lærer å stave

Terminologi: Grafer Node Kant Nabo Sykel Rettet graf DAGs Trær

Generelle grafer vs. trær Grafer er en overordnet, generell struktur Et tre er en graf som er sammenhengende, asyklisk og urettet I graftraversering er farging nyttig I en graf kan man oppdage grå eller svarte noder på nytt Vi må huske hvilke noder vi har sett

Representasjon av grafer En graf består av noder og relasjoner G = (V, E). V er alle nodene, E er relasjoner mellom nodene (i dagligtale: kanter)

Representasjon av grafer En graf består av noder og relasjoner G = (V, E). V er alle nodene, E er relasjoner mellom nodene (i dagligtale: kanter)

Representasjon av grafer En graf består av noder og relasjoner G = (V, E). V er alle nodene, E er relasjoner mellom nodene (i dagligtale: kanter)

Representasjon av grafer En graf består av noder og relasjoner G = (V, E). V er alle nodene, E er relasjoner mellom nodene (i dagligtale: kanter)

Nabolister Hver node har en liste over sine naboer Nyttigst hvis det er få kanter i forhold til antall noder (en sparse graf). Node a b c d e f Naboer c, d c, e d a f NIL

Nabomatrise En nxn matrise der en nabo er representert med en verdi Nyttig hvis grafen er tett (dense graf) a b c d e f a 0 0 1 1 0 0 b 0 0 1 0 1 0 c 0 0 0 1 0 0 d 1 0 0 0 0 0 e 0 0 0 0 0 1 f 0 0 0 0 0 0

Bredde først søk (BFS) En enkel algoritme for å søke i en graf Har en kø over oppdagede (grå) elementer Vi har en mengde/liste av besøkte(ferdige) noder Se side 531 i Cormen

Bredde først søk (BFS) Begynn med å legge startnoden i kø Så lenge det finnes noder i køen: Plukk ut en node x fra starten av køen Legg alle naboer som ikke er besøkte eller oppdagede inn i køen (vi oppdager/gråfarger dem) Legg x inn i besøkt-mengden (farge den sort)

Kode for BFS def bfs(root): queue = Queue() queue.put(root) while len(queue) > 0: node = queue.get() # gjør noe fancy med noden her node.colour = Black for adj in node.adjacent: if adj.colour == White: adj.colour = Grey queue.add(adj)

Bruk av BFS Finne korteste vei fra en node til alle andre, i en uvektet graf Kan sjekke om en graf er bipartitt BFS er en viktig grunnstein for mer avanserte algoritmer

Kjøretid BFS Med naboliste: O(V + E) Må besøke alle noder (V), og sjekke alle kanter (E) Med nabomatrise: O(V 2 ) Må besøke alle noder (V), og sjekke alle kanter (V 2 )

Dybde først søk (DFS) Også en enkel algoritme for å søke i en graf Starter i en node og søker i dybden så langt det går Se side 541 i Cormen

Implementere DFS Kan implementeres via både rekursjon og iterasjon Med rekursjon så kaller metoden seg selv Dette er en treg måte å gjøre det på Med iterasjon har man nodene i en stakk Kjappere, behøver ikke rekursive kall

Kode for rekursiv DFS def dfs(node): node.colour = Grey for adj in node.adjacent: if adj.colour == White: dfs(adj) # gjør noe fancy med noden her node.colour = Black

Iterativ DFS Tar vare på nodene i en stakk. Alle noder er hvite før man oppdager dem Når en node blir oppdaget blir den fargelagt grå, og lagt til i stakken. En node er ferdig når alle dens barn er ferdigbehandlet; da taes noden ut av stakken og fargelegges svart

Bruk av DFS Brukes i mange andre algoritmer Strongly connected components (neste gang) Topologisk sortering (neste gang) Kjøretid: O(V + E) Alle noder(v) må besøkes, og alle kanter(e) må sjekkes

Hashing og hashtabeller Problemet vi søker en løsning på: Man har et lite/moderat antall elementer, i et stort verdiområde. Hvordan lagre og søke etter disse effektivt? Eks: Telefonnummer og navn på ansatte. Direkte-adressering vil kreve altfor stor plass.

Hvordan løser hashing dette? Hashing er en måte å konvertere verdier fra et stort utfallsrom til et som er mye mindre. Hashing gir en form for fingeravtrykk av en verdi. Vi kan bruke dette til å lagre og hente data effektivt fra en liten og kompakt tabell

Hashtabeller: Fordelene Oppslag i O(1) tid Innsetting i O(1) tid Sletting i O(1) tid O(1) betyr konstant tid Dvs. at hastigheten på operasjonene ikke er avhengig av antall elementer i tabellen NB! Dette er average-case, ikke worst case

Hashtabeller En tabell hvor vi får en hash av dataene til å beskrive hvor vi lagrer dem.

Hashing Hashfunksjon: h(k) = x h er hashfunksjonen vi har valgt oss k er hashnøkkelen, hele eller deler av dataene x er hashen av nøkkelen, dvs. posisjonen der vi plasserer dataene i en hashtabell

Valg av hashfunksjon Mål: transformere potensielt store data til en indeks i en tabell Påkrevd egenskap: Deterministisk Ønsket egenskap: Uniform fordeling Ønsket egenskap: Kjapp å utføre

Valg av hashfunksjon Noen eksempler på enkle, gode funksjoner (Se Cormen kap. 11): Divisjonsmetoden ( modulo-metoden ) h(k) = k mod m Multiplikasjonsmetoden h(k) = m (k A mod 1)

Valg av hashfunksjon Noen eksempler på dårlige hashfunksjoner: En konstant funksjon: h(k) = 20 Java 1.1 (før 1998): java.lang.string.hashcode() benyttet kun de første 16 bokstavene i en string til å generere hashen.

Håndtering av kollisjoner Kjeding ( chaining ) Lagrer en lenket liste i hver hash-bøtte Hvis vi får mange kollisjoner tar det tid å lete etter elementene Fordel: Enkelt å implementere Ulempe: Kan bli tregt, og kan bli en del overhead

Håndtering av kollisjoner Lineær søking Hvis det er en kollisjon, prøv neste plass i tabellen Ulempe: Primary clustering yter enda dårligere enn kjeding hvis man har mange kollisjoner

Håndtering av kollisjoner Kvadratisk søking Hvis det er en kollisjon, prøv å hoppe videre slik: For hopp i: Posisjon = (h(k) + a*i + b*i 2 ) mod m Fordel: Yter bedre enn de to forrige Ulempe: Secondary clustering kan fremdeles bli problemer hvis mange elementer hasher til samme posisjon

Håndtering av kollisjoner Dobbel hashing Bruker 2 hashfunksjoner, h 1 (k) og h 2 (k) Prøv først plass h 1 (k) i tabellen Hvis det oppstår kollisjon, prøv å hoppe h 2 (k) posisjoner videre helt til vi når en åpen plass Fordel: Enkel og kjapp å implementere

Øving 2: Redd Ratatosk Hvorfor vil BFS være bedre enn DFS her? Ratatosk har lik sjanse til å være på hvert nivå Færre noder per nivå nært roten av treet BFS sjekker da først de mest sannsynlige nodene Løsningsforslag ligger ute BFS bruker kø DFS bruker stakk

Øving 2: Redd Ratatosk Tweak-løsning Vi vet allerede hvilken node Ratatosk er i Trenger ikke å lese all input, og konstruere tre Husk koblinger barn->forelder, fremfor andre veien La Ratatosk klatre ned treet ved å følge koblingene Denne spesifikke løsningen er ikke eksamensrelevant

Øving 3: Kobra lærer å stave

Øving 3: Kobra lærer å stave def bygg(ordliste): Skal bygge et tre ut fra ei liste av (ord, posisjon) Skal returnere rot-noden def posisjoner(ord, indeks, node): Skal returnere ei liste av posisjoner der ord matcher Hvis man møter spørsmålstegn, må man sjekke alle subtrær rekursivt, ved å spesifisere indeks og node i nye kall til posisjoner