TDDI16 Datastrukturer och algoritmer Övningsuppgifter hösten 2014 19 augusti 2014 Förord Detta är en samling av typiska problem rekommenderade för lektionerna i TDDI16 Datastrukturer och algoritmer Samlingen har utvecklats gradvis över många kursomgångar av liknande algoritmkurser givna vid IDA Många av problemen är gamla tentamensuppgifter Uppgifterna är indelade i sex delkapitel, svarande mot de sex lektioner som är schemalagda för TDDI16 kursomgången 2014/2015 Varje delkapitel indikerar prioriterade uppgifter att lösa i första hand, helst före eller under lektionen 1
Le 1 Komplexitet, Algoritmanalys Prioriterade uppgifter: 1, 5, 7, 8, 9, 11, 12 1 Bevisa eller motbevisa följande påståenden genom att använda definitionerna (a) (n + 1) 2 O(n 3 ) (b) (n 1) 3 O(n 2 ) (c) 2 n+1 O(2 n ) (d) 3 n 1 O(2 n ) (e) (n + 1) 2 Ω(n 3 ) (f) (n 1) 3 Ω(n 2 ) (g) 2 n+1 Ω(2 n ) (h) 3 n 1 Ω(2 n ) (i) (n + 1) 2 Θ(n 3 ) (j) (n 1) 3 Θ(n 2 ) (k) 2 n+1 Θ(2 n ) (l) 3 n 1 Θ(2 n ) 2 Betrakta följande funktioner där k 4 är en konstant och log är 2-logaritmen Ordna dem efter stigande tillväxttakt, dvs ge dem en plats i sekvensen f 1,,f 8 så att O(f i ) O(f i+1 ) för i = 1,7 Inkluderar mängden funktioner med likadan tillväxttakt? k n+1,n log k,nlog n,n k, n 3,k n,n k+1,k log n 3 Låt f(n) och g(n) vara funktioner sådana att f(n) 0, g(n) 0 för alla n Visa: (a) O(f(n) + g(n)) = O(max(f(n),g(n))) (b) f(n) g(n) O(f(n) g(n)) 4 Är det sant att om log f(n) O(log g(n)) så gäller f(n) O(g(n))? Motivera svaret 5 Bevisa att om f O(g) och g O(h) så gäller f O(h) Vilka värden på n 0 och c får f och h i termer av dem för f och g samt för g och h? 6 Visa att f Θ(g) om och endast om g Θ(f) (Alltså partitionerar Θ klassen av alla funktioner i ekvivalensklasser) 7 Algoritmerna A och B har värstafallskomplexitet O(n 2 ) respektive O(nlog n) På vissa indata har A kortare exekveringstid än B Ge tre möjliga förklaringar till att detta fenomen kan uppstå Är fenomenet fortfarande möjligt om värstafallskomplexiteterna är Θ(n 2 ) och Θ(nlog n)? 8 Ge motiverade svar på följande frågor: (a) Tidskomplexiteten i värsta fallet för en algoritm är Ω(n) Är det möjligt att algoritmen använder tid T(n) Ω(n 2 ) för något indata? (b) Tidskomplexiteten i värsta fallet för en algoritm är Ω(n) Är det möjligt att algoritmen använder tid T(n) Ω(n 2 ) för alla indata? (c) Det bästa indatat gör att algoritmen använder Θ(n) tid Är det möjligt att algoritmen använder tid T(n) Ω(n 2 ) för något indata? 2
(d) Det bästa indatat gör att algoritmen använder Θ(n) tid Är det möjligt att algoritmen använder tid T(n) Ω(n 2 ) för alla indata? 9 Analysera tidskomplexiteten för följande algoritmer: (a) procedure Mystery(integer n): for i from 1 to n 1 do for j from i + 1 to n do for k from 1 to j do en instruktion som exekveras i tid O(1) (b) (c) (d) procedure VeryOdd(integer n): for i from 1 to n do if i is odd then for j from i to n do x x + 1 for j from 1 to i do y y + 1 procedure Complicated(integer n): for i from 1 to n do for j from n 1 downto 3 do for k from 1 to 5 do anrop till en procedur som exekverar i tid O(log n) procedure PrintStars(integer n): a 1 for i from 1 to n do a a i for j from 1 to a do print * new line 10 Betrakta följande procedur: procedure foo(integer n): for i from 1 to 4 do x i Vilka av följande påståenden stämmer för procedurens exekveringstid T(n): T(n) O(0), T(n) O(7), T(n) O(n), T(n) Ω(7)? Motivera svaren 11 Analysera värstafallskomplexiteten för tid och minne hos följande algoritm, där indata består av ett heltal i och en sorterad tabell av heltal av längd n function (integer i, table A[1n]): boolean first 1 last n f ound false while f irst last and not f ound do index (first + last)/2 if i = A[index] then f ound true elsif i < A[index] then last index 1 else first index + 1 return found 3
12 Skriv en rekursiv ekvation som karakteriserar tidskomplexiteten hos följande program: function Factorial(integer n): integer if n = 0 then return 1 else return n Factorial(n 1) 13 Analysera tids- och minneskomplexitet för följande funktion (som antar att n > 1): procedure PrintC(integer n): array A[1n] for i from 1 to n do A[i] 0 loop1: i 1 for j from 1 to n do print A[j] loop2: A[i] A[i] + 1 if A[i] = 2 then A[i] 0 i i + 1 else exit loop2 if i = n then exit loop1 4
Le 2 Linjära strukturer, Träd, Binära sökträd Proriterade uppgifter: 1, 2, 4, 6, 9, 10 1 Sekvensen X Y U V W läses en gång, tecken för tecken från vänster till höger Varje tecken som lästs kan först placeras i temporärt minne eller skickas direkt till utskrift Läsoperationerna kan blandas med operationer som tar bort tecken från minnet och skickar dem till utskrift På det här sättet får vi på utskriften en permutation av indatasekvensen Betrakta permutationerna X U W V Y och Y U W X V Kontrollera, för var och en av dem, om permutationen går att få till om det temporära minnet är: (a) en stack (b) en kö Om svaret är ja visa sekvensen av operationer för att få till permutationen Om svaret är nej förklara varför ingen sekvens av operationer kan generera den önskade permutationen 2 (a) Förklara hur man kan implementera två stackar i en vektor T[0n] på så sätt att ingen stack får overflow så länge inte båda stackarna sammanlagt innehåller n + 1 element Stackoperationerna ska köra i O(1) tid (b) En kö Q är implementerad med en ringbuffer med 3 element Visa tillståndet i buffern efter exekveringen av följande operationer Enqueue(Q, a), Enqueue(Q, b), Enqueue(Q, c), Dequeue(Q), Dequeue(Q), Enqueue(Q, d) 3 En sträng är ett palindrom om den blir samma sträng baklänges (tex strängen naturrutan Konstruera en algoritm som använder en stack för att kontrollera om en sekvens av n inlästa symboler utgör ett palindrom eller ej Vad är körtiden för din algoritm? 4 Beskriv hur man kan implementera ADT queue med hjälp av två stackar (a) Förklara idén (b) Beskriv den med pseudokod (c) Antag att du sätter in och tar ut n element i kön Sammantaget gör vi alltså n anrop till enqueue och n anrop till dequeue Ordeningen på dessa operationer är sådan att kön barablir tom efter den sista dequeue-operationen Vad är den värsta exekveringstiden för en enskild enqueue-operation ocn en enstaka dequeueoperation? (d) Vad är den amorterade tiden för samtliga operationer? 5 En dubbeländad kö double-ended queue (deque) är en sekvens som kan modiferas genom att lägga till och ta bort element i både fram- och bakänden av sekvensen Vi har med andra ord följande fyra abstrakta operationer: addfront(e,d) lägger till elementet E först i deque D, deletefront(d) returnerar första elementet i deque D och tar bort det från D addend(e,d) lägger till elementet E sist i deque D, deleteend(d) returnerar sista elementer i deque D och tar bort det från D Förklara hur en dequeue kan representeras i sammanhängande minne så att var och en av de fyra operationerna endast använder konstant tid 5
6 Betrakta följande binära träd a b b c c c c Vilka av de fyra vanliga typerna av binära trädtraverseringsordningar besöker noderna i alfabetisk ordning med avseende på nyckelvärden? 7 Betrakta följande trädtraverseringsalgoritm, där argumentet n refererar till trädets rot procedure TraverseTree(n: treenode); var S: ADT Stack MakeEmptyStack(S) Push(n) while not IsEmptyStack(S) do n Pop(S) Print label of n foreach child c of n in reverse order do Push(c) (a) Vilken traverseringordning implementeras av algoritmen? (b) Transformera algoritmen så att den använder ADT queue istället för ADT stack Vilken traverseringsordning implementeras av den tranformerade algoritmen? 8 Visa vilka av följande binära träd som är (a) fulla (b) fullständiga (c) perfekta a b c d e f g h 9 Betrakta sekvensen av nycklar som fås vid traversering av ett binärt sökträd Visa om det är möjligt eller ej att rekonstruera trädet givet att traverseringen gjordes: (a) preorder (b) postorder (c) inorder (d) levelorder 6
10 Visa arrayrepresentationen av följande binära träd 0 1 2 b a i 3 4 5 c f j k d e g h 7
Le 3 AVL-träd, (a, b)-träd Prioriterade uppgifter: 1, 2, 3 1 Betrakta följande binära träd 15 6 21 5 10 18 25 (a) Motivera att det är ett binärt sökträd (b) Visa träden: T 1 = Insert(12,T), T 2 = Insert(7,T 1 ), T 3 = Insert(9,T 2 ), T 4 = Delete(15,T 3 ) (c) Kan T 4 även ses som ett AVL-träd? 2 (a) Vilka av följande är AVL-träd? Motivera ditt svar 28 21 T1 21 32 T2 14 24 14 24 31 7 18 7 18 24 24 T3 21 T4 21 32 14 14 31 7 18 7 18 (b) Betrakta följande AVL-träd: 42 17 68 40 50 75 48 62 Visa steg för steg hur operationerna Insert(41), Insert(54), Delete(68) utförs på trädet ovan (alla operationera utförs på samma träd) Vilka rotationer utförs? 8
3 Vilka av följande trädstrukturer kan uppträda i korrekta AVL-träd? E F A B C D 4 Är det sant att alla AVL-träd med höjd h har färre noder än ett AVL-träd med höjd h + 1? Bevisa eller motbevisa 9
Le 4 Hashning Prioriterade uppgifter: 1, 2 1 Vi använder en array med indexen 0 till 6 för att implementera en hashtabell av storlek 7 Nycklarna till de insatta elementen är heltal Hashvärdet beräknas som nyckelvärdet modulo tabellängden Visa innehållet i den initialt tomma arrayen efter att följande operationer har utförts Insert(15, c), Insert(8, a), Insert(14, b), Delete(15), Insert(32, d), Insert(4, e), Insert(7, f) när följande teknik används: (a) samlad länkning, (b) öppen adressering med linjär sondering, (c) öppen adressering med dubbel hashning, där h 2 (k) = 5 k mod 5 Borttagning ska hanteras med deleted bit-tekniken 2 Betänk hashning baserad på öppen adressering med linjär sondering Vilka nackdelar finns det med att använda deleted bit-tekniken istället för att utföra borttagning baserat på omhashning av sonderingssekvensen? 3 Polisen planerar att implementera ett register över stulna bilar i form av en hashtabell med bilens registreringsnummer som nyckel Varje registreringsnummer innehåller tre bokstäver följt av tre siffor Antag att alla kombinationer uppträder med likformig sannolikhet Värdet av hashfunktionen bestäms av två tecken i registreringsnumret Vilka av följande alternativ ger en hashfunktion med bäst fördelning av värden över den interna tabellen? (a) De två sista bokstäverna, (b) De två sista siffrorna, (c) Den sista bokstaven och den sista siffran 10
Le 5 Prioritetskö, Heap, Union/Find Prioriterade uppgifter: 1, 4 1 Betrakta följande två arrayer av heltal A : 1 2 1 2 2 1 1 2 2 2 2 1 1 B : 1 2 3 4 5 6 7 8 9 10 11 12 13 Kan någon/några av dessa vara en heap i arrayrepresentation? 2 Utöka begreppet fullständigt träd (complete tree) till trinära träd, där varje nod has som mest tre barn Definiera en arrayrepresentation av sådana träd coh visa hur man kan komma åt barnen till en nod i tid O(1) 3 Betrakta den vanliga heap-baserade implementationen av ADT priority queue med en DeleteM in-operation I den implementation finns det inget effektivt sätt att komma åt och ta bort det största elementet i kön Konstruera en algoritm som transformerar heapen i en prioritetskö så att ett maximalt element kan kommas och tas bort på ett effektivt sätt Analysera tids- och minneskomplexiteten hos din algoritm 4 Betrakta följande disjunkta mängder respresenterade med up-träd enligt kursbokens kapitel 8: A B C 4 8 3 10 5 9 1 6 7 2 11 12 Visa hur träden ändras av följande sekvens av operationer: Find(2); Merge(A,C); Find(4); Find(11) Använd union-by-size för unionoperationerna och path compression i findoperationerna 11
Le 6 Sortering Prioriterade uppgifter: 1, 2, 5, 7, 9, 11, 12 1 För föjande sekvens av heltal: [7,4,12,2,5] illustrera hur följande algoritmer opererar på sekvensen: (a) Insertion Sort (b) Heap Sort (c) In-place Quick Sort 2 Följande vektor skickas som indata till en sorteringsalgoritm: 8 7 6 5 4 3 2 1 Vid något tillfälle under sortering ser vektorn ut så här: 1 2 6 5 4 3 7 8 Kan algoritmen vara Insertion Sort, Selection Sort eller Heap Sort? 3 En array av poster indexerade med 1 till n innehåller information om studenter Varje post inkluderar, bland annat, studentens namn och information om huruvida studenten tagit DALG-tentan eller ej Konstruera en in-placealgoritm med körtid O(n), som placerar alla studenter som tagit DALG-tentan före de studenter som inte tagit DALGtentan 4 (a) Illustrera hur Radix Sort opererar på följande vektor av nycklar, där bokstäverna i nycklarna utgör delnycklarna för sortering: [abd, cad, bbc, aba, ccc, dab] Du behöver bara visa vektorn efter varje pass av delnyckelsortering (b) Motivera varför Bucket Sort är mindre lämpligt när nyckelrymden är stor (som i exemplet ovan) (c) Är Radix Sort stabil? Motivera eller ge ett motexempel 5 Betrakta följande sorteringsalgorithm, kallad Bubblesort: procedure Bubblesort(A[0n-1]) for i from 0 to n-2 do for j from n-1 downto i+1 do if A[j] < A[j-1] then A[j] A[j-1] Är den stabil? Vad har den för tidskomplxitet i värsta fallet? 6 (a) Vilket indata är sämst för Insertion Sort? (b) Vi vill sortera en enkellänkad lista Varför bör inte Quick Sort vara vårt första val av sorteringsalgoritm? (c) Alla jämförelsebaserade sortingsalgoritmer behöver tid Ω(n log n) i värsta fallet Vad kan vi säga om körtiden i bästa fallet för sådana algoritmer? Motivera ditt svar 7 (a) Faserna i Radix Sort består i att sortera konsekutiva fragment av nycklarna, med början vid de minst signifikanta fragmenten Vad kan vara en nackdel med att börja med de mest signifikanta fragmenten? 12
(b) Vilket krav bör uppfyllas av Bucket Sort för att kunna användas i faserna i Radix Sort med början i de minst signifikanta fragmenten? Diskutera hur man kan implementera Radix Sort baserat på en variant av Bucket Sort som inte uppfyller kravet 8 Vi vill sortera n strängar med maximal längd m och medellängd m tecken (medelvärdet togs över alla möjliga strängar inte över en särskild indatamängd) (a) Visa värstafallskomplexiteten för Quick Sort och Radix Sort Är körtiden för en av algoritmerna bättre än den andra för alla värstafallsdata? (b) Upprepa analysen för tidskomplexiteten i medelfallet 9 Quick Sort är inte effektiv för små indata Därför kombineras ofta algoritmen med andra sorteringsalgoritmer Betrakta till exempel följande varianter av Quick Sort: A Vi låter Quick Sort ignorera alla delsekvenser av storlek k, för någon parameter k > 0, dvs sådana delsekvenser lämnas osorterade När algoritmen terminerar är sekvensen nästan sorterad och lämnas över till Insertion Sort för slutsortering B När Quick Sort anropas för en delsekvens av storlek k anropas Insertion Sort istället på den delsekvensen Alltså begränsas de rekursiva anropen till Quick Sort till delsekvenser av storlek större än k För de olika varianterna ovan, hitta ett uttryck som beskriver hur mycket tid Insertion Sort totalt använder, som en funktion av k och storleken n av den sorterade sekvensen Ändras dessa uttryck om vi ersätter Insertion Sort med Selection Sort? 10 Du ingår in en grupp som ska skriva ett nytt program för att producera telefonkataloger För varje katalog får du abonnenterna sorterade efter telefonnummer och måste alltså sortera om dessa till alfabetisk ordning Gör en jämförande diskussion och analys av lämpligheten för Quick Sort respektive Radix Sort för denna uppgift utgående från komplexitetsbegreppet Du får antaga att primärminnet är tillräckligt stort för att rymma alla data Gör rimliga antaganden samt redogör för dessa 11 Diskutera för följande algoritmer vad som är bäst och sämst indata och illustrera dem med exempel för n = 5: Insertion Sort Quick Sort Quick Select 12 Förklara om följande påståenden är sanna eller falska Körtiden i bästa fallet för Insertion Sort är O(n) Körtiden i värsta fallet för Quick Sort är O(n 3 ) Körtiden i värsta fallet för Quick Select är O(n) 13