Föreläsning 5: Kardinalitet. Funktioners tillväxt A = B om det finns en bijektion från A till B. Om A har samma kardinalitet som en delmängd av naturliga talen, N, så är A uppräknelig. Om A = N så är A uppräkneligt oändlig. Följande mängder är inte uppräkneliga (visar det senare) Reella talen i [0,1] P(N), potensmängden av N Obs: För oändliga mängder kan äkta delmängder ha samma kardinalitet. Detta kan inte inträffa för ändliga mängder. Om en mängd är uppräknelig finns det en listning av elementen i mängden. A B om det finns en injektion från A till B. A B och B A ger A = B. Detta medför: om det finns injektion A B och injektion B A så finns bijektion A B. Några uppräkneliga oändliga mängder E, de jämna icke-negativa heltalen: f(x) = 2x ger en bijektion från N till E (se föreläsning 4) Z x 0 1 2 3 4 5 6... f(x) 0 1 1 2 2 3 3... Z +, f(x) = x + 1 Z Z, vi ger ett bevis utan ord (med figur) De positiva rationella talen, Q +, är uppräkneliga Bevis: Z + är en delmängd av Q +, så Z + Q +. För omvändningen, Q + Z +, visa att de positiva rationella talen med upprepningar, Q R, är uppräknelig I så fall, dåq + är delmängd av Q R, följer att Q + Q R = N = Z + y x 1 2 3 4 5 6 7 1 2 3 4 5 1/1 2/1 3/1 4/1 5/1 6/1 7/1 1/2 2/2 3/2 4/2 5/2 6/2 7/2 1/3 2/3 3/3 4/3 5/3 6/3 7/3 1/4 2/4 3/4 4/4 5/4 6/4 7/4 1/5 1
Positionerna i listningen i figuren anger bilden av den bijektiva funktionen f : N Q R f(0) = 1/1, f(1) = 1/2, f(2) = 2/1, f(3) = 3/1, f(4) = 2/2, f(5) = 1/3,... Varje rationellt tal förekommer i listan minst en gång, och N = Q R. Följdresultat: Mängden av alla rationella tal, Q, är också uppräknelig och Mängden av strängar S (av ändlig längd) över ett ändligt alfabet A är uppräknelig För att visa detta antag att A är icke-tomt och att det finns en alfabetisk ordning av bokstäverna i A. Räkna upp strängarna i ordningen: tomma strängen λ, av längd 0 därefter alla strängar av längd 1, alfabetiskt därefter alla strängar av längd 2, etc. Detta ger en bijektion från N till listan av strängar och därmed är den uppräknelig. Exempel: A = {a,b,c} Dess alfabetiska ordning: {λ,a,b,c,aa,ab,ac,ba,...} = {f(0),f(1),f(2),...} Mängden av alla javaprogram är uppräknelig Låt S vara mängden av tillåtna tecken i ett javaprogram en javakompilator avgör om ett program är syntaktiskt korrekt använd den alfabetiska ordningen av S och mata in strängarna till kompilatorn om kompilatorn godkänner så adderar vi programmet till listan av syntaktiskt korrekta javaprogram fortsätt och testa nästa sträng, etc. På detta vis produceras en lista och en bijektion från N till mängden av javaprogram. Diagonalisering En viktig teknik (av Cantor) för att konstruera objekt som inte tillhör en uppräknelig mängd. De reella talen mellan 0 och 1 är inte uppräkneliga Motsatsbevis: Antag att de är uppräkneliga och påvisa en motsägelse. Om mängden är uppräknelig så kan den listas (dvs, det finns en bijektion från en delmängd av N). Vi visar att oberoende av hur listan produceras så kan vi konstruera ett reellt tal mellan 0 och 1 som inte finns med i listan. Därmed kan det inte finnas en sådan lista, och därför är mängden inte uppräknelig. Representera varje reellt tal i listan decimalt, t ex 1/3 = 0.333..., 1/2 = 0.500... Listan: 2
r 1 = 0.d 11 d 12 d 13 d 14... r 2 = 0.d 21 d 22 d 23 d 24... r 3 = 0.d 31 d 32 d 33 d 34... etc. Konstruera talet x = 0.x 1 x 2 x 3 x 4..., där x i = { 3 : om dii 3 4 : om d ii = 3 Därmed är x olikt varje tal i listan. Dvs, en lista med alla reella talen mellan 0 och 1 kan inte finnas. Dessa tal är inte uppräkneliga. Kan säga att R är mer oändlig än Q. Följdresultat: P(N) är inte uppräknelig Ty varje reellt tal mellan 0 och 1 kan representeras i binär form. I vart av talens N positioner finns två möjligheter, vilket stämmer med att P(N) = 2 N (föreläsning 3). Notera att vi använde diagonalisering i föreläsning 3 för att visa att stopp-problemet är oavgörbart. Funktioners tillväxt Algoritm: ändligt antal (precisa) instruktioner för att lösa ett problem Exempel: Hitta största elementet i en sekvens a 1,a 2,...,a n procedure max(a 1,a 2,...,a n ) max = a 1 for i from 2 to n if max < a i then max = a i Algoritmen max tar tid proportionell mot n Tidskomplexitet = antal operationer (storleksordningen) som krävs för att lösa problem av storlek n Vill jämföra komplexiteten hos olika algoritmer hur lång tid tar det för stora problem också dåliga (ineffektiva) algoritmer kan ibland användas för att lösa små problem ignorerar implementationsdetaljer som inkrementering av loopindex: kan alltid omvandla en loop till rak kod Vad innebär det att g växer minst lika snabbt som f? 3
Stort Ordo f och g är funktioner från N till R f = O(g) omm k c n[n > k f(n) c g(n) ] Välj k, välj sedan c (kan bero på valet av k); och bevisa implikationen. För enkelhets skull skippar vi absoluttecknen i fortsättningen. Exempel: 3n 2 + 5 = O(n 2 ) Välj k = 3 och c = 4. Då gäller för n > 3 att 4n 2 3n 2 + 9 3n 2 + 5 Obs: O(g) är en mängd, och kallas en komplexitetsklass. f = O(g) betyder egentligen f O(g) Egenskaper: f = O(g) omm O(f) O(g) Om f = O(g) och g = O(f) så O(f) = O(g) O(g) är sluten under addition: Om f = O(g) och h = O(g) så f + h = O(g) O(g) är sluten under multiplikation med reellt tal, a: Om f = O(g) så är a f = O(g) Om f = O(g) och g = O(h) så f = O(h) (transitivitet) Om f 1 = O(g 1 ) och f 2 = O(g 2 ) så f 1 + f 2 = O(g 1 + g 2 ) = O(max{g 1,g 2 }) och f 1 f 2 = O(g 1 g 2 ) Ty det finns k 1 och c 1 så f 1 (n) c 1 g 1 (n), n > k 1, och k 2 och c 2 så f 2 (n) c 2 g 2 (n), n > k 2. Välj c 3 = c 1 + c 2 och k 3 = max{k 1,k 2 }. Låt g(n) = max{g 1 (n),g 2 (n)}. Ger att f 1 (n) + f 2 (n) c 1 g 1 (n) + c 2 g 2 (n) c 1 g(n) + c 2 g(n) = (c 1 + c 2 )g(n) = c 3 g(n) = c 3 max{g 1 (n),g 2 (n)}, n > k 3. För f 1 f 2 = O(g 1 g 2 ), välj c 4 = c 1 c 2 och k 4 = max{k 1,k 2 }. Då gäller f 1 (n)f 2 (n) c 4 g 1 (n)g 2 (n), n > k 4. Några komplexitetsklasser O(1) O(log n) O(n) O(n log n) O(n 2 ) O(n j ) O(c n ) O(n!), där j > 2 och c > 1 Exempel: Bestäm komplexitetsklass för (n! + 3 n+2 + 3n 100 )(n n + n 2 n ) Förenkla uttrycket: hitta dominerande termer Stryk 3n 100 då n! växer mycket snabbare Stryk 3 n+2 då n! växer snabbare 4
Andra termen: vilken växer snabbast, n n eller n 2 n? Ta 2-logaritmen av båda. Då logaritmen är en växande funktion gäller jämförelsen mellan log också mellan ursprungliga funktionerna Jämför alltså n log n med log n + n: klart att n log n växer snabbare, så behålln n ovan Sammanfattat är komplexitetsklassen O(n! n n ) Om en flyttalsoperation (flop) tar en nanosekund, hur stort problem (i n) kan lösas för n!n n på: en minut? en dag? ett år? Vi vill ofta jämföra algoritmer i samma komplexitetsklass. Exempel: Antag algoritm 1 har komplexitet n 2 n + 1 algoritm 2 har komplexitet n 2 /2 + 5n + 2 Båda är O(n 2 ), men algoritm 2 har en mindre ledande koefficient, så den kommer att vara snabbare för stora problem. Kan uttrycka detta mer precist som att: algoritm 1 har komplexitet n 2 + O(n) algoritm 2 har komplexitet n 2 /2 + O(n) 5