Download presentation
Presentation is loading. Please wait.
Published byHugo Chandler Modified over 9 years ago
1
מבוא למדעי המחשב הרצאה 11: תכנות רקורסיבי 4 כולל מיון רקורסיבי 1
2
החזרת כל הפרמוטציות 2 public static String[] permString(String s) { String [] ans; if (s.length()==0) { ans = new String[1]; ans[0] = ""; } else { String[] tmp = permString(s.substring(1)); ans = new String[s.length()*tmp.length]; for (int i=0; i<tmp.length; i=i+1) for (int j=0; j<s.length(); j=j+1) ans[i*s.length()+j] = tmp[i].substring(0,j) + s.charAt(0) + tmp[i].substring(j); } return ans; }
3
מיון רקורסיבי 3
4
מיון מיזוג - דוגמא 21,5,8,1, # 10,3,-1,30, 21,5, # 8,1, 21, # 5, sorted: 5,21, 8, # 1, sorted: 1,8, sorted: 1,5,8,21, sorted: -1,1,3,5,8,10,21,30, 10,3, # -1,30, 10, # 3, sorted: 3,10, -1, # 30, sorted: -1,30, sorted: -1,3,10,30, 4
5
מיון מיזוג - תכנון אילו שיטות צריך כדי לכתוב את מיון המיזוג? פיצול: חתימה, תנאי קצה, אלגוריתם. מיזוג: חתימה, תנאי קצה, אלגוריתם. תוכנית ראשית:... 5
6
Merge sort public static int[] sort(int[] arr){ if (arr==null || arr.length<2) return arr; else return merge(sort(splitLeft(arr)),sort(splitRight(arr))); } 6
7
פיצול (מיון מיזוג) public static int[] splitLeft(int[] arr){ int[] ans = new int[arr.length/2]; for (int i=0; i<arr.length/2; i=i+1) ans[i]=arr[i]; return ans; } public static int[] splitRight(int[] arr){ int[] ans = new int[arr.length-arr.length/2]; for (int i=arr.length/2; i<arr.length; i=i+1) ans[i-arr.length/2]=arr[i]; return ans; } 7
8
מיזוג (מיון מיזוג) public static int[] merge(int[] arr1, int[] arr2) { int ind = 0, i1=0, i2=0; int len1 = arr1.length, len2=arr2.length; int[] ans = new int[len1+len2]; while(i1<len1 & i2 < len2) { if(arr1[i1] <arr2[i2]) { ans[ind] = arr1[i1]; i1=i1+1; } else { ans[ind] = arr2[i2]; i2=i2+1; } ind=ind+1; } 8
9
מיזוג - המשך for(int i=i1;i<len1;i=i+1) { ans[ind] = arr1[i]; ind=ind+1; } for(int i=i2;i<len2;i=i+1) { ans[ind] = arr2[i]; ind=ind+1; } return ans; } 9
10
321126117159 9117 1 159 126 9 ניתוח זמן ריצה : פיצול 321126 321 15171612213 10
11
9 1517171612213 159171 126213 1715129631 171591211263 ניתוח זמן ריצה : איחוד N N N N O(N log N) 11
12
ניצול אולם מקסימלי בהנתן אולם הרצאות ואוסף של שיעורים עם זמן התחלה וזמן סיום. מצא את הניצול המקסימאלי של האולם מבחינת הזמן שהשיעורים התקימו בו. שים לב ששני שיעורים שנחתכים בזמנים לא יכולים להתקיים בו זמנית באולם (לכן לכל היותר אחד משני השיעורים יחשב בניצול האולם). 12
13
13 public static int maxUse(int[][] segArr){ segArr= sortByEndPoints(segArr); return maxUse(segArr, segArr.length-1); { sortByEndPoints(int[][] segArr); ?? Just like mergesort !! (but on segments)
14
14 public static int maxUse(int[][] segArr, int i){ int res = 0; if (i >= 0){ int len = segArr[i][1] - segArr[i][0]; int nextI = findNextSeg(segArr, i); int with = maxUse(segArr,nextI)+len; int without = maxUse(segArr,i-1); res = Math.max(with,without); } return result; }
15
15 public static int findNextSeg(int[][] segments, int i){ int endPoint = segments[i][0]; while ((i >= 0) && (endPoint < segments[i][1]) ) i = i -1; return i; {
16
ניצול אולם מקסימלי - memoization 16 public static int maxUse(int[][] segArr){ int[] memo = new int[segArr.length + 1]; segArr= sortByEndPoints(segArr); return maxUse(segArr,segArr.length-1,memo); {
17
17 public static int maxUse(int[][] segArr, int i, int[] memo){ int res = 0; if (i >= 0){ if (memo[i])==0){ int len=segArr[i][1]-segArr[i][0]; int nextI=findNextSeg(segArr, i); int with=maxUse(segArr,nextI,memo)+len; int without=maxUse(segArr,i-1,memo); res=Math.max(with,without); memo[i] = res; } else result=memo[i]; return result; }
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.