Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Begreber og Redskaber 8. Plan for idag Sortering fortsat Comparable Søgning –Lineær søgning –Binær søgning.

Lignende præsentationer


Præsentationer af emnet: "Begreber og Redskaber 8. Plan for idag Sortering fortsat Comparable Søgning –Lineær søgning –Binær søgning."— Præsentationens transcript:

1 Begreber og Redskaber 8

2 Plan for idag Sortering fortsat Comparable Søgning –Lineær søgning –Binær søgning

3 Udvalgssortering Find mindste og sæt på første plads Find næstmindste og sæt på anden plads Osv. Kompleksitet: O(n 2 ) Dvs køretid er ca k * n 2 hvor n er længden af tabellen og k er en konstant der bl.a. afhænger af maskinens hastighed

4 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 * log 2 (n)) Man kan halvere en tabel log 2 (n) gange Fletning er lineær i tid

5 Fletning static void merge(int[] tb,int[] tm, int from,int mid,int to){ int n = to-from+1; int i1=from, i2=mid+1, j=0; while(i1<=mid && i2 <= to){ if(tb[i1]<tb[i2]){ tm[j]=tb[i1];i1++;j++; }else{ tm[j]=tb[i2];i2++;j++; } while(i1<=mid){tm[j]=tb[i1]; i1++;j++;} while(i2<=to ){tm[j]=tb[i2]; i2++;j++;} for(j=0;j<n;j++)tb[from+j]=tm[j]; }

6 Flettesortering static void mergesort(int[] tb,int[] tm, int from,int to){ if(from==to) return; int mid=(to+from)/2; mergesort(tb,tm,from,mid); mergesort(tb,tm,mid+1,to); merge(tb,tm,from,mid,to); } static void sort(int[] tb){ int tm[]=new int[tb.length]; mergesort(tb,tm,0,tb.length-1); }

7 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 log 2 (n!) sammenligninger

8 Eksperiment: antal ”<” N=længdeUdvalg- sortering Flette- sortering Javas sortering log2(n!) 1004950539575518 1000499500873890658519 1000049995000120341123363118444 100000-153604515719671516687

9 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

10 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);

11 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

12 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

13 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

14 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; }

15 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); }

16 Binær søgning Der er to tilfælde 1. Listen har eet element -- Det eftersøgte tal sammenlignes med tallet på listen 2. 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 Eksempel på en del og hersk strategi

17 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(log 2 (n))

18 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 definition f(1) = 1 f(2) = 1 f(n) = f(n-1)+f(n-2), n>2

19 funktion: fib Rekursiv metode der beregner det n’te Fibonaccital public static int fib(int n){ if (n <= 2) return 1; else return fib(n-1)+fib(n-2); }

20 Plan for idag Når fib kaldes med 7 som argument: fib(7): fib(7) udregnes 1 gang fib(6) udregnes 1 gang fib(5) udregnes 2 gange fib(4) udregnes 3 gange fib(3) udregnes 5 gange fib(2) udregnes 8 gange fib(1) udregnes 5 gange Det samme beregnes altså mange gange

21 Eksponentielt n fib(n) Antal fib kald 1089177 201094621891 3013462692692537 40165580141331160281

22 Fibonaccital – med for-løkke Iterativt program der beregner det n’te Fibonaccital public 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?


Download ppt "Begreber og Redskaber 8. Plan for idag Sortering fortsat Comparable Søgning –Lineær søgning –Binær søgning."

Lignende præsentationer


Annoncer fra Google