philip bille - wordpress.com · 2014. 2. 6. · • algoritmer og datastrukturer • toppunkter •...
TRANSCRIPT
Introduktion
Philip Bille
Plan
• Algoritmer og datastrukturer
• Toppunkter
• Algoritme 1
• Algoritme 2
• Algoritme 3
Algoritmer og datastrukturer
• Hvad er det?
• Algoritmisk problem: præcist defineret relation mellem input og output.
• Algoritme: metode til at løse et algoritmisk problem.
• Beskrevet i diskrete og entydige skridt.
• Matematisk abstraktion af program.
• Datastruktur: Metode til at organise data så det kan søges i eller manipuleres.
Eks: Max i tabel
• Maxproblemet: givet en tabel A[1..n] find et tal i, således at A[i] er maksimal.
• Input: tabel A[1..n].
• Output: et tal i, 1 ≤ i ≤ n, så A[i] ≥ A[j] for alle indgange j ≠ i.
• Algoritme til maxproblemet:
• Gennemløb A og vedligehold nuværende maximale indgang. Returner den til slut.
1 3 7 15 17 11 2 3 6 8 7 5 9 5 231 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Beskrivelse af algoritmer
• Naturligt sprog.
• Program.
• Pseudokode.
def findMax(A): max = 0 for i in range(len(A)): if A[i] > A[max]: max = i return max
public static int findMax(int[] A) { int max = 0; for(i=0; i< n; i++) if (A[i] > A[max]) max = i; return max;}
int findMax(int* A, n) { int max = 0; for(i=0; i< n; i++) if (A[i] > A[max]) max = i; return max; }
fun findMax [] = raise Empty | findMax [x] = x | findMax (x::xs) = max(x, findMax xs)
Pseudokode
• Som (imperativt) programmeringssprog men uden sprogspecifikke ting.
• Nemt at implementere og analysere.
FindMax(A, n) max = 0 for i = 1 to n if (A[i] > A[max]) then max = i return max
Beskrivelse af algoritmer
• Naturligt sprog, pseudokode eller program?
Toppunkter
Toppunkter
• Lad A[1..n] være en tabel.
• En indgang A[i] er et toppunkt hvis det ikke er mindre end dets naboer:
A[i-1] ≤ A[i] ≥ A[i+1]
• A[1] toppunkt hvis A[1] ≥ A[2] og A[n] er toppunkt hvis A[n-1] ≤ A[n]. (Tænk A[0] = A[n+1] = -∞)
1 3 7 15 17 11 2 3 6 8 7 5 9 5 231 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Toppunkter
• Toppunktsproblemet: Givet en tabel A[1..n] find et tal i, således at A[i] toppunkt.
• Som input/output relation:
• Input: En tabel A[1..n].
• Output: Et tal i, 1 ≤ i ≤ n, så A[i] er et toppunkt.
1 3 7 15 17 11 2 3 6 8 7 5 9 5 231 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Algoritme 1
• For hver indgang i A, check om den er et toppunkt. Returner det første toppunkt.
1 3 7 15 17 11 2 3 6 8 7 5 9 5 231 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Pseudokode
Toppunkt1(A, n) if A[1] ≥ A[2] return 1 for i = 2 to n-1 if A[i-1] ≤ A[i] ≥ A[i+1] return i if A[n-1] ≤ A[n] return n
Teoretisk analyse
• T(n) = antallet af skridt som en algoritmen udfører på et input af størrelse n.
• Skridt = Læsning/skrivning til hukommelse (x := y, A[i], i++, ...), aritmetiske/boolske operationer (+,-,*,/,%,&&,||, &, |, ^,~), sammenligninger (<,>, ≤, ≥, =, ≠) og program-flow (if-then-else, while, for, goto, funktionskald, ..)
• T(n) kaldes tidskompleksiten eller køretiden af algoritmen.
• Interesseret (næsten altid) i værstefaldstidskompleksitet = maksimal køretid over alle input af størrelse n.
Køretid
Toppunkt1(A, n) if A[1] ≥ A[2] return 1 for i = 2 to n-1 if A[i-1] ≤ A[i] ≥ A[i+1] return i if A[n-1] ≤ A[n] return n
• T(n) er lineær funktion af n: T(n) = an + b, for passende konstanter a,b>0
• I asymptotisk notation:
• T(n) = Θ(n)
c1
(n-2)·c2c3
T(n) = c1 + (n-2)·c2 + c3
Eksperimentiel analyse
• Hvordan opfører algoritmen sig i praksis?
• Passer den teoretisk analyse med den eksperimentielle analyse?
sek.
for 1
000
kørs
ler
0
17,5
35
52,5
70
tabel str.100k 300k 500k 700k 900k 1.1m 1.3m 1.5m 1.7m 1.9m
Alg 1
Algoritme 1
• Givet en tabel A[1..n] løser Algoritme 1 toppunktsproblemet i Θ(n) tid.
• Stemmer overens med praksis.
• Kan vi gøre det bedre?
Algoritme 2
• Algoritme 2 = FindMax
• Det maximale element er også et toppunkt.
1 3 7 15 17 11 2 3 6 8 7 5 9 5 231 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Algoritme 2
findMax(A, n) max = 1 for i = 1 to n if A[i] > A[max] max = i return max
• T(n) = c4 + n·c5 + c6 = Θ(n)
• Samme asymptotisk køretid som algoritme 1.
• Bedre konstanter?
c4
n·c5c6
sek.
for 1
000
kørs
ler
0
17,5
35
52,5
70
tabel str.100k 300k 500k 700k 900k 1.1m 1.3m 1.5m 1.7m 1.9m
Alg 1 Alg 2
Algoritme 2
• Givet en tabel A[1..n] løser Algoritme 2 toppunktsproblemet i Θ(n) tid.
• Er hurtigere i praksis en algoritme 1.
• Kan vi gøre det betydeligt bedre?
• Snedig ide: Kig på en vilkårligt indgang A[i] og dens naboer A[i-1] og A[i+1].
• A[i] er et toppunkt => returner i.
• Ellers: A er lokalt voksende i mindst en retning.
!
!
!
• => Der findes et toppunkt i den voksende retning.
• => Vi kan smide resten af tabellen væk og stå tilbage med enten A[1..i-1] eller A[i+1..n].
1 3 7 15 17 11 2 3 6 8 7 5 9 5 231 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Algoritme 3
• Kig på miderste indgang A[m] og dens naboer A[m-1] og A[m+1].
• A[m] er et toppunkt => returner m.
• Ellers: A er lokalt voksende i mindst en retning.
• Find toppunkt i en lokalt voksende retning rekursivt.
1 3 7 15 17 11 2 3 6 8 7 5 9 5 231 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Toppunkt3(A,i,j) m = floor((i+j)/2) if A[m-1] ≤ A[m] ≥ A[m+1] return m elseif A[m-1] > A[m] return Toppunkt3(A,i,m-1) elseif A[m] < A[m+1] return Toppunkt3(A,m+1,j)
• Kig på miderste indgang A[m] og dens naboer A[m-1] og A[m+1].
• A[m] er et toppunkt => returner m.
• Ellers: A er lokalt voksende i mindst en retning.
• Find toppunkt i en lokalt voksende retning rekursivt.
Køretid
• Et rekursivt kald tager konstant tid.
• Hvormange rekursive kald laver vi?
• Et rekursivt kald halverer størrelsen af tabellen vi kigger på. Vi stopper når tabellen har størrelse 1.
• 1. rekursive kald: n/2
• 2. rekursive kald: n/4
• ….
• k’te. rekursive kald: n/2k
• ….
• => Efter log2 n rekursive kald har tabellen størrelse ≤ 1.
• => Køretiden er Θ(log n)
sek.
for 1
000
kørs
ler
0
17,5
35
52,5
70
tabel str.100k 300k 500k 700k 900k 1.1m 1.3m 1.5m 1.7m 1.9m
Alg 1 Alg 2 Alg 3
Algoritme 3
• Givet en tabel A[1..n] løser Algoritme 3 toppunktsproblemet i Θ(log n) tid.
• Meget, meget hurtigere end algoritme 1 og 2.
Opsummering
• Algoritmer og datastrukturer
• Toppunkter
• Algoritme 1
• Algoritme 2
• Algoritme 3