1 / 66

מבני נתונים ויעילות אלגוריתמים

מכללת אורט כפר-סבא. מבני נתונים ויעילות אלגוריתמים. צירופים קומבינטוריים מיון מיזוג ( Merge Sort ). 29.10.14. אורי וולטמן. uri.weltmann@gmail.com. חידה לחימום. נתונה שורה של N משבצות, אשר חלקן צבועות בשחור וחלקן צבועות בלבן.

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. מכללת אורט כפר-סבא מבני נתוניםויעילות אלגוריתמים צירופים קומבינטוריים מיון מיזוג (Merge Sort) 29.10.14 אורי וולטמן uri.weltmann@gmail.com

  2. חידה לחימום • נתונה שורה של N משבצות, אשר חלקן צבועות בשחור וחלקן צבועות בלבן. • האופרטור reverse מקבל כפרמטרים את האינדקסים של שתי משבצות (לאו דווקא סמוכות) והופך את הצבע של כל אחת מהן (צבע לבן הופך לשחור וצבע שחור הופך ללבן). • כתבו תכנית אשר מקבלת כקלט את N ורשימה של האינדקסים השחורים (שבסופה הזקיף -1). הפלט שלה הוא הודעה האם ניתן על-ידי הפעלה חוזרת ונשנית של האופרטור להפוך את משבצות השורה כולה לצבע לבן.

  3. חידה לחימום • נתון לוח בגודל N ,Nx3 אי-זוגי חיובי, אשר צבוע בשחור-לבן, כמו לוח שח, כך שהמשבצת המרכזית בשורה העליונה והמשבצת המרכזית בשורה התחתונה צבועות בשחור. • על המשבצת השחורה בשורה התחתונה מוצב כלי משחק. שני שחקנים מובילים את הכלי במעלה הלוח, כך שכל אחד בתורו מוביל את הכלי, לפי בחירתו, למשבצת שחורה הסמוכה אליו אלכסונית בשורה מעליו או למשבצת השחורה הנמצאת בעמודה שלו שתי שורות מעליו. • מנצח במשחק השחקן אשר מציב את הכלי על המשבצת השחורה בשורה העליונה. • נסחו אסטרטגיה אשר תוביל לניצחון במשחק. בניסוח האסטרטגיה יש לומר, בהינתן הערך N (מס' השורות בלוח), האם עדיף להיות השחקן הפותח או השחקן השני, וכיצד יש לפעול בכל מהלך, בתגובה למהלך היריב, כדי להבטיח ניצחון במשחק בכל מקרה. • כתבו תכנית מחשב בשפת C המקבלת כקלט את N, מחליטה האם להיות השחקן הפותח או השחקן השני, ומשחקת מול המשתמש כך שהיא תנצח תמיד.

  4. תזכורת - עצרת פונקציה מתמטית מוכרת היא פונקצית העצרת (factorial) המסומנת בסימן קריאה (!). בעבור מספר שלם חיובי n, הביטוי n! הוא מכפלת כל המספרים השלמים מ-1 עד n: n! = 1·2 · 3 · 4 · … · n לדוגמא: 5! = 1·2 · 3 · 4 ·5 = 120 7! = 1·2 · 3 · 4 ·5 ·6 ·7 = 5040 מקובל להגדיר 1 = 0!. לפונקצית העצרת שימושים רבים במתמטיקה, בעיקר בקומבינטוריקה (combinatorics). למשל, n! נותן לנו את מספר הדרכים השונות לסדר בשורה n עצמים שונים.

  5. תזכורת - עצרת ניתן לכתוב פונקציה איטרטיבית (המשתמשת בלולאה) המקבלת מספר שלם אי-שלילי n, ומחזירה את n! : ניתן לנצל את המבנה הרקורסיבי של הפונקציה, n! = n*(n-1)!, ולכתוב פונקציה רקורסיבית הפותרת את אותה הבעיה: int factorial (int n) { int i, product = 1; for (i=1; i<=n; i++) product *= i; return product; } int factorial (int n) { if (n == 0) return 1; else return factorial(n-1)*n; }

  6. צירופים • נתונה קבוצה של n איברים. לתת-קבוצה בעלת k איברים של קבוצה זו נקרא צירוף (combination) של k איברים מתוך n. • נסמן את מספר הצירופים של k איברים מתוך n על-ידי C(n,k). • לדוגמא: אם נתונה קבוצה בת 4 איברים {a,b,c,d}, אז: • יש ארבעה צירופים של איבר אחד מתוך 4: • {a}, {b}, {c}, {d} • על כן: C(4,1) = 4 • יש שישה צירופים של שני איברים מתוך 4: • {a,b}, {a,c}, {a,d}, {b,c}, {b,d}, {c,d} • על כן: C(4,2) = 6 • יש ארבעה צירופים של שלושה איברים מתוך 4: • {a,b,c}, {a,b,d}, {a,c,d}, {b,c,d} • על כן: C(4,3) = 4 • יש צירוף אחד של ארבעה איברים מתוך 4: • {a,b,c,d} • על כן: C(4,4) = 1

  7. צירופים • סימון מקובל נוסף למספר הצירופים של k איברים מתוך n, בנוסף לסימון C(n,k), הוא הסימון הבא: • לביטוי זה נהוג לקרוא 'n בְּחַר k' (n-choose-k), או 'n מעל k'. • קל לראות שמתקיימות הזהויות הבאות: • איך נחשב את מספר האפשרויות לבחור k איברים מתוך n? • יש לנו n אפשרויות לבחור את האיבר הראשון. • יש לנו n-1 אפשרויות לבחור את האיבר השני. • יש לנו n-2 אפשרויות לבחור את האיבר השלישי. • ... • יש לנו n-k+1 אפשרויות לבחור את האיבר ה-k-י. • קיבלנו, בינתיים, את המכפלה n*(n-1)*(n-2)*…(n-k+1). האם זו התשובה?

  8. צירופים • חשוב לזכור, כשאנחנו בוחרים תת-קבוצה בגודל k מתוך קבוצה בגודל n, שבקבוצות אין חשיבות לסדר. כלומר: קודם לבחור את a ואח"כ לבחור את b, אמור להיספר כאותו הצירוף כמו קודם לבחור את b ואח"כ לבחור את a. • מה זה אומר על ערכו של C(n,k)? • המכפלה n*(n-1)*(n-2)*…(n-k+1) נותנת לנו ביטוי גדול מדי, משום שבביטוי זה יש חשיבות לסדר (כלומר: צירופים זהים נספרים יותר מפעם אחת). • הפתרון הוא לחלק ביטוי זה במספר הסידורים האפשריים של k האיברים שנבחרו. קרי: לחלק ב-k!. • לכן, התשובה הסופית היא: • זה עולה בקנה אחד עם הדוגמא שראינו קודם, כשבחרנו צירופים של k איברים מתוך {a,b,c,d}:

  9. צירופים • ניתן לפתח את הביטוי C(n,k) באופן הבא: • קיבלנו ביטוי המתאר את n-בחר-k במונחים של פונקציית העצרת.

  10. צירופים • ניתן להשתמש בזהות על מנת לפתח פונקציה בשפת C המחשבת את ערכו של n-בחרk-: unsigned long choose (int n, int k) { return factorial(n) / (factorial(k) * factorial(n-k)); } • מכיוון שהגדרנו 0! = 1, נקבל כי: • קל לראות גם כי מתקיימת הזהות הבאה: • בנוסף, נקבע ש-C(n,k) = 0 עבור k > n:

  11. צירופים • האם ישנה דרך נוספת לחשב את ? • ביטוי זה מציין את מספר הדרכים לבחור k איברים מתוך n. • נסמן אחד מ-n האיברים שמתוכם עלינו לבחור, ונכנה אותו 'האיבר המיוחד'. • כשאנחנו בוחרים k איברים מתוך n, יש שתי אפשרויות: או שאנחנו מכלילים את ה'איבר המיוחד' בין k האיברים שאנחנו בוחרים, או שלא מכלילים אותו. • אם אנחנו לא מכלילים את ה'איבר המיוחד', אז עלינו לבחור k איברים מתוך n-1 איברים (כל איברי הקבוצה שאינם ה'איבר המיוחד'). מס' הצירופים לבחירת k איברים מתוך n-1 הוא: • אם אנחנו כן מכלילים את ה'איבר המיוחד', אז נותר לנו לבחור k-1 איברים מתוך n-1 איברים (כל איברי הקבוצה שאינם ה'איבר המיוחד'). מס' הצירופים לבחירת k-1 איברים מתוך n-1 הוא: • מכיוון שאלו שתי האפשרויות היחידות, נקבל את הזהות:

  12. צירופים • ניתן להשתמש בזהות על מנת לפתח את הפונקציה הרקורסיבית הבאה: unsigned long choose (int n, int k) { if (k > n) return 0; if (k == 0 || k == n) return 1; return (choose(n-1,k) + choose(n-1,k-1)); }

  13. משולש פסקל • נסדר את C(n,k) בצורת משולש. • ברור שכל הביטויים שעל שתי הצלעות הצדדיות של המשולש שווים כולם ל-1. • כמו כן, מתקיים C(n,1) = n לכל n. • לפי הזהות נובע שכל איבר במשולש שווה לסכום שני האיברים שמעליו. • המשולש שהתקבל נקרא "משולש פסקל", על שם המתמטיקאי הצרפתי מהמאה ה-17, בלייז פסקל (Blaise Pascal).

  14. משולש פסקל • פסקל גילה את "משולש פסקל" כשעסק בחישובים הסתברותיים שונים, והוכיח כי למשולש ישנן תכונות מתמטיות מעניינות רבות. • נצבע בשחור את המספרים האי-זוגיים שבמשולש פסקל. • קיבלנו את משולש סרפינסקי (Sierpinski’s Triangle) • נסתכל על ערכי המשולש כעל ספרות בינאריות (שחור = 1, לבן = 0). • נעיין במספרים הבינאריים שהתקבלו.

  15. משולש פסקל • אם נסתכל על כל שורה כעל מספר בינארי, נקבל את סדרת המספרים: • 1, 3, 5, 15, 17, 51, 85, 255, 257, 771, 1285, 3855, 4369, … • מספרים אלו מציינים אילו מצולעים משוכללים בעלי מס' אי-זוגי של צלעות ניתן לבנות בעזרת סרגל ומחוגה. • בנייה גיאומטרית בסרגל ובמחוגה נחקרה כבר בידי אוקלידס (Euclid) ושאר המתמטיקאים ביוון העתיקה.

  16. מיזוג נתונים לנו שני מערכים, arr1 ו-arr2, אשר שניהם ממוינים בסדר עולה. מעוניינים ליצור מערך שלישי arr3, שיכיל את כל האיברים שבשני המערכים הראשונים, כשהם ממוינים בסדר עולה. נציג אלגוריתם מיזוג הפותר את הבעיה: נציב שני מצביעים על תחילתו של כל אחד מהמערכים arr1 ו-arr2. נשווה את ערכיהם של האיברים בתאים שעליהם מורים המצביעים (התאים הראשונים בכל אחד מהמערכים). במקום הראשון במערך arr3 נשמור את האיבר שערכו הוא הנמוך מבין השניים, ונקדם את המצביע שהצביע על איבר זה אל התא הבא במערך. נחזור על הצעד לגבי הערכים החדשים של המצביעים. נמשיך באותו האופן עד שאחד המצביעים יגיע לסוף המערך. אז, כמובן, לא נקדם אותו יותר, ונעתיק ל-arr3 לפי הסדר את האיברים הנותרים במערך השני.

  17. מיזוג מהי סיבוכיות זמן הריצה של האלגוריתם? הצעד הבסיסי באלגוריתם המיזוג כולל, במקרה הגרוע ביותר (W.C), השוואה בין שני ערכים במערך, העתקת איבר למערך שלישי, ועדכון הערכים של אחד המצביעים. מספר הצעדים המבוצע הוא כאורכו של המערך הממוזג, ואם נסמן גודל זה ב-n, נקבל כי סיבוכיות זמן הריצה היא Θ(n).

  18. מיזוג

  19. מיון כיצד אפשר להשתמש באלגוריתם המיזוג שתיארנו, כדי למיין מערך A באורך n? אם נחלק את A לשני תת-מערכים שווים פחות או יותר בגודלם, ונמיין כל אחד מהם, נוכל לאחר מכן להשתמש באלגוריתם המיזוג שפיתחנו על מנת למזג שני חלקים אלה למערך ממוין. נשאלת השאלה, מהי דרך המיון שנשתמש בה כדי למיין את שני חלקי המערך A? אולי נשתמש, למשל, באחד האלגוריתמים למיון שהכרנו (כמו מיון בחירה, מיון בועות או מיון הכנסה)? ניתן לעשות זאת, אולם בכך לא נשיג שיפור ביעילות האלגוריתם, אשר תישאר ריבועית.

  20. מיון מיזוג המפתח לשיפור במקרה הזה הוא שימוש ברקורסיה. את המערך המקורי חילקנו לשני תת-מערכים שווים, פחות או יותר, בגודלם, ואנחנו מעוניינים למיין כל אחד מהם. את שני החצאים האלה של המערך המקורי, נוכל למיין רקורסיבית: נחלק כל אחד מחצאים אלה לשני חלקים (שגודל כל אחד מהם רבע מגודלו של המערך המקורי). נמיין שוב כל חלק בצורה רקורסיבית. נמזג את הרבעים הממוינים, ונקבל שני תת-מערכים ממוינים. בשלב כלשהו נגיע לתת-מערך בגודל 1. תת-מערך זה כבר ממוין, ולכן הרקורסיה תיעצר. שיטת מיון זו מכונה מיון מיזוג (Merge Sort).

  21. מיון מיזוג נכתוב את האלגוריתם: מיון-מיזוג(a,n) אם n = 1 אזי החזר a אחרת: הכנס את n/2 האיברים הראשונים של a לתוך מערך b הכנס את n/2 האיברים האחרונים של a לתוך מערך c מיון-מיזוג(b,n/2) מיון-מיזוג(c,n/2) מזג את שני המערכים b ו-c למערך a, והחזר אותו איזו נוסחת נסיגה מבטאת את זמן הריצה של האלגוריתם? T(n) = Θ(1) , n = 1 אם 2T(n/2) + Θ(n) , n > 1 אם

  22. מיון מיזוג 4 8 3 0 1 2 7 5

  23. מיון מיזוג 1 2 7 5 4 8 3 0

  24. מיון מיזוג 4 8 3 0 1 2 7 5

  25. מיון מיזוג 3 0 1 2 7 5 4 8

  26. מיון מיזוג 1 2 7 5 4 8 3 0

  27. מיון מיזוג 1 2 7 5 8 3 0 4

  28. מיון מיזוג 1 2 7 5 3 0 4 8

  29. מיון מיזוג 1 2 7 5 4 0 3 3 0 8

  30. מיון מיזוג 1 2 7 5 4 8 0 3 3 0

  31. מיון מיזוג 1 2 7 5 4 8 0 3 0 3

  32. מיון מיזוג 1 2 7 5 4 8 0 3 3 0

  33. מיון מיזוג 1 2 7 5 4 8 0 3

  34. מיון מיזוג 1 2 7 5 4 8 0 3

  35. מיון מיזוג 0 0 0 3 3 1 2 7 5 4 8 3

  36. מיון מיזוג 0 3 0 0 3 3 1 2 7 5 4 8

  37. מיון מיזוג 0 3 0 0 4 3 3 1 2 7 5 8

  38. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 7 5

  39. מיון מיזוג 0 3 0 0 4 3 3 8 7 5 1 2

  40. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 7 5

  41. מיון מיזוג 0 3 0 0 4 3 3 8 2 7 5 1

  42. מיון מיזוג 0 3 0 0 4 3 3 8 7 5 1 2

  43. מיון מיזוג 0 3 0 0 4 3 3 8 1 7 5 2

  44. מיון מיזוג 0 0 3 3 0 3 4 0 0 3 8 3 1 2 7 5

  45. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 5 7

  46. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 7 5

  47. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 5 7

  48. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 5 7

  49. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 5 7

  50. מיון מיזוג 0 3 0 0 4 3 3 8 1 2 5 7

More Related