n (log n) Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad.



Relevanta dokument
Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Föreläsning 1. Introduktion och sökning i graf. Vad är en algoritm?

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

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

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

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

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Sökning och sortering

Föreläsning 1. Introduktion. Vad är en algoritm?

Föreläsning 9: Talteori

Föreläsningsanteckningar F6

Föreläsning 9: Talteori

Programkonstruktion och Datastrukturer

Övningsmästarprov 2 + några NP-reduktioner. Algoritmer, datastrukturer och komplexitet

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Några svar till TDDC70/91 Datastrukturer och algoritmer

Asymptotisk komplexitetsanalys

Algoritmer, datastrukturer och komplexitet

I en matchning ligger varje hörn i högst en kant. I en stig ligger varje hörn i högst två kanter.

Algoritmer, datastrukturer och komplexitet

i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

Föreläsning 5: Grafer Del 1

Föreläsning 5 Innehåll

Pseudokod Analys av algoritmer Rekursiva algoritmer

Läsanvisning till Discrete matematics av Norman Biggs - 5B1118 Diskret matematik

Algoritmer, datastrukturer och komplexitet

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

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

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Föreläsning 5: Dynamisk programmering

Föreläsning 12+13: Approximationsalgoritmer

Föreläsning 9: NP-fullständighet

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Hela tal LCB 1999/2000

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

DOP-matematik Copyright Tord Persson Potenser. Matematik 1A. Uppgift nr 10 Multiplicera

Dekomposition och dynamisk programmering

Föreläsning 5. Rekursion

PASS 2. POTENSRÄKNING. 2.1 Definition av en potens

Grafer MST Top. sortering Starkt samm. komponenter Kortaste avstånd. Grafalgoritmer 1. Douglas Wikström KTH Stockholm

Lösningsförslag till tentamen Datastrukturer, DAT037,

Lars-Daniel Öhman Lördag 2 maj 2015 Skrivtid: 9:00 15:00 Hjälpmedel: Miniräknare, lock till miniräknare

Lösningsförslag till Tentamen i 5B1118 Diskret matematik 5p 22 augusti, 2001

a = a a a a a a ± ± ± ±500

Föreläsning 8: Aritmetik och stora heltal

Föreläsning Datastrukturer (DAT036)

Övning log, algebra, potenser med mera

Datastrukturer och algoritmer

Tentamen Datastrukturer (DAT036)

4 Fler deriveringsregler

DOP-matematik Copyright Tord Persson. Potensform. Uppgift nr 10. Uppgift nr 11 Visa varför kan skrivas = 4 7

Föreläsning 5: Kardinalitet. Funktioners tillväxt

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Algoritmer, datastrukturer och komplexitet

Föreläsning 4 Datastrukturer (DAT037)

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

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

Lösning av några vanliga rekurrensekvationer

Datorsystemteknik DVG A03 Föreläsning 3

Lösning till tentamensskrivning i Diskret Matematik för CINTE, CL2 och Media 1, SF1610 och 5B1118, onsdagen den 17 augusti 2011, kl

Föreläsning 5. Rekursion

Tommy Färnqvist, IDA, Linköpings universitet

DOP-matematik Copyright Tord Persson. Logövningar. Slumpad ordning. Uppgift nr 10 Lös ekvationen 10 y = 0,001. Uppgift nr 13 Lös ekvationen lg x = 4

Material till kursen SF1679, Diskret matematik: Lite om kedjebråk. 0. Inledning

Algebra, exponentialekvationer och logaritmer

Föreläsning 2 Datastrukturer (DAT037)

Algoritmer, datastrukturer och komplexitet

Föreläsning 3: Dekomposition. Dekomposition

Föreläsning Datastrukturer (DAT037)

Magnus Nielsen, IDA, Linköpings universitet

F2 Binära tal EDA070 Datorer och datoranvändning

Föreläsning 2: Grafer. Exempel på graf

Algoritmer, datastrukturer och komplexitet

Lösningsförslag till Tentamen i 5B1118 Diskret matematik 5p 14 augusti, 2002

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Block 1 - Mängder och tal

Föreläsning 13 Datastrukturer (DAT037)

Prov 1 2. Ellips 12 Numeriska och algebraiska metoder lösningar till övningsproven uppdaterad a) i) Nollställen för polynomet 2x 2 3x 1:

Läsanvisning till Discrete matematics av Norman Biggs - 5B1118 Diskret matematik

Ma C - Tek Exponentialekvationer, potensekvationer, logaritmlagar. Uppgift nr 10 Skriv lg4 + lg8 som en logaritm

Algoritmer, datastrukturer och komplexitet

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Begrepp :: Determinanten

Beräkningsvetenskap föreläsning 2

Föreläsning 6 Datastrukturer (DAT037)

Delbarhet och primtal

Blandade uppgifter om tal

Föreläsning 7+8: NP-problem. Begreppet effektiv algoritm är alltså synonymt med går i polynomisk tid i den här kursen. Är detta en rimlig uppdelning?

Övningshäfte 2: Induktion och rekursion

Dynamisk programmering

Lösningar för tenta i TMV200 Diskret matematik kl. 14:00 18: Svar: Ja, det gäller, vilket kan visas på flera sätt (se nedan).

Transkript:

Algoritmer och Komplexitet ht 08. Övning 1 Algoritmanalys Ordo Jämför följande par av funktioner med avseende på hur dom växer då n växer. Tala i varje fall om ifall f(n) Θ(g(n)), f(n) O(g(n)) eller f(n) Ω(g(n)). f(n) g(n) a) 100n +logn n+(logn) 2 b) 2 c) n 2 n() 2 d) () n e) n () 5 f) n2 n n g) 2 n Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad. Euklides algoritm Analysera Euklides algoritm som hittar största gemensamma delaren mellan två heltal. Analysera både med avseende på enhetskostnad och bitkostnad. Euklides algoritm lyder på följande sätt, där vi förutsätter att a b. gcd(a, b)= if b a then gcd b else gcd gcd(b, a mod b) Potenser med upprepad kvadrering Följande algoritm beräknar tvåpotenser när exponenten själv är en tvåpotens. Indata: m =2 n Utdata: 2 m power(m) = pow 2 for i 1 to log m do pow pow pow return pow 1

Analysera denna algoritm både med avseende på enhetskostnad och bitkostnad. Kantmatrisprodukt På föreläsningen beskrevs hur en riktad graf G = V,E representeras som en kantmatris B (eng. incidence matrix) av storlek V E. Beskriv vad elementen i matrisen BB T representerar (där B T är B transponerad). Bipartithet Beskriv och analysera en algoritm som avgör om en graf är bipartit. Tidskomplexiteten för algoritmen ska vara linjär i antalet kanter och antalet hörn i grafen. Eulercykel Givet en oriktad sammanhängande graf G = V,E där alla hörn har jämnt gradtal. Hitta en Eulercykel, dvs en sluten stig som passerar varje kant i E exakt en gång. Algoritmen ska gå i linjär tid. Lösningar Lösning till Ordo a) Vi beräknar gränsvärdet för kvoten mellan funktionerna. f(n) lim n g(n) = lim 100n +logn n n +(logn) 2 = lim 100 + ()/n n 1+(logn) 2 /n = 100. Eftersom gränsvärdet är en konstant drar vi slutsatsen att f(n) Θ(g(n)). b) Vi noterar att 2 =2logn, så Θ( 2 ). c) g(n) n()2 = f(n) n 2 / = () n 0 då n. Därför är g(n) O(f(n)) och f(n) Ω(g(n)). d) Substituera m =logn och jämför sedan f 2 (m) =m m och g 2 (m) =2 m /m: g 2 (m) f 2 (m) = 2m m m m = 1 ( ) m 2 0 m m då n.därförärf(n) Ω(g(n)) och g(n) O(f(n)). e) Polynomiska funktioner vinner alltid över polylogaritmiska. Därför är f(n) Ω(g(n)) och g(n) O(f(n)). Om man vill ha ett mer formellt bevis kan man använda lemmat som säger att för alla konstanter c>0, a>1 och alla monotont växande funktioner h(n) är (h(n)) c O(a h(n) ). Om vi väljer h(n) =logn, c =5och a = 2 så får vi () 5 O( 2 )=O( n) eftersom ( 2 1/2) ( ) = 2 1/2 = n 1/2. 2

f) f(n) g(n) = n2n = n ( ) 2 n. n En exponentialfunktion som (2/) n vinner alltid över en polynomisk funktion (som n), men låt oss bevisa det med l Hôpitals regel. Formulera först om uttrycket: n ( 2 n ( ) = n/ 2 n. ( ) Inför beteckningar för nämnare och täljare, r(n) =n och s(n) = 2 n, ) och derivera. r (n) =1, s (n) = ( 2 ) 2n ( ) n 2 ln ( ) = ln(/2) ( 2 2 n ) Vi kan använda l Hôpital eftersom r(n), s(n) och s (n) 0. ( f(n) lim n g(n) = lim r(n) n s(n) = lim r (n) 2 n ) n s (n) = ln ( ) 0 2 och vi har visat att f(n) O(g(n)). g) n Ω(2 ). Notera bara att n =2 1 2 och att lim n 2 1 2 =0.

Lösning till Division Så här ser skolboksmetoden ut när 721 delas med 64: 0 1 1 6 4 7 2 1 0 7 2 6 4 8 1 6 4 1 7 Algoritmen börjar med att kolla hur många gånger 64 går i 7, den mest signifikanta siffran i 721. Eftersom 64 > 7 är det 0 gånger. Vi har 0 64 = 0 så vi subtraherar 0 från 7 och får 7. Vi multiplicerar 7 med 10 (basen), flyttar ner nästa siffra i 721, nämligen 2, och fortsätter att dividera 72 med 64 för att få nästa siffra i kvoten. Vi fortsätter på detta sätt, subtraherar antalet gånger 64 går i varje tvåsiffrigt tal, flyttar ner nästa siffra och slutar när alla heltalssiffror i kvoten har beräknats. Talet 17 längst ner är divisionens rest. Vi kan formulera detta i följande algoritm där vi beräknar q = b/a där a, b är n-bitstal (a = a n 1 a n 2 a 0, b = b n 1 b n 2 b 0 )ibasenb. Låtx y vara x vänsterskiftat y steg. För att det ska vara lättare att bevisa att algoritmen är korrekt har ingångsvillkor, utgångsvillkor och invarianter satts ut. Div(a, b, n) = PRE= a>0,b 0, a och b lagras med n bitar. POST= qa + r = b, 0 r<a r 0 for i n 1 to 0 do INV= (q n 1...q i+1 ) a + r =(b n 1...b i+1 ), 0 r<a r (r 1) + b i / Move next digit down / q 0 a 0 while a + a r do / Find max q s.t. q a r / INV= r a<a = q a r a a + a q q +1 q i q r r a return q, r / Quotient and remainder / Vad är tidskomplexiteten? For-slingan går n varv. I varje varv har vi ett konstant antal tilldelningar, jämförelser, additioner och subtraktioner samt en while-slinga som går högst B varv (eftersom B är basen och talet B a r). Eftersom basen kan anses vara en konstant så innehåller varje varv i for-slingan ett konstant antal operationer. Och eftersom all aritmetik görs med n-bitstal så tar varje jämförelse, addition och subtraktion tiden O(n). Totalt får vi n c O(n) =O(n 2 ). 4

Lösning till Euklides algoritm Eftersom algoritmen är rekursiv är det inte uppenbart att den alltid tar slut (terminerar), så vi börjar med att bevisa det. I termineringsbevis använder man oftast en potentialvariabel som har en undre gräns (till exempel noll) och vid varje anrop minskar med ett heltalssteg. I denna algoritm kan vi använda a som potentialvariabel. Eftersom a alltid är minst lika stor som b och algoritmen terminerar så fort a = b eller b =1så har vi en undre gräns för a och vi kan se att a minskar i varje anrop. Antalet anrop beror tydligen på parametrarnas storlek, så låt oss beräkna hur den största parametern, a, minskar. Låt a i vara as värde i anrop nummer i i algoritmen. Lemma 1 a i+2 a i /2. Bevis. Vi vet att a i+2 = b i+1 och b i+1 = a i mod b i, varför a i+2 = a i mod b i.antanuatt a i+2 >a i /2. Detta innebär att b i a i /2, vilket ger en motsägelse, eftersom a i = a i+2 + cb i > a i /2+a i /2=a i. Med hjälp av lemmat kan vi visa att log a i+2 log a i = log a i log 2 = log a i 1. 2 Det betyder att i vartannat anrop av funktionen minskas parametrarnas storlek med (minst) en bit. Därför kan antalet anrop vara högst 2 log a. I varje rekursivt anrop görs bara en modulooperation och med enhetskostnad tar det konstant tid. Därmed har vi kommit fram till att tidskomplexiteten är 2 log a =2n O(n). När vi analyserar algoritmen med avseende på bitkostnad måste vi vara noggrannare. En division mellan två n-bits heltal tar (som vi har sett) O(n 2 ), och modulooperationen tar därför O(n 2 ). Så om vi gör O(n) anrop och varje anrop tar O(n 2 ) så blir den totala bitkomplexiteten O(n ). Lösning till Potenser med upprepad kvadrering Slingan går log m = n varv. Varje varv tar konstant tid med enhetskostnad. Komplexiteten blir därför O(n). Om vi använder bitkomplexitet måste vi undersöka vad varje multiplikation i slingan kostar. Vi antar att kostnaden för att multiplicera ett l-bitstal med sig själv är O(l 2 ) (vilket är en överdrift det finns snabbare sätt). I varv i var variabeln pow = pow i värdet 2 2i så varje multiplikation kostar O((log pow i ) 2 )=O((log 2 2i ) 2 )=O(2 2i ).Omvisummeraröverallavarvfårvi log m i=1 log m c2 2i = c i=1 log m 1 4 i =4c i=0 4 i =4c 4log m 1 4 1 O(4 log m )=O(4 n ). Algoritmen har alltså linjär komplexitet med avseende på enhetskostnad men exponentiell komplexitet med avseende på bitkostnad! Lösning till Kantmatrisprodukt Diagonalelementet (i, i) anger hur många kanter som har sin ändpunkt i hörn i. Ickediagonalelementet (i, j) är det negerade antalet kanter som går mellan hörnen i och j. Lösning till Bipartithet Använd djupetförstsökning men färga hörnen alternerande med rött och grönt. Om en kant mellan två hörn av samma färg upptäcks är grafen inte bipartit. Lösning till Eulercykel Idén är att börja i ett hörn v och söka sig igenom grafen tills v nås igen. Sökstigen P kommer då 5

antingen att ha besökt alla kanter eller så återstår det, om vi tar bort P, en eller flera sammanhängande komponenter G 1,G 2,...,G n. I det senare fallet kan vi göra om samma sorts sökning för varje komponent så vi får en Eulercykel för varje G i, och sedan sätter vi in alla dessa Eulercykler i P så att vi får en total Eulercykel. För att kunna genomföra detta i linjär tid så hittar vi på en algoritm som använder två spelare P 1 och P 2 som tillsammans går igenom grafen. Båda spelarna startar i v. SpelareP 1 skapar stigen P genom att gå längs kanter hur som helst. Han märker varje kant han passerar och stannar när han kommer tillbaka till v igen. Sedan följer P 2 efter längs P, men varje gång han kommer till ett nytt hörn u så kollar han om alla kanter från u är märkta. I så fall fortsätter han längs P.Om det finns omärkta kanter (det finns alltid ett jämnt antal) så skickar han ut P 1 för att hitta en nystig som börjar och slutar i u. P 2 går sedan denna nya stig innan han fortsätter från u. Efter att ha upprepat detta kommer P 2 till slut att ha gått längs varje kant exakt en gång och därför skapat en Eulercykel. P 1 har inte heller gått längs samma kant mer än en gång så totala körtiden blir linjär. I algoritmen nedan kallas P 1 för PathFinder och P 2 för Straggler. EulerCycle(G) = cycle {1} choose edge (1,t) mark (1,t) path PathFinder(G, 1,t) Straggler(path) return cycle PathFinder(G, start, cur) = append(cur, path) while cur start do choose unmarked edge (cur, v) mark (cur, v) append(v,path) cur v return path Straggler(path)= while path do u next(path) append(u, cycle) for all edges (u, v) do if unmarked (u, v) then mark (u, v) p PathFinder(G, u, v) Straggler(p) 6