1 / 42

בתרגול הקודם

בתרגול הקודם. פונקציות: לשם מה צריך פונקציות מבנה של פונקציה מה קורה בזמן קריאה לפונקציה העברת משתנים לפונקציה (פרימיטיבי לעומת לא פרימיטיבי) משתנים לוקליים העמסה. תרגול מס' 5. נושאים מחרוזות מיון (מיון בועות) רקורסיה. מחרוזות. הקדמה

kyrene
Download Presentation

בתרגול הקודם

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. בתרגול הקודם • פונקציות: • לשם מה צריך פונקציות • מבנה של פונקציה • מה קורה בזמן קריאה לפונקציה • העברת משתנים לפונקציה (פרימיטיבי לעומת לא פרימיטיבי) • משתנים לוקליים • העמסה

  2. תרגול מס' 5 נושאים מחרוזות מיון (מיון בועות) רקורסיה מבוא למדעי המחשב, בן גוריון

  3. מחרוזות הקדמה מחרוזת (String) היא מחלקה המייצגת טקסט (רצף של תווים). מיספור אינדקס התווים במחרוזת מתחיל מ-0 ונגמר באורך המחרוזת פחות 1. String "abcd"Index 0123 מבוא למדעי המחשב, בן גוריון

  4. מחרוזות פעולות על מחרוזות: • הגדרה ואתחול String s1; String s2 = "abcd"; String s3 =""; String s4 = null; String s5 = new String(); מבוא למדעי המחשב, בן גוריון

  5. מחרוזות • אורךמחרוזת String s2 = "abcd"; System.out.println(s2.length()); String s3 = ""; System.out.println(s3.length()); String s4 = null; System.out.println(s4.length()); 4 0 NullPointerException מבוא למדעי המחשב, בן גוריון

  6. מחרוזות String s2 = "abcd"; • גישה לתו במיקום (אינדקס) מסוים s2.charAt(0) s2.charAt(1) s2.charAt(5) 'a' 'b' StringIndexOutOfBoundsException:String index out of range מבוא למדעי המחשב, בן גוריון

  7. מחרוזות • תת-מחרוזת החל מאינדקס i ועד אינדקס j (לא כולל את j). String s2 = "abcd"; s2.substring(1,3) "bc" s2.substring(1) "bcd" • השוואה בין תוכן שתי מחרוזות. התוצאה בוליאנית (true או false). s2.equals(s3) • שרשור+ s2+"efg" יוצר מחרוזת חדשה "abcdefg". המחרוזת s2 לא משתנה. מה משווה האופרטור "==" ? מבוא למדעי המחשב, בן גוריון

  8. מחרוזות דוגמה 1 – מחרוזת עם סדר תווים הפוך לפנינו פונקציה reverse המקבלת מחרוזת ומחזירה מחרוזת אחרת שבה התווים בסדר (מיקום) הפוך. הפונקציה main מפעילה את reverse על המחרוזת "Hello" ומדפיסה את התוצאה (olleH). publicstaticvoid main (String[] args){System.out.println(reverse("Hello")); } מבוא למדעי המחשב, בן גוריון

  9. פתרון publicstatic String reverse(String data) { String rev = new String(); for (int j=data.length()-1; j>=0; j=j-1) { rev = rev + data.charAt(j); } return rev; } מבוא למדעי המחשב, בן גוריון

  10. מחרוזות דוגמה 2 – חיפוש של תת-מחרוזת במחרוזת לפנינו פונקציה isSubstring המקבלת שתי מחרוזתstr ו- sub ובודקת האם sub מופיעה בתוך str כתת מחרוזת. הפונקציה מחזירה תשובה בוליאנית. למשל, המחרוזת "bc" מופיעה כתת-מחרוזת במחרוזת "abcd" באינדקס 1. String "abcd" Index 0123 הרעיון: נשווה את "bc" לתתי מחרוזות של "abcd" בעלות אורך זהה. מבוא למדעי המחשב, בן גוריון

  11. publicstaticboolean isSubstring(String str,String sub){ boolean isFound = false; int lastInd = str.length()- sub.length(); for (int i=0; i<=lastInd && !isFound; i=i+1) { String strSub = str.substring(i, i+sub.length()); if (strSub.equals(sub)) { isFound = true; } } return isFound; } מבוא למדעי המחשב, בן גוריון

  12. טבלת ASCII מבוא למדעי המחשב, בן גוריון

  13. דוגמה 3 - צופן קיסר סכמה של צופן כללי: מבוא למדעי המחשב, בן גוריון

  14. דוגמה 3 - צופן קיסר צופן (Cipher) הוא אלגוריתם הצפנה, המקבל טקסט קריא ומפתח, ומחזיר טקסט מוצפן. • צופן קיסר מבוסס על רעיון החלפת האותיות של הטקסט הקריא, לשם יצירתו של הטקסט המוצפן: האלפבית המשמש להצפנה מוסט מעגלית במספר קבוע של 'מקומות' מן האלפבית הרגיל. • המפתח (key) = מספר מקומות ההסטה. • לפי עדויות היסטוריות יוליוס קיסר עשה בשיטה זו שימוש נרחב. מבוא למדעי המחשב, בן גוריון

  15. דוגמה 3 - צופן קיסר למשל, בהזזה של 3 מקומות המילהBABY תתורגם... למילה EDEB. מבוא למדעי המחשב, בן גוריון

  16. זה תקין? publicstatic String encrypt(String str, int key) { String ans = ""; finalint ALPHABET_SIZE = 26; for (inti = 0; i < str.length(); i=i+1) { int c = str.charAt(i); if ('A'<=c && c<='Z') { c = c - 'A'; c = ((c + key) % ALPHABET_SIZE )+'A'; } elseif ('a'<=c && c<='z') { c = c - 'a'; c = ((c + key) % ALPHABET_SIZE )+'a'; } ans = ans + (char)c; } returnans; } Auto casting מבוא למדעי המחשב, בן גוריון

  17. דוגמה 3 - צופן קיסר כמה הערות: • בפקודה int c = str.charAt(i)מתרחשת המרת טיפוס אוטומאטית מ- char ל- int.כנ"ל בביטויים כמו'A'<=c ו-c-'A'. • בפקודה ans = ans + (char)cיש המרת טיפוס מפורשת מ- int ל- char. פעולה זו נחוצה מכיוון שנרצה לשרשר למחרוזת התוצאה ערך char ('A') ולא int (65). • הערכים המספריים של כל תו מסוכמים בטבלה (טבלת ASCII, תקן UNICODE). אין כלל צורך לזכור את הטבלה בע"פ. מבוא למדעי המחשב, בן גוריון

  18. דוגמה 3 - צופן קיסר publicstaticvoid main(String[] args) { String str = "BEN GURION UNIVERSITY"; int key = 3; String encrypted = encrypt(str, key); System.out.println(encrypted);// "EHQ JXULRQ XQLYHUVLWB" String decrypted = decrypt(encrypted, key); System.out.println(decrypted);// "BEN GURION UNIVERSITY" } שאלה: מהי פעולת פענוח (decrypt) של צופן קיסר? תשובה: בדומה להצפנה, מלבד חיסור של מפתח ההזזה במקום חיבורו. מבוא למדעי המחשב, בן גוריון

  19. דוגמה 3 - צופן קיסר פריצת צופן קיסר • בהינתן טקסט מוצפן - כיצד ניתן לגלות את הטקסט הקריא מבלי לדעת את המפתח? • ניתן לנחש את המפתח בו הוצפן הטקסט באמצעות סטטיסטיקה על השכיחויות של אותיות האלף בית האנגלי בטקסט כלשהו. האות השכיחה ביותר בטקסט באנגלית היא E, שכיחותה 12%. • ב –quiz הבא תכתבו תוכנית המוצאת את האות השכיחה ביותר בטקסט נתון. סביר להניח שאות זו היא הקידוד של האות E וככה ניתן לחשב בכמה הזזנו את האותיות. • ניתן לנסות את כל ההסטות האפשריות (כמה כאלו יש?) ולהשוות את התוצאה למילון. מבוא למדעי המחשב, בן גוריון

  20. מיונים מיון מערך (array sort) - הגדרת הבעיה: בהינתן מערך A של n מספרים שלמים, חשב מערך ממוין של אותם מספרים. למשל: Input: 7, 18, 28, 4, 10 Output: 4, 7, 10, 18, 28 ישנן שיטות מיון רבות, למשל: • מיון בחירה (Selection Sort) • מיון הכנסה Insertion Sort)) • מיון בועות (Bubble Sort) מבוא למדעי המחשב, בן גוריון

  21. מיון בועות (Bubble Sort) תיאור השיטה: תוך כדי המיון, החלק הימני של המערך כבר ממוין ("מעל פני הים") והחלק השמאלי של המערך אינו ממוין ("מתחת לפני הים"). בכל סבב, "בועה" מבעבעת עד שהיא מגיעה לפני הים. הבועה "סוחבת" איתה ערכים גדולים: בבעבוע הבועה, בכל שני תאים סמוכים בהן עוברת הבועה, מוחלפים הערכים אם אינם בסדר המיון. http://www.youtube.com/watch?v=gWkvvsJHbwY מבוא למדעי המחשב, בן גוריון

  22. מיון בועות (Bubble Sort) 18 7 28 4 10 7 18 28 4 10 7 18 28 4 10 7 18 4 28 10 7 18 4 10 28 7 18 4 10 28 7 18 4 10 28 7 4 18 10 28 7 4 10 1828 7 4 10 18 28 7 4 10 1828 4 7 10 1828 4 7 10 1828 4 7 10 1828 4 7 10 1828 וכן הלאה עד אשר המערך כולו מעל פני הים. מבוא למדעי המחשב, בן גוריון

  23. publicstaticvoid bubbleSort(int[] array){ int tmp; /* @pre: bbl=0 */ for (int bbl=0; bbl<array.length-1; bbl=bbl+1) { /* @inv: array[array.length-bbl.. array.length-1] is sorted * and all numbers array[array.length-bbl .. array.length-1] * are bigger than the numbers array[0 .. array.length-bbl-1] */ for (int index=0; index < array.length-1; index=index+1){ if (array[index] > array[index+1]) { tmp = array[index]; array[index] = array[index+1]; array[index+1] = tmp; } } } /* @post: array is sorted */ } מבוא למדעי המחשב, בן גוריון

  24. מיון בועות(Bubble Sort) שאלה: כמה השוואות מתבצעות? (array[index] > array[index+1]) תשובה: הלולאה הפנימית מבצעת n השוואות. הלולאה החיצונית מתבצעת n פעמים. סה"כ n2השוואות. שאלה: האם כל ההשוואות נחוצות? תשובה: לא. • אם המערך כבר ממוין אין צורך להמשיך בלולאה (לא צריך לבעבע עוד בועה). • השוואות הנעשות בחלק הממויין מיותרות (פני הים יורדים, ויש להשוות איברים רק מתחת לפני הים). מבוא למדעי המחשב, בן גוריון

  25. publicstaticvoid bubbleSort(int[] array){ boolean isSorted = false; int tmp; for (int bbl=0; !isSorted && bbl<array.length-1; bbl=bbl+1){ isSorted = true; for (int index=0; index<array.length-1-bbl; index=index+1){ if (array[index] > array[index+1]) { tmp = array[index]; array[index] = array[index+1]; array[index+1] = tmp; isSorted = false; } } } } מבוא למדעי המחשב, בן גוריון

  26. רקורסיה מבוא למדעי המחשב, בן גוריון

  27. רקורסיה פונקציה רקורסיבית היא פונקציה שקוראת לעצמה. פונקציה רקורסיבית מחושבת כמו כל פונקציה אחרת (העברת פרמטרים, משתנים לוקאליים, תחום הכרה של המשתנים וכו'). מוטיבציה: ישנן בעיות רבות שעבורן פתרון רקורסיבי פשוט יותר מפתרון איטרטיבי. מבוא למדעי המחשב, בן גוריון

  28. רקורסיה דוגמה 1: סכום מספרים טבעיים עד n אפשר בלולאה (פתרון איטרטיבי): publicstaticint sum(int n) { int ans = 0; for (int i = 1; i <= n; i = i + 1) { ans = ans + i; } return ans; } מבוא למדעי המחשב, בן גוריון

  29. רקורסיה אפשר גם בדרך אחרת: נניח שיש לנו פונקציה אחרת בשם magic שמחזירה את הסכום 1 + 2+ ... + (n-1). אז sum יכולה להראות כך: publicstaticint sum(int n) { int ans = magic(n)+ n; return ans; } אבל magic(n) מחזירה בדיוק מה ש-sum(n-1) הייתה מחזירה. מבוא למדעי המחשב, בן גוריון

  30. רקורסיה ניתן להגדיר נוסחת נסיגה עבור החישוב: sum(n) = sum(n-1)+n publicstaticint sum(int n) { int ans = sum(n-1)+ n; return ans; } מבוא למדעי המחשב, בן גוריון

  31. רקורסיה התוצאה היא פונקציה אחת שקוראת לעצמה: publicstaticint sum(int n) { int ans; if (n == 1) // stop condition ans = 1; else ans = sum(n - 1) + n; return ans; } *** מעקב על דוגמת הרצה וציור טבלאות מעקב משתנים. מבוא למדעי המחשב, בן גוריון

  32. רקורסיה נכונות: טענה 1: התוכנית sum עוצרת לכל n ≥ 1. הוכחה: 1. בכל קריאה רקורסיבית n קטן ב-1. ans = sum(n-1) + n; 2. בכל קריאה לפונקציה בודקים האם n == 1. if (n == 1) 3. מ-1 ו-2 האלגוריתם עוצר. מבוא למדעי המחשב, בן גוריון

  33. רקורסיה טענה 2: לכל n המקיים 1≤n, האלגוריתם מחזיר את הערך 1 + 2 + … + n. מכיוון שבפתרון רקורסיבי בכל קריאה אנו מקטינים את הבעיה, אינדוקציה על גודל הקלט מתאימה מאוד להוכחת נכונות של אלגוריתמים רקורסיביים. הוכחה באינדוקציה על n: מקרה בסיס: כאשר n=1, האלגוריתם מחזיר 1 כנדרש. הנחת האינדוקציה: נניח כי הטענה נכונה עבור 1≤k כלשהו. צעד האינדוקציה: כאשר האלגוריתם מופעל על קלט k+1, הקריאה הרקורסיבית היא על קלט k. על-פי הנחת האינדוקציה, הקריאה הרקורסיבית תחזיר את הסכום 1 + 2 + … + k. לכך מוסיף האלגוריתם את k+1 (הקלט של הקריאה הנוכחית) ומתקבל הסכום 1 + 2 + … + k + (k+1), אותו מחזיר האלגוריתם, כנדרש. מבוא למדעי המחשב, בן גוריון

  34. רקורסיה שלושת הכללים לבניית פונקציה רקורסיבית • תנאי עצירה שניתן לענות עליו ללא קריאה רקורסיבית. (תנאי בסיס)אם לא נשים תנאי עצירה התוכנית עלולה להיכנס ללולאה אינסופית. • קריאה רקורסיבית עם קלט הקרוב יותר לתנאי העצירה ("הקטנת הבעיה").אם לא מקטינים את הבעיה לא נגיע לתנאי העצירה, כלומר שוב תהיה לולאה אינסופית. • שימוש בתוצאת הקריאה הרקורסיבית לחישוב התוצאה המוחזרת (הנחת האינדוקציה). מבוא למדעי המחשב, בן גוריון

  35. דוגמה 2 – משולש פסקל תזכורת: משולש פסקל הוא סידור של מספרים בצורת משולש, הנבנה באופן הבא: הקודקוד העליון של משולש זה מכיל את המספר 1, וכל מספר במשולש מהווה את סכום שני המספרים שנמצאים מעליו (המספרים שנמצאים על שוקי המשולש הם כולם 1). n 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1 m 0 1 2 3 4 5 המספר ה-m בשורה ה- n, נותן את התשובה לשאלה "בכמה דרכים שונות אפשר לבחור m עצמים מתוך n עצמים?" (מקדם בינומי). מבוא למדעי המחשב, בן גוריון

  36. דוגמה 2 – משולש פסקל נכתוב פונקציה רקורסיבית pascal(int n, int m)שתחשב את המספר המופיע בשורה n ובעמודה m במשולש פסקל. תאור האלגוריתם • תנאי עצירה: אם m הוא 0 נחזיר ערך 1. אם n=m נחזיר ערך 1. • חוקיות הקלט: n ו- m הם שלמים אי-שליליים. אם m>n נציין שיש שגיאה בקלט. • קריאות רקורסיביות על קלט קטן יותר: קריאה אחת עם n-1 ו- m (המספר מעל) קריאה שנייה עם n-1 ו m-1 (המספר מעל ומשמאל) • שילוב התוצאות לקבלת תשובה: החזרת סכום של הערכים שהתקבלו משתי הקריאות הרקורסיביות. מבוא למדעי המחשב, בן גוריון

  37. דוגמה 2 – משולש פסקל // Pascal number in row n and column m. publicstaticintpascal(int n, int m){ intans; if (m<0 || n<0 || m>n) { ans = -1; } elseif (m==0 || n == m) { ans = 1; } else { ans = pascal(n-1,m) + pascal(n-1,m-1); } returnans; } מבוא למדעי המחשב, בן גוריון

  38. דוגמה 3 - זוגיים ואי זוגיים המטרה: רוצים לבדוק האם מספר טבעי nהוא זוגי או אי-זוגי באמצעות הפונקציות evenו- odd(ללא פעולות חלוקה ושארית). publicstaticboolean even(int n) { booleanans; if (n == 0) ans = true; else ans = odd(n - 1); returnans; } publicstaticboolean odd(int n) { booleanans; if (n == 1) ans = true; else ans = even(n - 1); returnans; } מה קורה כאשר מפעילים את even על מספר אי-זוגי גדול מ 0? מבוא למדעי המחשב, בן גוריון

  39. דוגמה 3 - זוגיים ואי זוגיים נסיון שני: publicstaticboolean even(int n) { booleanans; if (n == 0) ans = true; else ans = odd(n - 1); returnans; } publicstaticboolean odd(int n) { booleanans; if (n == 0) ans = false; else ans = even(n - 1); returnans; } רקורסיה הדדית: even קוראת לעצמה דרך odd, ו- odd קוראת לעצמה דרך even. מבוא למדעי המחשב, בן גוריון

  40. דוגמה 4 - פונקציה מסתורית מצא מה הפונקציה הבאה מחשבת: publicstaticint mystery(int a, int b) { intans; if (b == 0) { ans = 0; } elseif (b % 2 == 0) { ans = mystery(a+a, b/2); } else { ans = mystery(a+a, b/2) + a; } returnans; } תשובה: a*b. ניתן להדגים עם mystery(4,10) מבוא למדעי המחשב, בן גוריון

  41. דוגמה 4- פונקציה מסתורית מצא מה הפונקציה הבאה מחשבת: publicstaticint mystery(int a, int b) { intans; if (b == 0) { ans = 1; } elseif (b % 2 == 0) { ans = mystery(a*a, b/2); } else { ans = mystery(a*a, b/2) * a; } returnans; } תשובה: ab. ניתן להדגים עם mystery(2,5) מבוא למדעי המחשב, בן גוריון

  42. סיכום • מחרוזות: length, charAt, substring, equals, + • מיון בועות • רקורסיה • הרכיבים: • תנאי עצירה • קריאות רקורסיביות עם קלט קרוב יותר לתנאי העצירה (הקטנת הבעייה) • שילוב התוצאות של הקריאות הרקורסיביות לקבלת התוצאה • הוכחות נכונות: עצירה, נכונות החישוב (אינדוקציה) • רקורסיה הדדית מבוא למדעי המחשב, בן גוריון

More Related