עץ 2-3

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

במדעי המחשב, עץ 2-3אנגלית: 2-3 tree) הינו מבנה נתונים מסוג עץ חיפוש מאוזן. בעץ זה:

  1. כל צומת עם בנים (צומת פנימי) מכיל מפתח אחד ושני בנים (צומת-2, איור 1), או שני מפתחות ושלושה בנים (צומת-3, איור 2). בנוסף,
  2. כל הצמתים ללא בנים (צמתים חיצוניים או עלים), הינם באותו העומק (ראה איור 3).

כמו כן, עץ ריק ועץ עם עלה אחד הם עצי 2-3.

איור 3 - דוגמה לעץ 2-3

לעץ 2-3 מספר גרסאות בעלות תכונות שונות מעט, אשר נבחרות על פי התאמתן לשימוש מסוים[1]. בגרסה המתוארת כאן, הרשומות (המכילות מפתח וערך הקשור אליו) נמצאות רק בעלים, בעוד הצמתים הפנימיים מכילים מידע לארגון בלבד. בכל צומת פנימי,

  • הערך-x מכיל תמיד את ההמפתח המקסימלי המצוי בתת-העץ השמאלי המחובר ל-l.
  • תת-העץ המרכזי המחובר ל-m מכיל מפתחות הגדולים מ-x.
  • בצומת-3, הערך y מכיל את המפתח המקסימלי המצוי בתת-העץ המרכזי המחובר ל-m.
  • בצומת-3, תת-העץ הימני המחובר ל-r מכיל מפתחות הגדולים מ-y.

בעץ 2-3 עם h רמות, יש בין  2^{h-1} ל-  3^{h-1} עלים (כאשר העץ מורכב מצמתים מסוג צומת-2 בלבד, או צומת-3 בלבד, בהתאמה). במילים אחרות, על מנת ליצג n רשומות, יש צורך בעץ עם לפחות 1+\log_{3} n רמות, אך לא יותר מ- 1+\log_{2} n רמות. משמע, כל המסלולים בעץ הם באורך O(\log n).

מבנהו של עץ 2-3 מבטיח חיפוש, הכנסה, והוצאת מפתח (המיצג רשומה) בסיבוכיות O(\log n) במקרה הגרוע ביותר, כאשר n הוא מספר המפתחות (רשומות) בעץ.

עץ 2-3 פותח על ידי ג'ון הופקרופט (John Hopcroft) בשנת 1970[2][3], ושייך למשפחה של עצי חיפוש המאזנים את עצמם (Self-balancing search tree). בעצים מסוג זה פעולות הכנסת מפתח והוצאת מפתח עשויות לגרום שינויים במבנה העץ, לשם שימור איזונו. דוגמאות נוספות לעצי חיפוש המאזנים את עצמם הן: עץ AVL, עץ אדום שחור, עץ 2-3-4, ועץ B.

חיפוש[עריכת קוד מקור | עריכה]

איור 4 - חיפוש מוצלח אחר המפתח 5 (בירוק), חיפוש כושל אחר המפתח 12 (באדום).

חיפוש רשומה שלה מפתח k מתקדם במורד העץ כאשר בכל צומת:

  1. אם k \leq x ממשיכים לתת-העץ השמאלי.
  2. אם k > x והצומת הוא צומת-2, ממשיכים בתת-העץ האמצעי.
  3. אם k > x והצומת הוא צומת-3, אזי אם k \leq y ממשיכים בתת-העץ האמצעי, אחרת ממשיכים בתת-העץ הימני.

בסופו של דבר מגיעים לעלה. אם הרשומה נמצאת בעץ, אזי העלה יכיל את המפתח k ואת הרשומה השייכת לו (ראה איור 4). אם רוצים רק לוודא את הימצאות הרשומה, ולא לגשת אליה, אפשר לעצור בכול שלב בו k=x או k=y.

הכנסה[עריכת קוד מקור | עריכה]

אם העץ הוא ריק, מוסיפים את הרשומה בעלה, במקומו של השורש. אם העץ מכיל עלה אחד, מוסיפים צומת-2 כשורש, ואת שני העלים כבניו (ראה איור 5).

בעץ עם צמתים פנימיים, הכנסת רשומה חדשה עם מפתח k מתקדמת כמו חיפוש, עד אשר מגיעים ל-a, הצומת הפנימי האחרון לפני העלים.

אם צומת a הוא צומת-2, מוסיפים לו עוד בן (עלה) והופכים אותו לצומת-3, כאשר העלים ממוינים והערכים x,y מעודכנים כנדרש. אם k הוא הערך הגדול מבין שלושת הבנים, יש לעדכן גם את הערכים x או y של האבות של הצומת a (ראה איור 6).

אם צומת a הוא צומת-3, מרחיבים אותו זמנית לצומת-4 (האסור בעץ 2-3), ומוסיפים לו עלה במקום המתאים. על מנת לשמור על מבנה העץ, מפצלים את צומת-4 שנוצר לשני צמתים-2, a ו-b. את זוג המפתחות הנמוכים מציבים בצומת השמאלי a, ואת זוג המפתחות הגבוהים מציבים בצומת הימני b. כעת מוסיפים את הצומת החדש שנוסף (b) לאב p של צומת a המקורי. תהליך זה זהה להוספת עלה לצומת פנימי - אם צומת p הוא צומת-2 הוא יהפוך לצומת-3, ואם הוא צומת-3 הוא יעבור הרחבה לצומת-4 ופיצול. כך ממשיכים בסדרה של הרחבות ופיצולים עד אשר מגיעים לצומת-2 או מפצלים את השורש (ראה איור 7).

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

הוצאה[עריכת קוד מקור | עריכה]

הוצאת רשומה עם מפתח k מתקדמת כמו חיפוש, עד אשר מגיעים ל-a, הצומת הפנימי האחרון לפני העלים.

אם צומת a הוא צומת-3, מסירים את הבן עם מפתח k, והופכים אותו לצומת-2. אם הבן שהוסר היה הגדול משלושת הבנים, יש לעדכן גם את הערכים x או y של האבות של הצומת a (ראה איור 8).

אם צומת a הוא צומת-2, מסירים את הבן עם מפתח k, והופכים אותו זמנית לצומת-1, האסור בעץ 2-3. על מנת לשמר את מבנה העץ מבצעים את אחת מפעולות המיזוג הבאות:

  1. אם לצומת a יש אח b מימין או משמאל שלו 3 בנים, מעבירים את אחד הבנים של b לצומת a, ומעדכנים את הערכים x או y של האבות של הצומת a במידת הצורך.
  2. אם לצומת a יש רק אחים מסוג צומת-2, אזי מסירים את הבן היחיד של a, מעבירים אותו לאחד מהאחים של a, ומוחקים את צומת a מהאב שלו p.
  3. אם האב p נותר צומת-2, התהליך הסתיים. אם האב p נותר צומת-1 (האסור בעץ 2-3), חוזרים על תהליך המיזוג כפי שתואר לעיל (ראה איור 9).

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

יצוג כעץ בינארי[עריכת קוד מקור | עריכה]

איור 10 - המרת צומת-3 בזוג צמתים בינאריים כאשר הקשת האופקית מסומנת באדום
איור 11 - יצוג בינארי של העץ באיור 3

עץ 2-3 ניתן לייצג גם באמצעות צמתים מסוג צומת-2 בלבד, כאשר מוסיפים לכול קשת עוד סיבית אשר מסמנת האם הקשת היא קשת אופקית או אנכית. כפי שניתן לראות באיור 10, ניתן לפצל כל צומת-3 לשני צמתים מסוג צומת 2, המחוברים בקשת אופקית, אותה נהוג לסמן באדום. שני היצוגים האפשריים הם שקולים.

העץ הבינארי המתקבל מהמרת עץ 2-3 באופן זה (ראה איור 11), הוא עץ מאוזן, במובן הבא:

  • העץ הוא "מאוזן שחור", כלומר כל המסלולים בין השורש לעלים עוברים דרך אותו מספר קשתות שחורות. תכונה זו מתקיימת מכיוון שהקשתות השחורות הן הקשתות המקוריות של עץ 2-3, שהוא מאוזן באופן מושלם.
  • המסלול הארוך ביותר מהשורש לעלה כלשהו, ארוך לכול היותר פי שניים מהמסלול הקצר ביותר מהשורש לעלה כלשהו. מצב זה עשוי להתקבל כאשר בעץ 2-3 עם שורש מסוג צומת-3, תת-העץ הימני מורכב רק מצמתים מסוג צומת-3, בעוד תת-העץ השמאלי מורכב מצמתים מסוג צומת-2. מסלול אחד לפחות בתת-העץ הימני יהיה מורכב מקשת אדומה ושחורה לסרוגין, בעוד בתת-העץ השמאלי כל המסלולים שחורים.

מתברר[2] שפעולות האיזון המתבצעות בעץ 2-3 בעת הכנסה והוצאה של מפתח (הרחבה ופיצול, מחיקה ומיזוג), מתבטאות ביצוג כעץ בינארי המתקבל לאחר המרה, כפעולות דומות לפעולות האיזון בעץ AVL (סיבוב העץ).

מכיוון שכך, גם ביצוג כעץ בינארי של עץ 2-3 פעולות החיפוש, ההכנסה, וההוצאה של מפתח מתבצעות בסיבוכיות O(\log n) במקרה הגרוע ביותר.

היצוג כעץ בינארי של עץ 2-3 היוה את הבסיס לפיתוח עץ אדום שחור, שהוא עץ החיפוש הבינארי המאוזן הפופולרי ביותר במימושים מעשיים.

הרחבות וגרסאות נוספות[עריכת קוד מקור | עריכה]

כאמור לעץ 2-3 מספר אפשרויות ליחוס הרשומות לצמתים, הנבחרות לפי התאמתן לשימוש מסוים[1]. לדוגמה, בגרסה אחת של עץ 2-3 הרשומות נשמרות גם בצמתים פנימיים וגם בעלים[4], ללא שיכפול. באופן זה מספר הצמתים בעץ זהה למספר הרשומות, בניגוד לגרסה המתוארת לעיל, בה נשמרות הרשומות רק בעלים. למרות הבדלים אלה, פעולות האיזון בהכנסת מפתח (הרחבה ופיצול) והוצאת מפתח (מחיקה ומיזוג) זהות למעשה בכול הגרסאות.

עץ-B הוא הרחבה של עץ 2-3[5] - עץ 2-3 ידוע גם בשם "עץ-B מדרגה 3".

לקריאה נוספת[עריכת קוד מקור | עריכה]

קישורים חיצוניים[עריכת קוד מקור | עריכה]

הערות שוליים[עריכת קוד מקור | עריכה]

  1. ^ 1.0 1.1 Mark R. Brown and Robert E. Tarjan, Design and Analysis of a Data Structure for Representing Sorted Lists, SIAM J. Comput., 9(3), pp. 594–614, 1979.
  2. ^ 2.0 2.1 Knuth, Donald. The Art of Computer Programming, Volume 3: Sorting and Searching, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89685-0. Page 476 of section 6.2.3.
  3. ^ Alfred V. Aho, J.E. Hopcroft, Jeffrey D. Ullman, The Design and Analysis of Computer Algorithms, Addison-Wesley Series in Computer Science and Information Processing (1974).
  4. ^ Robert Sedgewick, Kevin Wayne, Algorithms, 4th ed., Addison-Wesley (2011). Chapter 3.3.
  5. ^ Douglas Comer, The Ubiquitous B-Tree, Computing Surveys, Vol ll, No 2, June 1979. pdf