Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avMonica Magnusson
1
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och datastructurer - Lite mer rekursivitet -Sorterrings algoritmer -- Kapitel 8 Algoritmer och datastructurer - Lite mer rekursivitet -Sorterrings algoritmer -- Kapitel 8
2
För utveckling av verksamhet, produkter och livskvalitet. Rekursion ? En rekursiv metod är en metod som anropar sig själv. Liknar loopar / iterationer Mycket kraftfull men något förvirrande... Rekursion är ett sätt att lösa ett problem genom att dela problemmet i flera identiska men mindre subproblem, dvs. metoden anropar sig själv med ” ett mindre argument”. Summan av 1+2+3+4+5 +......+n
3
För utveckling av verksamhet, produkter och livskvalitet. Exempel public static int sumOf(int n) { if(n==1) return 1; else return sumOf(n-1) +n; } !! basfall Se till att den rekursiva anropet alltid leder till basfallet
4
För utveckling av verksamhet, produkter och livskvalitet. En enkel lösning till ett komplicerat problem, ”the towers of Hanoi” En grupp munkar på 1800 talet fic uppd att flytta 64 skivor guld (med olik diameter) från ett torn till ett annat. När arbetet var klart skulle jorden gå under. Följnde regler skulle följas: 1)Flytta en disk i taget 2)Ingen skiva med större diameter får ligga över en med mindre. 3)En temporärt torn kan användas så länge regel 1och 2 följs. Hur lång tid tar det att slutföra arbetet om det tar 1 min för varje flytt?
5
För utveckling av verksamhet, produkter och livskvalitet. Towers of Hanoi, lösning
6
För utveckling av verksamhet, produkter och livskvalitet....och algoritmen...? void hanoi(int n, char from, char to, char h){ if(n>0){ hanoi(n-1,from,h, to); System.out.println(from+" --> "+to); hanoi(n-1,h,to,from); }
7
För utveckling av verksamhet, produkter och livskvalitet. En dålig lösning till ett enkelt problem På 1300- talet hittar Leonardo Fibonacci en sekvens av tal för att modellera antalet avkommer från ett kanin par. 1 1 2 3 5 8 13........ F0=1 F1=1 F2=2 F3=3 F4=5 Fn=Fn-1+Fn-2
8
För utveckling av verksamhet, produkter och livskvalitet. Rekursiv algoritm för fibonacci int fibonacci(n) { if(n==0)|| (n==1) return 1 else return fibonacci(n-1)+fibonacci(n-2) }
9
För utveckling av verksamhet, produkter och livskvalitet. Dinamisk programmering public static int fibonacci (int n) { if(n<=1) return 1; else { int first=1; int next=1;int fibTal=0; for (int i=1;i<n;i++) { fibTal=first+next; first=next; next=fibTal; } return fibTal; } Princip: Beräkna ny värde genom att använda de senaste beräknade värde
10
För utveckling av verksamhet, produkter och livskvalitet. Varför är sortering viktigt? Rekursiv binär sökning public static int binarySearch(Comparable [ ] a, Comparable x) { return binarySearch(a,x,0,a.length-1) ; } private static int binarySearch(Comparable [ ] a, Comparable x, int low, int hight){ if(low>hight) return -1; int mid=low+hight/2 else { if(a[mid].compareTo(x)<0) return binarySearch(a,x,mid+1,hight); // h ä r anropar metod sig sj ä lv med h ö gra halvan else if(a[mid].compareTo(x)>0 return binarySearch(a,x,low,mid-1); // h ä r anropar metod sig sj ä lv med v ä nstra halvan else return mid; }
11
För utveckling av verksamhet, produkter och livskvalitet. Varför är sortering viktigt ? En annan exempel. public static boolean duplicates( int [] a) { for(int i=0;i<a.lenght;i++) for(int j=i+1;j<a.length; j++) if(a[i]==a[j]); return true ; return false; } Om en samling data är sorterad, effektiviteten av alla algoritmer på respektive datan ökar betydligt.
12
För utveckling av verksamhet, produkter och livskvalitet. Kvadratiska O(n^2) sorteringar public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } Ex.tiden O( ) Om arrayen är redan sorterad? Ex.tiden O( )
13
För utveckling av verksamhet, produkter och livskvalitet. insertionSort 842719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
14
För utveckling av verksamhet, produkter och livskvalitet. temp=4 842719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
15
För utveckling av verksamhet, produkter och livskvalitet. temp=4 882719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
16
För utveckling av verksamhet, produkter och livskvalitet. temp=4 882719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
17
För utveckling av verksamhet, produkter och livskvalitet. temp=4 482719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
18
För utveckling av verksamhet, produkter och livskvalitet. temp=2 482719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
19
För utveckling av verksamhet, produkter och livskvalitet. temp=2 488719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
20
För utveckling av verksamhet, produkter och livskvalitet. temp=2 488719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
21
För utveckling av verksamhet, produkter och livskvalitet. temp=2 448719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
22
För utveckling av verksamhet, produkter och livskvalitet. temp=2 448719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
23
För utveckling av verksamhet, produkter och livskvalitet. temp=2 248719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
24
För utveckling av verksamhet, produkter och livskvalitet. 248719356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
25
För utveckling av verksamhet, produkter och livskvalitet. temp=7 248819356 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; }
26
För utveckling av verksamhet, produkter och livskvalitet. temp=7 247819356
27
För utveckling av verksamhet, produkter och livskvalitet. insertionSort()- speciellt fall 123456788 Vad blir exekveringstiden när arrayen är sorterad? Tidskomplexitet (värstafall): 1 + 2 + 3 + …. + n-1 = n(n-1)/2 = O(n2)
28
För utveckling av verksamhet, produkter och livskvalitet. Subkvadratiska sorteringsalgoritmer använder divade & conquer - strategi Merge Sort O( NlogN) Dela arrayen i två halvor, sortera halvorna och sedan sätter ihopp halvorna ( merge) i en sorterad array Quick Sort O(NlogN) Dela arrayen i två delar genom att välja ett element i arrayen som pivot. Element som är mindre en pivoten fyttas till enda delen, element som är större till den andra.Sortera delarna.
29
För utveckling av verksamhet, produkter och livskvalitet. Divade & Conquer – teknik (söndra och härska ) Att dela ett problem i två mindre subproblem som kan lösas rekursivt Att sätta ihop lösningen till subproblemen för att lösa original problemet.
30
För utveckling av verksamhet, produkter och livskvalitet. MergeSort -algoritmen 84271936 84271936 8247 48 6391 271936
31
För utveckling av verksamhet, produkter och livskvalitet. MergeSort 84271936 84271936 82476391 1
32
För utveckling av verksamhet, produkter och livskvalitet. MergeSort 84271936 84271936 82476391 12
33
För utveckling av verksamhet, produkter och livskvalitet. MergeSort 84271936 84271936 82476391 12
34
För utveckling av verksamhet, produkter och livskvalitet. MergeSort 84271936 84271936 82476391 123
35
För utveckling av verksamhet, produkter och livskvalitet. MergeSort-algoritmen 84271936 84271936 82476391 123
36
För utveckling av verksamhet, produkter och livskvalitet. Java implementation av Merge Sort public static void mergeSort( int [] a) { int [] temp= new int[a.length]; mergeSort(a, temp, 0, a.length-1); } private static void mergeSort( int [] a, int[] temp,int first,int last) { if(first<last){ int center=first+last/2; mergeSort(a,temp,first,center); mergeSort(a,temp,center+1,last) merge(a,temp,first,center+1,last); } Se merge () i kurslitteraturen
37
För utveckling av verksamhet, produkter och livskvalitet. Tidskomplexiteten? 75 357920 420639 46 Dela i två halvor Sortera halvorna 02345679 Gör ”merge” till en temp array 02394567 Kopiera temp arrayen tillbaka till original arrayen
38
För utveckling av verksamhet, produkter och livskvalitet. Quicksort Söndra och härska algoritm med flera variationer Bättre i medelfall än övriga algoritmer Dålig i värsta fall, som dock händer nästan aldrig Idé: Välj ut ett element (pivot) och se till att det hamnar på rätt plats genom att först flytta om övriga element så att alla som är mindre än pivotelementet hamnar till vänster och alla större hamnar till höger. Upprepa sedan (rekursivt) på vänster och höger delar av arrayen 8149635270
39
För utveckling av verksamhet, produkter och livskvalitet. QuickSort- implementationsskiss <=pivotpivot>=pivot quickSort( a,first, last) { if(first<last) // välj pivot // dela arrayen quickSort(a,first,pivotindex-1) // sortera mindre quickSort(a,pivotindex+1,last) // sortera större }
40
För utveckling av verksamhet, produkter och livskvalitet. Quicksort med pivot = median av tre Antag vi skall sortera array elementen mellan a[low]..a[high]. Mittplatsen mid = (low + high) / 2. Utred storleksordningen mellan elementen a[low], a[high] och a[mid]. Byt samtidigt platser så att platsen low kommer att innehålla det minsta av dem, mid det mittersta i storleksordning och high det största. low mid high 8 1 4 9 6 3 5 2 7 0 low mid high 0 1 4 9 6 3 5 2 7 8 Pivotelementet = medianen av de tre = elementet som nu
41
För utveckling av verksamhet, produkter och livskvalitet. QuickSort() 8149635270 Median av tre ->6
42
För utveckling av verksamhet, produkter och livskvalitet. QuickSort() 8149035276
43
För utveckling av verksamhet, produkter och livskvalitet. QuickSort() 2149035876
44
För utveckling av verksamhet, produkter och livskvalitet. QuickSort() 2145039876
45
För utveckling av verksamhet, produkter och livskvalitet. QuickSort() 2145036879
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.