Programkonstruktion och. Datastrukturer

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

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

Programkonstruktion och. Datastrukturer

Föreläsning Datastrukturer (DAT036)

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

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

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

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

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

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 9 Datastrukturer (DAT037)

Datastrukturer. föreläsning 10. Maps 1

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

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

Föreläsning 9 Innehåll

Programkonstruktion och Datastrukturer

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

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)

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

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

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

Lösningar Datastrukturer TDA

Föreläsning Datastrukturer (DAT036)

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

Datastrukturer och algoritmer

Träd Hierarkiska strukturer

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

Algoritmer och datastrukturer 2012, fo rela sning 8

Datastrukturer. föreläsning 9. Maps 1

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Informationsteknologi Tom Smedsaas 19 augusti 2016

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

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å

Tentamen Datastrukturer för D2 DAT 035

Ä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.

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

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

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.

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Tentamen Datastrukturer D DAT 035/INN960

Datastrukturer. Föreläsning 5. Maps 1

Föreläsning 4 Datastrukturer (DAT037)

Vad har vi pratat om i kursen?

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Föreläsning 10 Datastrukturer (DAT037)

Lösningsförslag till exempeltenta 1

13 Prioritetsköer, heapar

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 3 Datastrukturer (DAT037)

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 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

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

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

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

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

Sökning och sortering

Föreläsning Datastrukturer (DAT037)

Föreläsning 13 Innehåll

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

Föreläsning 13 Datastrukturer (DAT037)

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

Datastrukturer som passar för sökning. Föreläsning 10 Innehåll. Inordertraversering av binära sökträd. Binära sökträd Definition

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

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Föreläsning 13 Datastrukturer (DAT037)

Seminarium 13 Innehåll

Algoritmer, datastrukturer och komplexitet

Föreläsning 9 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

KTH, NADA, Vahid Mosavat. 1. Flervalsfrågor (5p)

Föreläsning Datastrukturer (DAT036)

Fredag 10 juni 2016 kl 8 12

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

Tentamen TEN1 HI

Algoritmer, datastrukturer och komplexitet

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.

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

Programmering för språkteknologer II, HT2014. Rum

Trädstrukturer och grafer

Tentamen, Algoritmer och datastrukturer

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

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Tentamen TEN1 HI

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

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

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning 13. Träd

Datastrukturer som passar för sökning. Föreläsning 11 Innehåll. Binära sökträd Definition. Inordertraversering av binära sökträd

Institutionen för datavetenskap

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen kl Uppgift 4. Uppgift 5

Transkript:

Programkonstruktion och Datastrukturer Repetitionskurs, sommaren 2011 Datastrukturer (Listor, Träd, Sökträd och AVL-träd) Elias Castegren elias.castegren.7381@student.uu.se

Datastrukturer Vad är en datastruktur? Ett sätt att lagra och organisera data på ett effektivt sätt i en dator. Wikipedia En datastruktur kan lagra ett eller fl era värden i samma struktur. Olika datastrukturer har ofta olika för- och nackdelar.

Array En array (eller en vektor*) är en datastruktur med n celler, som ofta indexeras från 0 till n-1.... 0 1 2 3 n-3 n-2 n-1 Att lagra eller hämta ett värde från en godtycklig cell går på konstant tid. Vill man utvidga arrayen måste man skapa en ny, större array och kopiera de gamla värdena. Bakom kulisserna är en array en obruten sekvens av ettor och nollor i minnet. *I ML är en array en vektor där alla celler är referenser.

Array En stor nackdel med arrayer är att de använder lika mycket minne oavsett hur många celler som innehåller lagrade värden. Man är också låst till den övre gräns man sätter när man anger antalet celler i arrayen. Att hitta en bra balans mellan minnesanvändning och antalet tillgängliga celler kan vara svårt! Ett alternativ är att använda en rekursiv datastruktur.

Rekursiva datastrukturer En rekursiv datastruktur är en datastruktur som lagrar ett eller fl era värden som också är samma sorts datastruktur. Det enklaste exemplet är en lista.

Listor En lista (som inte är tom) innehåller ett värde och en till lista som är resten av värdena: datatype 'a list = nil Cell of 'a * 'a list; v1 v2 v3 v4 Cell(v1, Cell(v2, Cell(v3, Cell(v4, nil)))) Använder bara så mycket minne som behövs för de värden som fi nns lagrade för tillfället. För att utvidga listan tillfogar man bara en till list-cell. (Självklart använder man MLs inbyggda syntax för listor)

Listor Även om vi har vunnit möjligheten att utvidga och krympa datastrukturen efter behov (listor är en dynamisk datastruktur) så har vi förlorat möjligheten att lagra och hämta värden på konstant tid. Vi ser bara den första list-cellen. För att hitta en specifi k cell måste vi gå genom alla föregående celler. Tidskomplexiteten för åtkomst i datastrukturen har gått från O(1) för arrayer till O(n) för listor.

Rekursiva datastrukturer En rekursiv datastruktur är en datastruktur som lagrar ett eller fl era värden som också är samma sorts datastruktur. Det enklaste exemplet är en lista. Strukturer som innehåller fl er än en strukturrekursion kallas för trädstrukturer.

Träd Ett träd består av noder som kan ha ett fast eller godtyckligt antal undernoder som också är träd. En nod som inte har några undernoder kallas för ett löv. Binärt träd: datatype 'a tree = nil Node of 'a * 'a tree * 'a tree Triärt träd: datatype 'a tree = nil Node of 'a * 'a tree * 'a tree * 'a tree Generellt träd: datatype 'a tree = Node of 'a * 'a tree list

Träd Binärt träd: v2 Generellt träd: v1 v4 v5 v6 v3 Node(v1, Node(v2, Node(v4, nil, nil) Node(v5, nil, nil)), Node(v3, Node(v6, nil, nil) nil)) v1 Node(v1, [Node(v2, [Node(v5, []), v2 v3 v4 Node(v6, [])]), Node(v3, []), Node(v4, v5 v6 v7 [Node(v7, [Node(v8, []), Node(v9, []), v8 v9 v10 v11 Node(v10, [], Node(v11, [])]]])

Träd Träd är också dynamiska datastrukturer men tidskomplexiteten för åtkomst är fortfarande linjär. Man måste söka igenom alla vägar i trädet för att vara säker på att hitta en viss nod. Binära sökträd råder bot på detta!

Binära sökträd Ett binärt sökträd är ett binärt träd där varje nod dessutom innehåller ett unikt värde kallat nodens nyckel: datatype 'a searchtree = nil int * 'a * 'a searchtree * 'a searchtree Nyckel Data Vänster delträd Höger delträd Noderna i ett sökträd är ordnade så att alla noder i vänster delträd har en nyckel som är mindre än rotnodens, medan alla noder i höger delträd har en nyckel som är större än rotnodens.

Binära sökträd Om vi letar efter noden som har nyckeln k och noden vi tittar på just nu har nyckeln k' gör vi följande val: Om k=k' så har vi hittat rätt nod och kan sluta leta. Om k<k' så måste noden vi söker ligga i vänster delträd, alla nycklar i det högra delträdet har ju nycklar som är strikt större än k'. Om k>k' så måste noden vi söker ligga i höger delträd, med samma resonemang som ovan. I varje steg kan vi alltså utesluta ett delträd från sökningen!

Binära sökträd Leta efter noden med nyckeln 3 Om trädet är balanserat (delträdens höjder skiljer inte allt för mycket): 3 < 5 3 > 2 3 < 4 3 = 3 I varje steg försvinner (ungefär) hälften av de återstående noderna: T(n) = T(n/2) + O(1) 5 2 7 1 4 5 8 3 Andra fallet av Master theorem => T(n) = O(lg(n))

Binära sökträd Leta efter noden med nyckeln 3 Om trädet är obalanserat: 3 < 7 3 < 6 3 < 5 3 < 4 3 = 3 3 I varje steg försvinner bara en av noderna (den vi undersöker för tillfället) T(n) = T(n-1) + O(1) T(n) = O(n) 4 5 6 7

Binära sökträd I binära sökträd har vi en dynamisk datastruktur med potentiellt logaritmisk tidskomplexitet för åtkomst. Inte lika snabb som en array men ändå en god konkurrent! Bara effektiv om sökträdet är balanserat. I värsta fall beter den sig precis som en lista. Hur får man ett balanserat sökträd? Om nycklarna anländer helt slumpmässigt blir trädet (tillräckligt) balanserat för bra prestanda. Man använder ett självbalanserande sökträd!

AVL-träd Ett AVL-träd är ett binärt sökträd där varje nod också innehåller nodens balansfaktor. Balansfaktorn är den längsta vägen till ett löv i det högra delträdet minus den längsta vägen till ett löv i det vänstra delträdet. Möjliga balansfaktorer i ett AVL-träd: -2 Vänster-obalanserat -1 Vänstertungt 0 Balanserat 1 Högertungt 2 Höger-obalanserat

AVL-träd Ett AVL-träd kan balansera sig självt med hjälp av rotationer: (A, B och C är delträd) X Högerrotation Y Y C A X A B Vänsterrotation B C Vi säger att vi högerroterar trädet eller högerroterar mot noden x. En rotation kan utföras på konstant tid.

AVL-träd Varje gång man lägger till en nod i ett AVL-träd uppdaterar man berörda noders balansfaktorer. Så länge en nod är balanserad eller tung åt något håll (balansfaktorn är 0, -1 eller 1) så gör man ingenting. Om en nod blir är obalanserad (balansfaktor -2 eller 2) måste man rotera för att återställa balansen.

AVL-träd Fyra fall där balansering behövs: Noden n är vänster-obalanserad Vänstra delträdet är vänstertungt: 1. Högerrotera mot noden n Vänstra delträdet är högertungt 1. Vänsterrotera vänstra delträdet 2. Högerrotera mot noden n Noden n är höger-obalanserad Högra delträdet är högertungt: 1. Vänsterrotera mot noden n Högra delträdet är vänstertungt 1. Högerrotera högra delträdet 2. Vänsterrotera mot noden n

AVL-träd Fyra fall där balansering behövs: 0 Vänster vänster : Z -1 Y -2 X Högerrotation mot X Vänster höger : +1 Y -2 X Z 0 Vänsterrotation mot Y 0 Y -1 0 Y 0 0 Z X Z -2 Motsvarande fast spegelvänt gäller då rotnoden (X) är höger-obalanserad X Högerrotation mot X 0 Z 0 0 Y X

AVL-träd Ett AVL-träd är alltså alltid balanserat, så när som på att höjden av en nods två delträd kan skilja med 1 (om noden är vänster- eller högertung). Åtkomst fungerar på samma sätt som i ett binärt sökträd T(n) = O(lg(n)) Insättning kräver som mest två traverseringar till rätt plats i trädet (en för att sätta in noden och en för att räkna ut nya balansfaktorer) plus som mest två rotationer T(n) = 2 O(lg(n)) + 2 O(1) = O(lg(n))

AVL-träd Kom ihåg: Komplexitet säger inget om körtiden! Även om AVL-träd har en bra komplexitet så är det förstås mindre minnes- och beräkningskrävande att använda ett vanligt binärt sökträd. Rotation och balansering går snabbt men är inte gratis. I en situation där det krävs många insättningar blir det också mycket jobb att balansera. För små datamängder kan det vara bättre att använda en enklare datastruktur. En bra applet för att experimentera med AVLträd fi nns här: http://www.qmatica.com/datastructures/trees/avl/avltree.html

Övningar Sätt in nycklarna 5, 3, 8, 2, 4, 1, 7, 9, 6 i ett tomt AVL-träd. Rita hela trädet (med balansfaktorer) efter varje insättning. Övningen (med lösningsförslag) gavs till SI-möte 8 Vilka datastrukturer kan vara lämpliga om man vill lagra följande information: Medlemsregistret i en hemlig klubb, nycklar är medlemmarnas personnummer Medlemsregistret i en ännu hemligare klubb, nycklar är datum och klockslag då man gick med i klubben Registreringsskyltarna för bilarna som står parkerade i ett parkeringshus, nycklar är parkeringsplatsernas nummer.