Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Relevanta dokument
Linjär sökning. Föreläsning 12. Binär sökning. Exempel: Binära sökträd. Binärt sökträd

Datastrukturer och algoritmer

Träd Hierarkiska strukturer

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Datastrukturer. föreläsning 10. Maps 1

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 9 Datastrukturer (DAT037)

Programkonstruktion och. Datastrukturer

Lösningar Datastrukturer TDA

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Föreläsning 13 Innehåll

Föreläsning 11 - Automater, textsökning, tillstånd

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Föreläsning 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

Innehåll. Föreläsning 10. Specifikation. Mängd. Specifikation. Konstruktion av mängd. Mängd Lexikon Hashtabell

Föreläsning Datastrukturer (DAT036)

Föreläsning 5 TDDC91,TDDE22,725G97: DALG. Föreläsning i Datastrukturer och algoritmer 18 september 2018

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Seminarium 13 Innehåll

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

13 Prioritetsköer, heapar

Föreläsning 7. Träd och binära sökträd

Föreläsning 4 Datastrukturer (DAT037)

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning 5 Datastrukturer (DAT037)

Programkonstruktion och. Datastrukturer

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 9 Innehåll

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Datastrukturer och algoritmer. Innehåll. Trie. Informell specifikation. Organisation av Trie. Föreläsning 13 Trie och Sökträd.

Självbalanserande AVL-träd Weiss, avsnitt 4.4

Exempeltenta GruDat 2002/2003

Magnus Nielsen, IDA, Linköpings universitet

Hashtabeller. TDA416, lp3 2016

Algoritmer och datastrukturer 2012, fo rela sning 8

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Innehåll. Föreläsning 11. Organisation av Trie. Trie Ytterligare en variant av träd. Vi har tidigare sett: Informell specifikation

Innehåll. F7: Tabell, hashtabell, relation & lexikon. Gränsyta till Tabell. Tabell. Tabell Hashtabell Relation Lexikon.

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Föreläsning 10 Datastrukturer (DAT037)

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Fredag 10 juni 2016 kl 8 12

Lösningsförslag till exempeltenta 1

Föreläsning 6. Sökträd: AVL-träd, Multi-Way -sökträd, B-träd TDDC70/91: DALG. Innehåll. Innehåll. 1 AVL-träd

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

Föreläsning 9 Innehåll

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Tommy Färnqvist, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Rekursiva algoritmer sortering sökning mönstermatchning

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Magnus Nielsen, IDA, Linköpings universitet

Grundläggande datalogi - Övning 4

Algoritmer, datastrukturer och komplexitet

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Datastrukturer. föreläsning 9. Maps 1

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Lösningsförslag till tentamen Datastrukturer, DAT037,

Optimala koder. Övre gräns för optimala koder. Gränser. Övre gräns för optimala koder, forts.

Optimala koder. Det existerar förstås flera koder som har samma kodordsmedellängd. Enklaste fallet är att bara byta 0:or mot 1:or.

Föreläsning 6 Datastrukturer (DAT037)

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Datastrukturer. föreläsning 6. Maps 1

Föreläsning 5: Grafer Del 1

Tentamen Datastrukturer D DAT 035/INN960

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Vad har vi pratat om i kursen?

Föreläsning 5: Dynamisk programmering

Föreläsning 10 Innehåll

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Lösningsförslag till tentamen Datastrukturer, DAT037,

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Transkript:

Innehåll Föreläsning 12 Sökträd Sökning Sökning och Sökträd 383 384 Binärt sökträd Används för sökning i linjära samlingar av dataobjekt, specifikt för att konstruera tabeller och lexikon. Organisation: Ett binärt träd som är sorterat med avseende på en sorteringsordning R av etikett-typen så att I varje nod N gäller att alla etiketter i vänster delträd går före N som i sin tur går före alla etiketter i höger delträd. Alla noder är definierade. Binära sökträd Om trädet är komplett så vet vi att både medel- och värstafallskomplexiteten är O (log n). Men Det tar tid och kraft att se till att trädet är komplett. Ibland kan man tvingas bygga om hela trädet. Det räcker att se till att balansen är god 385 386 Balanserade binära sökträd Finns flera olika metoder t.ex.: AVL träd Röd svarta träd (Red-black tree) B-träd Annan trädstruktur med balanseringsfunktionalitet. Flervägs sökträd Ett m-vägs sökträd (m-way search tree, m-ary search tree) är en generalisering av ett binärt sökträd. Trädet är ett ordnat träd där varje nod har högst m delträd. Etiketterna är sekvenser av upp till m-1 värden i stigande sorteringsordning som fungerar som delningspunkter vid sökning. Oftast är etiketterna nycklar och värdet till en viss nyckel finns i lövet. 387 388

Flervägs sökträd Till en nod med k+1 delträd, t 0, t 1,, t k hör en sekvens med värden v 1, v 2,, v k. Sorteringsvillkoret för trädet är att: alla värden i t 0 går före v 1 (i sorteringsordningen) alla värden i t j ligger mellan v j och v j+1 för 1<j<k alla värden i t k går efter v k Operationerna blir liknande de för binärt sökträd. Plattare träd. Höjden = log m n B-träd Ett B-träd av ordning m är en typ av balanserat m-vägs sökträd som uppfyller följande: Roten är antingen ett löv eller har minst två barn Alla noder utom roten och löven har mellan m/ 2 och m barn Alla löv är på samma djup Mer jobb i noderna 389 390 B-träd Insättning av nya element görs alltid på den djupaste nivån, i rätt löv för att bevara sorteringsordningen. En insättning kan leda till att noden blir för stor (dvs > m). Då måste noden delas upp. Borttagning kan leda till att man måste justera värdena och slå ihop noder eller omfördela värden mellan dem. B-träd av ordning 3 kallas också 2-3 träd 391 B-träd analys: För ett B-träd av ordning m, med höjden h och n nycklar insatta gäller h = O(log n). För att välja rätt underträd vid sökning krävs att man stänger in sökt nyckel mellan två nycklar i noden. Om nycklarna är sorterade och lagrade i en vektor kan man använda binärsökning. Sökning i en nod O(log m) Nycklarna i vektorn måste skiftas runt vid splittring av en nod. Kostnad O(m) Eftersom m är en konstant blir det O(1) arbete i varje nod vid sökning och insättning. Antalet noder som berörs är uppåt begränsad av höjden. Värstafallskostnad för sökning och insättning O(log n) 392 Exempel på B-träd: 2-4 träd Varje nod har 1, 2 eller 3 nycklar och varje ickelöv har 2-4 barn. Regel för insättning: Man letar sig fram till rätt löv på liknande sätt som i ett vanligt sökträd. Den nya nyckeln sätts in där. Om det blir för många nycklar i det lövet splittras det och det mittersta värdet skickas upp till föräldern som en uppdelningspunkt (eller en ny rotnivå skapas om vi 393 var i rotnoden) Exempel på B-träd: 2-4 träd Regel för borttagning: Leta rätt på rätt nod. Om detta inte är en lövnod byt plats på denna nod och största i delträdet till vänster eller minsta i delträdet till höger. Man letar sig fram till rätt löv i noden, ta bort den som ska bort. Några olika fall kan uppstå vid borttagningen ur lövnoden Enkla fallet: Det finns flera nycklar i noden. Plocka bara bort Halvsvåra fallet: Syskonen har extra noder som vi kan förskjuta till vår nod. Svåra fallet: Vi får tomt och syskonen har bara ett element. Då måste slå ihop noder. 394

Linjär sökning Starta från början och sök tills elementet hittat eller sekvensen slut. Komplexitet Elementet finns: I medel gå igenom halva listan, O(n) Elementet saknas: I medel gå igenom hela listan, O(n) Om listan är sorterad: Elementet saknas: Räcker i medel att leta genom halva listan n/2, O(n) Binär sökning Om sekvensen har index (tex i en array eller numrerad lista) kan man söka binärt. Successiv halvering av sökintervallet. Vi får värsta-falls och medelkomplexitet O(log n). Jämför med elementet närmast mitten i intervallet. Om likhet klart! Om det sökta värdet kommer före i sorteringsordningen fortsätt sökningen rekursivt i det vänstra delintervallet. Om det kommer efter i sorteringsordningen fortsätt sökningen rekursivt i det högra delintervallet. 395 396 Exempel: 1 2 4 4 6 7 9 13 14 19 Sök efter elementet 13. Linjär sökning: 8 jämförelser innan träff. Binär sökning: 2 jämförelser innan träff. Sök efter elementet 10 Linjär sökning: 8 jämförelser innan man ger upp. Binär sökning: 4 jämförelser innan man ger upp. Strängsökning Specialfall av sökning. Man söker inte ett enstaka element utan en sekvens av element. Elementet ofta tecken, men kan även vara andra typer av data. Formellt: Vi har ett mönster P med längd m och vi söker i en sekvens S av längd n där m<<n. 397 398 Ett antal algoritmer Naiv Strängsökning Knuth Morris Pratt Booyer Moore Rabin-Karp Första försök till algoritm: Börja jämföra mönstret med sekvensen med start i position ett. Jämför mönstret från vänster till höger tills man misslyckas. Flytta då fram en position i sekvensen och försök igen. Värsta fallet: Varje element i S avläses m gånger, dvs O(n*m) I praktiken bättre 399 400

Exempel Knuth Morris Pratt Utnyttjar en felfunktion f som berättar hur mycket av mycket av den senaste jämförelsen man kan återanvända om man felar är definierat som det längsta prefixet i P[0,...,j] som också är suffix av P[1,...,j] där P är vårt mönster. visar hur mycket av början av strängen matchar upp till omedelbart före felet 401 402 Felfunktion exempel Om jämförelsen felar på position 4, så vet vi att a,b i position 2,3 är identiska med position 0,1 j 0 1 2 3 4 5 P[j] A B A B A C f(j) 0 0 1 2 3 0 403 KMP-algoritmen Input: String T (text) with n characters and P (pattern) with m characters. Output: Starting index of the first substring of T matching P, or an indication that P is not a substring of T. f <- KMPfailureFunction(P) i <- 0 j <- 0 while i < n do if P[j] = S[i] then if j = m-1 then return i-m-1 // En matchning j <- j+1 else if j > 0 then // ingen match, vi har gått j index direkt efter // matchande prefix i P j <- f(j-1) else return ingen matchning av delsträngen P i S 404 KMPfailureFunction(P) i <- 1 j <- 0 while i < m-1 do if P[j] = P[i] then f(i)<- j+1 j <- j+1 else if j > 0 ingen match then j <- f(j-1) //j index efter pref som match. prefix else //ingen matchning f(i) <- 0 405 i KMP exempel a b a c a a b a c c a a a a a a 0 1 2 3 4 5 j j 0 1 2 3 4 5 P[j] f(j) 0 0 1 0 1 2 406

KMP-Algoritmen Låt k = i - j (startpositionen för ev matchning) För varje varv i while-loopen händer ett av följande: S[i] = P[j], öka i och j med 1, k oförändrad. S[i] < > P[j] och j > 0, i är oförändrad men k ökar med minst 1 eftersom den ändras från i - j till i - f(j-1) S[i] < > P[j] och j = 0, öka i med 1 och öka k med 1 (ty j oförändrad). Alltså för varje varv i loppen ökar antingen i eller k med minst 1. Max antal varv blir 2n Detta antar att f redan är beräknad (som är O(m)). Total komplexitet: O(n + m) 407 Boyer-Moores algoritm Två idéer: Gör matchningen baklänges, med start i mönstrets sista element. Utnyttja kunskap om mönstrets uppbyggnad och informationen om värdet på den första felmatchande elementet i S för att flytta fram mönstret så långt som möjligt varje gång. Om det finns upprepningar av element i mönstret så får man bara flytta fram till den högraste förekomsten. Förskjutningstabell talar om hur långt man får flytta. 408 Rabin-Karp Beräkna ett hashvärde för mönstret och för varje delsträng av texten som man ska jämföra med Om hashvärdena är skilda, beräkna hashvärdet för det nästa M tecknen i texten Om hashvärdena är lika, utför en brute-force jämförelse mellan P och delsträngen Med andra ord: Endast en jämförelse per deltext Brute-force endast när hashvärdena matchar. Rabin-Karp exempel Hashvärdet för AAAAA = 37 Hashvärdet för AAAAH = 100 AAAAAAAAAAAAAAAA AAAAH 100 <> 37 AAAAAAAAAAAAAAAA AAAAH 100 <> 37 AAAAAAAAAAAAAAHA AAAAH 100 = 100 409 410 Rabin-Karp hashfunktionen Vilken? Den får inte kosta för mycket... Betrakta de nästa M tecknen i söksträngen som ett M-siffrigt tal i basen b, där b är antalet bokstäver i alfabetet Textsekvensen t[i..i+m-1] avbildas på talet! x(i) = t[i]b M-1 + t[i+1]b M-2 +...+ t[i+m-1] Rabin-Karp hashfunktionen Billigt att beräkna x(i+1) från x(i)! x(i+1) = t[i+1]b M-1 + t[i+2]b M-2 +...+ t[i+m] x(i+1) = x(i)b! skifta ett vänster,! - t[i]b M! ta bort den vänstraste termen! + t[i+m]! lägg till den nya högertermen Behöver inte räkna om hela talet utan gör bara en justering för det nya tecknet 411 412

Hash-värdet fortsättning Om M är stort blir blir (b M ) enormt därför så hashar man med mod ett stort primtal q h(i) = ((t[i]b M-1 mod q) + (t[i+1]b M-2 mod q)+...+ (t [i+m-1] mod q)) mod q h(i+1) = (h(i)b mod q!! - (t[i]b M mod q)!! + (t[i+m] mod q) mod q Algoritm hash_m <- Beräkna hashvärdet för M hash_s <- Beräkna hashvärdet för den första delsträngen do if (hash_m = hash_s) then Bruteforce jämförelse av M och S hash_s + 1 tecken beräknas while end of text or match 413 414 Komplexitet Om det är tillräckligt stort primtal q för hashfunktionen så kommer hashvärdet från två mönster vara distinkta I detta fall så tar sökningen O(N) där N är antalet tecken i strängen Men det finns alltid fall som ger i närheten av värsta fallet O(N*M) om primtalet är för litet 415