Remove ads
מבנה נתונים מופשט בעל תכונה של שמירת איזון העץ. מוויקיפדיה, האנציקלופדיה החופשית
במדעי המחשב, עץ AVL הוא מבנה נתונים מסוג עץ חיפוש בינארי מאוזן, שבו הפרש גובהם של שני תתי-העצים של הבנים של כל צומת הוא לכל היותר 1. תכונה זו מבטיחה שניתן יהיה לחפש בעץ, להכניס ולהוציא ממנו נתונים בסיבוכיות של במקרה הגרוע ביותר (כאשר הוא מספר הצמתים בעץ).
עץ AVL נקרא כך על שם ראשי התיבות של ממציאיו, גאורגי אדלסון-ולסקי (Adelson-Velskii) ויבגני לנדיס (Landis, שהציגו אותו במאמר משנת 1962. היה זה עץ החיפוש הראשון שהבטיח איזון בעלות של .
כל צומת בעץ שומר, פרט למידע הסטנדרטי של עץ חיפוש, גם מאפיין נוסף הנקרא "גורם האיזון" (Balance factor). מאפיין זה הוא ההפרש בין גובהו של תת-העץ השמאלי של הצומת וגובה תת-העץ הימני של הצומת. עץ AVL מאופיין בכך שגורם האיזון בכל צומת הוא תמיד 1, 0 או 1-, ופעולות הוספה והסרה שומרות על תכונה זו. תכונה זו מבטיחה כי העץ יהיה מאוזן בקירוב - ניתן להראות[1] כי אם בעץ AVL יש איברים אז עומקו קטן מ- (העומק המינימלי בעץ חיפוש מאוזן לגמרי הוא , עץ AVL יכול להיות בעומק גדול יותר).
החיפוש בעץ AVL הוא רקורסיבי וזהה לחיפוש בעץ חיפוש בינארי. הרקורסיה מתחילה משורש העץ. בודקים עבור הצומת הנוכחי:
כיוון שעץ AVL הוא מאוזן בקירוב (כמפורט לעיל), פעולת החיפוש תתבצע בסיבוכיות זמן כי פעולת החיפוש מתחילה משורש העץ ומשם יכולה להגיע, במקרה הגרוע, עד לעלה העמוק ביותר.
פעולת החיפוש לא משנה את המבנה של העץ ולכן העץ נשמר כעץ חיפוש בינארי ומאוזן.
כדי לבצע הכנסה ומחיקה מעץ AVL, משתמשים תחילה בפעולה הרצויה כאילו מדובר בעץ חיפוש בינארי פשוט.
הבעיה שנוצרת היא, שבעקבות ההכנסה או ההוצאה מהעץ, ייתכן שגורם האיזון יעלה ל-2 או ירד ל-2-. כדי לפתור את הבעיה, משתמשים בטכניקה הנקראת גלגול, בעזרתה משנים את מבנה העץ כדי לתקן איזון של תת-עץ המתחיל בצומת שבו יש חריגה בגורם האיזון, וזאת מבלי להפר את הסדר של העץ (המאפשר חיפוש בינארי עליו).
ישנם ארבעה סוגים של גלגולים: RR, LL, RL ו-LR, כאשר על ידי ארבעתם ניתן לטפל בכל צומת שגורם האיזון שלו הופר ושווה ל-2 או 2-, בהנחה שהוא תקין בשני עצי הבנים שלו. הבחירה באיזה גלגול להשתמש נעשית על פי הכללים הבאים:
הגלגולים נעשים בדרך שמתוארת בציור שמופיע בצד. ניתן לממש את כל אחד מארבעת הגלגולים בעזרת שתי פעולות בסיסיות (R ו-L), כאשר הגלגול כולל פעולת R/L אחת שמבוצעת על אחד מהבנים של הצומת, ופעולת R/L שנייה על הצומת עצמו. כל סוגי הגלגולים הם בזמן קבוע של
כדי להכניס צומת חדש לעץ, מתחילים במציאת המקום המתאים להכנסה באותה הדרך שבה מכניסים לעץ חיפוש בינארי. מתחילים משורש העץ ובודקים באופן רקורסיבי:
לאחר שהצומת הוכנס לעץ, צריך לבדוק את המסלול מהצומת החדש כלפי מעלה עד לשורש, ואם קיים צומת שגורם האיזון שלו הופר - לבצע גלגול עבור צומת זה. פעולת הגלגול מחזירה את הגובה של תת-העץ שעל שורשו היא פועלת לגובה שהיה לפני ההוספה, ולכן העץ נשאר מאוזן לאחר גלגול זה.
פעולת ההכנסה מבוצעת בסיבוכיות זמן כי פעולת ההכנסה המקורית מבוצעת בסיבוכיות זמן , יש לכל היותר צמתים שצריך לעדכן את גורם האיזון שלהם, ולא יותר מגלגול אחד[2], שמשנה רק מספר קבוע של צמתים.
כאשר רוצים להוציא צומת מתוך עץ AVL, צריך לבצע שלושה תהליכים עיקריים - מציאת הצומת שצריך להוציא, הוצאת הצומת תוך שמירה על תכונת עץ החיפוש ואיזון העץ לאחר ההוצאה.
מציאת הצומת נעשית באותה הדרך שנעשית פעולת החיפוש וניתן לדלג על מציאת הצומת במקרים שבהם נתון מראש הצומת שדורש מחיקה.
בהינתן צומת שרוצים להוציא מתוך העץ אך להשאיר את העץ כעץ AVL, מבצעים את הפעולות הבאות:
כיוון שהוצאת הצומת יכולה לגרום לכך שהעץ כבר אינו מאוזן, עוברים על המסלול מהצומת שנמחק עד לשורש העץ וכל פעם שקיים צומת שגורם האיזון שלו הופר, מבצעים את הגלגול ששייך לאותו הצומת.
פעולת ההוצאה, כמו פעולת ההכנסה, מבוצעת בסיבוכיות זמן .
לפעמים קיים צורך לעבור על כל הנתונים שנמצאים בעץ ולבצע פעולה, למשל עדכון בכל הנתונים, שמירה למבנה ליניארי (כמו קובץ) או חיפוש נתון שלא ידוע מה המפתח שלו. קיימות מספר דרכים לעבור על כל הנתונים, כאשר הכלל המנחה שלהם הוא שעבור כל צומת בעץ החל מהשורש צריך לבצע פעולה בנתון שלו ולסרוק גם את הצמתים הבנים. כדי לקבל את הנתונים לפי סדר יש לעבור על עץ החל מהשורש, בצורה רקורסיבית בשיטת סדר תּוֹכִי (in-order traversal). עבור הצומת הנוכחי המעבר מתבצע באופן הבא:
סריקה כזו של העץ תעבור על כל הצמתים בעץ לפי סדר מהקטן לגדול, בזמן ריצה .
בנוסף קיימות 2 סריקות נוספות: תחילית (pre-order) וסופית (post-order).
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.