Föreläsning Datastrukturer (DAT036)

Relevanta dokument
Föreläsning 9 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 9 Innehåll

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 Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

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

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Datastrukturer. föreläsning 9. Maps 1

Föreläsning Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

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

DAI2 (TIDAL) + I2 (TKIEK)

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

Föreläsning 10 Innehåll

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

Tentamen Datastrukturer (DAT036)

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

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 8 Datastrukturer (DAT037)

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

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

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 5 Datastrukturer (DAT037)

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Föreläsning 3 Datastrukturer (DAT037)

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

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

Föreläsning 3 Datastrukturer (DAT037)

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

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

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

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

Datastrukturer. Föreläsning 5. Maps 1

Föreläsning Datastrukturer (DAT036)

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Lösningar Datastrukturer TDA

Föreläsning Datastrukturer (DAT036)

Föreläsning 13 Datastrukturer (DAT037)

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

Seminarium 13 Innehåll

Trädstrukturer och grafer

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

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

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Träd Hierarkiska strukturer

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

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

Föreläsning 9 Innehåll

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

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Föreläsning 13 Datastrukturer (DAT037)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Algoritmer och datastrukturer 2012, fo rela sning 8

Algoritmer och datastrukturer

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

Datastrukturer. föreläsning 10. Maps 1

13 Prioritetsköer, heapar

Tentamen i Algoritmer & Datastrukturer i Java

Datastrukturer i Haskell

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

Tentamen Datastrukturer D DAT 036/DIT960

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

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

Föreläsning Datastrukturer (DAT037)

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

Tentamen Datastrukturer (DAT036)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen Datastrukturer (DAT037)

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Symboliska konstanter const

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å

Träd. Ett träd kan se ut på detta sätt:

Länkade strukturer, parametriserade typer och undantag

Föreläsning 14 Innehåll

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

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 2 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Lösningsförslag till exempeltenta 1

Transkript:

Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-11-25

Idag Starkt sammanhängande komponenter Duggaresultat Sökträd

Starkt sammanhängande komponenter

Uppspännande skog Graf, och en möjlig skog: 2 5 6 2 1 5 1 3 4 6 4 3

I Haskell type Forest = [Tree] data Tree = Root Vertex [Edge] type Vertex = Integer data Edge = Regular Tree Other Kind Vertex data Kind = Forward Back Cross -- Börjar varje sökning i den första obesökta -- listnoden dfs :: Graph -> [Vertex] -> Forest dff :: Graph -> Forest dff g = dfs g (vertices g)

Traversering -- Alla trädnoder, i preorder (vänster till höger) preorderlr :: Tree -> [Vertex] -- Alla trädnoder, i preorder (höger till vänster) -- Motsvarar att traversera skogen i postordning -- (vänster till höger), och pusha noderna på en -- till att börja med tom stack preorderrl :: Forest -> [Vertex]

SCC-algoritm -- Reverserar grafen opposite :: Graph -> Graph -- Resultatet är omvänt topologiskt sorterat sccs :: Graph -> [[Vertex]] sccs g = map preorderlr (dfs g stack) where stack = preorderrl (dff (opposite g))

Ger följande funktion en lista av starkt sammanhängande komponenter som svar? sccs :: Graph -> [[Vertex]] sccs g = map preorderlr (dfs (opposite g) stack) where stack = preorderrl (dff g)

Dugga

Duggaresultat Uppgift 1 42/73 Uppgift 2 24/73 Uppgift 3 16/73

Uppgift 1 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { minsert(i + j, qdelete-min()); } } insert: O(1) Totalt: O(n 2 ) delete-min: O(log q ) Totalt: O(n 2 log n 2 ) = O(n 2 log n) Totalt: O(n 2 + n 2 log n) = O(n 2 log n) Noggrannare analys: Θ(n 2 log n)

Uppgift 1 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { minsert(i + j, qdelete-min()); } } Vanliga misstag: O(log(n 2 )) = O(n), totalt O(n 3 ) Däremot: O(log(2 n )) = O(n) O(log(n 2 )) = O(log n) O(n 2 n) = O(n 2 ) (?) Däremot: O(n 2 + n) = O(n 2 )

Uppgift 2 Implementera en metod som sätter in ett element först i en cirkulär array, på konstant tid: A[] queue; // Arrayen Invariant: queuelength > 0 int size; // Köns storlek // Invariant: 0 <= size <= queuelength int front; // Invariant: 0 <= front <= queuelength // Om size > 0 pekar front på köns första // element Om size > 1 pekar // (front + 1) % queuelength på köns // andra element Och så vidare

// Sätter in a först i kön Om kön är full lämnas den // oförändrad Resultatet är true om elementet sattes // in, och annars false Tidskomplexitet: O(1) public boolean push(a a) { if (size == queuelength) { return false; } size++; if (front <= 0) { front = queuelength; } front--; queue[front] = a; } return true;

Uppgift 2 Några misstag: Inte cirkulär array Inte konstant tid (flyttar alla element) Användning av länkade listor (?) Insättning sist i kön Ej size++

Uppgift 2 Några misstag: Inte cirkulär array Inte konstant tid (flyttar alla element) Användning av länkade listor (?) Insättning sist i kön Ej size++ Testa!

Uppgift 3 new Priority-queue(P )/empty(p ): O(1) insert(v,p): O(log n) delete-min(): O(log n) delete-small(): Tar bort alla värden vars prioritet är mindre än P, O(1)

Uppgift 3 Två prioritetsköer: En för värden vars prioritet är mindre än P En för värden med högre prioritet

Uppgift 3 Några problem: Det är svårt att implementera en heap från grunden Använd standarddatastrukturer! Hashtabell istället för prioritetskö delete-small: Ej O(1)

Sökträd

Binära sökträd Binära träd med sökträdsegenskapen: Tomma binära träd är sökträd Ett icketomt binärt träd är ett sökträd om: Vänster och höger delträd är sökträd och alla element i vänstra delträdet < elementet i roten < alla element i högra delträdet

Binära sökträd Behöver kunna jämföra element, t ex med komparator Komparatorn antas (oftast?) implementera en total ordning

Komparator i Haskell Typklassen Ord innehåller compare: compare :: Ord a => a -> a -> Ordering data Ordering = LT EQ GT compare 2 3 = LT compare 2 2 = EQ compare 3 2 = GT

Binära sökträd Sökträd kan användas för att implementera utökad mängd-/avbildnings-adt: Konstruerare: Tom mängd/avbildning member(k)/lookup(k) insert(k)/insert(k,v) find-min() delete-min() delete(k) iterator(): Går igenom elementen i sorterad ordning

Binära sökträd Sökträd kan användas för att implementera utökad mängd-/avbildnings-adt: empty: Tom mängd/avbildning member k t/lookup k t insert k t/insert k v t delete-min t delete k t inorder t: En sorterad lista med alla element

Vilka träd är binära sökträd? A: 1 2 4 5 3 6 B: 7 3 1 6 8 9 C: 8 3 1 7 9 D: 8 6 3 1 7 9 9 E: 4 2 1 3 5 6 F: 7 1 5 8

Obalanserade binära sökträd En möjlig implementation: module BinarySearchTree (Tree, empty, member, insert, deletemin, delete, inorder) where data Tree a = Empty Node (Tree a) a (Tree a) empty :: Tree a empty = Empty

Obalanserade binära sökträd data Tree a = Empty Node (Tree a) a (Tree a) member :: Ord a => a -> Tree a -> Bool member x Empty = False member x (Node l y r) = case compare x y of LT -> member x l EQ -> True GT -> member x r

Obalanserade binära sökträd insert :: Ord a => a -> Tree a -> Tree a insert x Empty = Node Empty x Empty insert x (Node l y r) = case compare x y of LT -> Node (insert x l) y r EQ -> Node l x r -- Skriver över GT -> Node l y (insert x r) deletemin :: Tree a -> Maybe (a, Tree a) deletemin Empty = Nothing deletemin (Node l x r) = case deletemin l of Nothing -> Just (x, r) Just (min, l) -> Just (min, Node l x r)

Obalanserade binära sökträd Hur tar man bort ett element? Förslag: Hitta nod som ska tas bort (om någon) Lätt om noden inte har något högerbarn Annars: Ta bort högra delträdets minsta elementet, använd som nodens innehåll Alternativ: Lat borttagning

Obalanserade binära sökträd delete :: Ord a => a -> Tree a -> Tree a delete x Empty = Empty delete x (Node l y r) = case compare x y of LT -> Node (delete x l) y r GT -> Node l y (delete x r) EQ -> case deletemin r of Nothing -> l Just (min, r) -> Node l min r

Obalanserade binära sökträd inorder :: Tree a -> [a] inorder Empty = [] inorder (Node l x r) = inorder l ++ (x : inorder r)

Obalanserade binära sökträd inorder :: Tree a -> [a] inorder Empty = [] inorder (Node l x r) = inorder l ++ (x : inorder r) Tidskomplexitet för xs ++ ys: Θ( xs )

Vad är värstafallstidskomplexiteten för inorder t (om t innehåller n element)? Θ(1) Θ(log n) Θ(n) Θ(n log n) Θ(n 2 ) Θ(n 2 log n) Θ(n 3 )

Obalanserade binära sökträd Mer effektivt med ackumulator: inorder :: Tree a -> [a] inorder t = inorder' t [] where inorder' :: Tree a -> [a] -> [a] inorder' Empty xs = xs inorder' (Node l x r) xs = inorder' l (x : inorder' r xs)

Obalanserade binära sökträd Kanske mer idiomatiskt: inorder :: Tree a -> [a] inorder t = inorder' t [] where inorder' :: Tree a -> ([a] -> [a]) inorder' Empty = id inorder' (Node l x r) = inorder' l (x :) inorder' r

Obalanserade binära sökträd En möjlig implementation: public class BinarySearchTree <A extends Comparable<? super A>> { private class TreeNode { A contents; TreeNode left; // null om vänster barn saknas TreeNode right; // null om höger barn saknas } TreeNode(A contents) { thiscontents = contents; } private TreeNode root; // null om trädet är tomt

Obalanserade binära sökträd Iterativ kod: public boolean member(a a) { TreeNode here = root; while (here!= null) { int cmp = acompareto(herecontents); if (cmp < 0) { here = hereleft; } else if (cmp > 0) { here = hereright; } else return true; } } return false;

Obalanserade binära sökträd Rekursiv kod (varning för stack overflow): public void insert(a a) { root = insert(a, root); } private TreeNode insert(a a, TreeNode n) { if (n == null) return new TreeNode(a); } int cmp = acompareto(ncontents); if (cmp < 0) nleft = insert(a, nleft); else if (cmp > 0) nright = insert(a, nright); else ncontents = a; // Skriver över return n;

Obalanserade binära sökträd Värstafallstidskomplexitet: inorder: Θ(storlek) deletemin: Θ(höjd) member, insert, delete: Θ(höjd), givet att jämförelser tar konstant tid Höjd: Värsta fallet: Θ(storlek) Värsta fallet uppstår t ex om man sätter in elementen 1, 2, 3, 4, Kan vi se till att värstafallshöjden är Θ(log storlek)?

Balanserade sökträd

Balanserade sökträd Sökträd som är balanserade, med höjden Θ(log storlek): AVL-träd (Adelson-Velskii & Landis) Röd-svarta träd B + -träd

AVL-träd Invariant (för varje nod): Vänster och höger delträd har samma höjd, ±1 Operationer som ändrar trädets struktur använder (ibland) rotationer för att återställa invarianten

Vilka träd är AVL-träd? A: 4 2 1 3 6 5 B: 7 3 1 6 8 9 C: 8 3 1 7 9 D: 7 5 3 1 6 9 E: 4 2 1 3 5 6 F: 7 1 5 8

Insättning i AVL-träd Skiss av en algoritm: Sätt in noden som vanligt Gå tillbaka mot roten Vid första obalanserade noden: rotation Antingen enkel- eller dubbelrotation (se tavlan eller boken) Det räcker med en rotation för att göra trädet balanserat

Sammanfattning Idag: Starkt sammanhängande komponenter Sökträd Nästa gång: Mer om sökträd