Alg. Dat Øvingsforelesning 3 Grafer, BFS, DFS og hashing Børge Rødsjø

Slides:



Advertisements
Liknende presentasjoner
Høgskolen i Oslo Webprogrammering SQL og databaser del 3.
Advertisements

@ TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Åsmund Eldhuset asmunde idi.ntnu.no.
TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Kristian Veøy
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Kap.8 Sortering og søking sist oppdatert • Del 1 Søking - lineær søking m/u sorterte elementer - binærsøking - analyse • Del 2 Sortering - ”gamle”
Ulike sorteringsmetoder Kompleksitet av dem
Øvingsforelesning 9 Flytnettverk, maksimum flyt og maksimum bipartitt matching Jon Marius Venstad Redigert og forelest av Gleb Sizov.
Forside Korteste sti BFS Modifikasjon Dijkstra Eksempel Korrekthet Analyse Øving Spørsmål Dijkstras algoritme Åsmund Eldhuset asmunde *at* stud.ntnu.no.
@ TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Åsmund Eldhuset asmunde idi.ntnu.no.
Dijkstras algoritme Åsmund Eldhuset asmunde *at* stud.ntnu.no
Teoriøving 4 (1) Strongly connected component: ”det maksimale settet med noder slik at for alle nodepar (u,v) i settet finnes kantene u -> v og v -> u.
Øvingsforelesning 9 Flytnettverk, maksimum flyt og
1 Øvingsforelesning Andreas Knudsen Nils Grimsmo
Øvingsforelesning 3 Grafer, BFS, DFS og hashing
Alg. Dat Øvingsforelesning 5 Kompleksitetsanalyse Torbjørn Moralnd
Kompleksitetsanalyse
Korrekt dybde først-søk
Øvingsforelesning 12 Redusering av problemer,
Øvingsforelesning 2 Trær og søking i dem, samt litt diverse emner Kristian Veøy
Øvingsforelesning Magnus Haug
Forside Motivasjon Analyse Forside Motivasjon Analyse  -notasjon O og  Relasjoner Klasser Fallgruver Spørsmål Kompleksitetsanalyse Åsmund Eldhuset asmunde.
Generelt I/O if/else Funksjoner Lists Løkker Dictionaries Annet Listebehandling Klasser Python med noen algdat-anvendelser Åsmund Eldhuset asmunde *at*
INF 295 Forelesning 15 - kap 9 Grafer Hans Fr. Nordhaug (Ola Bø)
Klargjøring fra forrige gang
INF150 Programmering mandag 11.9
Øvingsforelesning 9 - Børge Rødsjø
Algoritmer og Datastrukturer
1 Kap 08 Kø. 2 Kø - Definisjon En kø (eng queue) er en lineær struktur hvor elementer kan innsetttes kun i den ene enden av listen, kalt bak, og fjernes.
Kap 02 Tabeller / Tabelloperasjoner. Enkeltvariable Les inn nedbørmengde for årets 12 måneder: Les n1 Les n2 … Les n12 n1 n2 n12.
Kap 10 Graf.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Dynamisk programmering
INF 295 Algoritmer og datastrukturer Forelesning 21 Merge, Quick og Bøtte, Radix og ekstern sortering Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 7 ADT Lister, Stakker og Køer Hans Fr. Nordhaug (Ola Bø)
INF 295 forelesning 14 - kap 8 Disjunkt mengde ADT Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 9a Søketrær Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 8 Trær Hans Fr. Nordhaug (Ola Bø)
INF 295 forelesning 13 - kap 6 Prioritetskø (Heap) Hans Fr. Nordhaug (Ola Bø)
INF 295 Forelesning 16 - kap 9 Minimalt spenntre og korteste vei i grafer Hans Fredrik Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 11 Når RAM ikke strekker til - B-trær og Utvidbar hashing Hans Fr. Nordhaug (Ola Bø)
INF 295 Forelesning 17 - kap 9 Korteste vei i grafer Hans Fr. Nordhaug (Ola Bø)
INF 295 Forelesning 20 - Kapittel 7 Boble-, innstikk-, Shell-, Heap-, Quick-, Mergesortering Hans Fr. Nordhaug (Ola Bø)
Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 4 Algoritmeanalyse Hans Fr. Nordhaug (Ola Bø)
INF 295 forelesning 13 - kap 6 Andre prioritetskøer Hans Fr. Nordhaug (Ola Bø)
INF 295 Forelesning 18 - kap 9 Aktivitetsgrafer
INF 295 Algoritmer og datastrukturer Forelesning 9b Balanserte (binære) trær Hans Fr. Nordhaug.
INF 295 Forelesning 19 - Dynamisk programmering Korteste vei alle til alle (Floyd) Hans Fr. Nordhaug (Ola Bø)
INF 295 Algoritmer og datastrukturer Forelesning 10 Invarianter og Hashing Hans Fr. Nordhaug (Ola Bø)
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
Hovedfagspresentasjon
INF 4130 Eksamen 2008 Gjennomgang.
Magnus Haug Algoritmer og Datastrukturer
INF2820 Datalingvistikk – V2012
INF 295 forelesning 12 Repetisjon per 17. februar Hans F. Nordhaug (Ola Bø)
Alg. Dat Øvingsforelesning 11 Dynamisk programmering, grådighet
Freenet A Distributed Anonymous Information Storage and Retrieval System.
INF 295 Algoritmer og datastrukturer Forelesning 22 Teknikker for algoritmeutvikling Hans Fr. Nordhaug/ Ola Bø.
Ortering Mål: Se på forskjellige måter for sortering.
Sorterings- Algoritmer Algoritmer og Datastrukturer.
Sterke og 2-sammenhengende komponeneter, DFS
Routing Indices For P2P Systems TDT2 – Avanserte Distribuerte Systemer Lars-Erik Bjørk.
Praktisk Midtveisevaluering av kurset («femminutterslapper») i pausen. Undervisningsfri neste uke (ingen forelesninger eller grupper). NM i programmering.
Kapittel 12 Samlingar Samlingar og datastrukturar Ei samling (collection) blir brukt til å oppbevare og handtere andre objekt ArrayList – klassen.
INF 295 Algoritmer og datastrukturer Forelesning 23 Kompleksitet Hans Fr. Nordhaug/ Ola Bø.
Øvingsforelesning 2 - TDT4120 Grafer og hashing Benjamin Bjørnseth.
1 Øvingsforelesning 4 Topologisk sortering Minimale spenntrær Håkon Jacobsen
Øvingsforelesning i Python (TDT4110)
Øvingsforelesning 10 Grådighet
Utskrift av presentasjonen:

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

Dagens tema Grafer Hashing Øving 2: Redd Ratatosk 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 Naboer a c, d b c, e c d e 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 1

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) Med nabomatrise: O(V2) Må besøke alle noder (V), og sjekke alle kanter (E) Med nabomatrise: O(V2) Må besøke alle noder (V), og sjekke alle kanter (V2)

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 Kjøretid: O(V + E) 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*i2) 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, h1(k) og h2(k) Prøv først plass h1(k) i tabellen Hvis det oppstår kollisjon, prøv å hoppe h2(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