200 likes | 318 Views
Begreber og Redskaber 8. BRP. Plan for idag. Sortering fortsat Comparable Søgning Lineær søgning Binær søgning. Udvalgssortering. Find mindste og sæt på første plads Find næstmindste og sæt på anden plads Osv. Kompleksitet: O(n 2 )
E N D
Plan for idag • Sortering fortsat • Comparable • Søgning • Lineær søgning • Binær søgning
Udvalgssortering • Find mindste og sæt på første plads • Find næstmindste og sæt på anden plads • Osv. • Kompleksitet: O(n2) • Dvs køretid er ca k * n2 hvor n er længden af tabellen og k er en konstant der bl.a. afhænger af maskinens hastighed
Flettesortering • Bliv ved med at dele tabellen op i mindre dele til delene kun er et felt langt. • Alle delene er så sorteret! • Bliv ved med at flette de enkelte dele sammen til man har flettet det hele. • Kompleksitet: O(n*log2(n)) • Man kan halvere en tabel log2(n) gange • Fletning er lineær i tid
Bedst opnåelige • Antal måder en tabel kan være usorteret på: n! = 1*2*3* .. * n • F.eks. ”tea”: ”tea” ”tae” ”eta” ”ate” ”eat” ”aet” • En sortering skal stille nogle ja/nej spørgsmål for at finde ud af hvordan tabellen er usorteret på: • Bedste måde at spørge på halverer mulighederne, dvs Bedste sortering kan nøjes med log2(n!) sammenligninger
Sortering i Java • F.eks import java.util.*; int[] tabel=new int[1000]; Arrays.sort(tabel); Sortering med en algoritme kaldet ”Shellsort” Lidt flere sammenligninger, men til gengæld nogle færre flytninger
Comparable class Person implements Comparable{ public int compareTo(Object other){ if(! (other instanceof Person))return -1; Person p = (Person) other; if(this.xxx < p.xxx) return -1; if(this.xxx > p.xxx) return 1; return 0; } } … eller et andet indhold i sammenligningen Comparable[] tabel=new Person[1000]; eller Person[] tabel=new Person[1000]; … Arrays.sort(tabel);
Søgning • Lineær søgning: • Start fra en ende af og led…. Findes et heltal på en liste af heltal?For eksempel findes 17 i listen [11, 9, 17, 5, 12] men ikke i [14, 2, 4, 19, 3] Ved lineær søgning findes svaret ved at gennemløbe hele listen
Program til lineær søgning public static int search(int[] a, int v){ for (int i=0; i<a.length; i++){ if (a[i]==v) return i; } return -1;}Hvis det søgte tal ikke findes returneres -1
Binær søgning • Hvis det man søger i er sorteret er det nemmere • Led efter 400 i [5, 14, 32, 43, 76, 100, 104, 115, 176, 290, 400, 511, 945] • Kig i midten: 104 • Det er mindre end 400 så kig i anden halvdel: [115, 176, 290, 400, 511, 945] • Kig i midten: 290 • Det er mindre end 400 så kig i anden halvdel: [400, 511, 945] • Kig i midten: 511 • Det er større end 400 så kig i første halvdel: [400] BINGO
Binær søgning – med while static int search(Comparable tb[], Comparable x) { int from=0, to=tb.length-1; while(from<=to){ int mid=(to+from)/2; int v=tb[mid].compareTo(x); if(v==0)return mid; if(v<0)from=mid+1; if(v>0)to=mid-1; } return -1; }
Binær søgning - rekursivt public static int search(int[] a, int v){ return binSea(a, 0, a.length -1, v); } public static int binSea(int[] a, int from, int to, int v) { if (from==to) if (a[from]==v) return from; else return -1; int mid = (from+to)/2; if (v>a[mid]) return binSea(a, mid+1, to, v); else return binSea(a, from, mid, v); }
Binær søgning Der er to tilfælde1. Listen har eet element -- Det eftersøgte tal sammenlignes med tallet på listen2. Listen har mere end eet element -- Listen deles op i to halvdele -- Hvis det eftersøgte tal er større end sidste tal i første halvdel eftersøges det i sidste halvdel -- Ellers eftersøges det i første halvdel Bemærk: Basis og rekursivt tilfælde
Kompleksitet Lineær søgning hvis det findes skal man i snit halvvejs igennem. Findes det ikke skal man hele vejen. O(n) Binær søgning: halveringer: O(log2(n)
Fibonaccitallene Fibonaccitallene 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... Hvert tal, pånær de to første, er summen af de to forrige tal Rekursiv definitionf(1) = 1f(2) = 1f(n) = f(n-1)+f(n-2), n>2
funktion: fib Rekursiv metode der beregner det n’te Fibonaccitalpublic static int fib(int n){ if (n <= 2) return 1; else return fib(n-1)+fib(n-2);}
Plan for idag Når fib kaldes med 7 som argument: fib(7): fib(7) udregnes 1 gangfib(6) udregnes 1 gangfib(5) udregnes 2 gangefib(4) udregnes 3 gangefib(3) udregnes 5 gangefib(2) udregnes 8 gangefib(1) udregnes 5 gange Det samme beregnes altså mange gange
Fibonaccital – med for-løkke Iterativt program der beregner det n’te Fibonaccitalpublic static int fib(int n){if (n<=2) return 1; int fold = 1; int fold2 = 1; int fnew; for (int i = 3; i <= n; i++) {fnew = fold + fold2; fold2 = fold; fold = fnew; } return fnew;} Hvad er tidskompleksiteten nu?