שאלת מבחן במבני נתונים - אוניברסיטת בר-אילן 2026 - אלגוריתמים חמדניים

שאלה 2:
נתונה מחרוזת
מעל האלפבית נסמן ב- את שכיחות הופעתה של האות במחרוזת .

סעיף א': (5 נקודות)
נניח כי
היא חזקה של 2.
הראו כי קיימת בחירה של שכיחויות לאותיות כך שהעץ המתאים לקוד התחיליות האופטימלי הוא עץ בינארי שלם, כלומר כל העלים בעץ באותו עומק.


סעיף ב': (5 נקודות)
נניח כי מספר האותיות הוא
.
להלן נתון מבנה של עץ בינארי מלא:

[איור של עץ הושמט]


הציעו רשימת שכיחויות
עבור האותיות כך שעץ זה יכול להיות העץ המייצג קוד תחיליות אופטימלי עבור שכיחויות אלו. נמקו בקצרה את בחירתכם.
כתבו את השכיחויות על העץ עצמו.


סעיף ג': (15 נקודות)
הוכיחו כי לכל עץ בינארי מלא עם
עלים קיימת רשימת שכיחויות שעבורה הוא עץ קוד תחיליות אופטימלי.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד ב2026סמסטר א
אלגוריתמים חמדנייםעצים בינארייםהוכחת נכונותאינדוקציה
הוכיחו את הטענה באינדוקציה על מספר העלים. בצעד האינדוקציה, מצאו זוג עלים-אחים, החליפו אותם באביהם כדי לקבל עץ קטן יותר, והשתמשו בהנחת האינדוקציה.
### סעיף א'
כדי להראות שקיים קוד תחיליות אופטימלי המיוצג על ידי עץ בינארי שלם, עלינו למצוא קבוצת שכיחויות $f_1,

obreak\dots, f_n$ שעבורה אלגוריתם הופמן יבנה עץ כזה. עץ בינארי שלם הוא עץ שבו כל העלים נמצאים באותו עומק.


נניח ש-
עבור $k
obreak\ge 1
f_i = 1i = 1,
obreak\dots, n$.


ננתח את פעולת אלגוריתם הופמן על שכיחויות אלו:


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

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

3. המשך התהליך: התהליך ימשיך באופן דומה. בכל שלב
(כאשר ), האלגוריתם ימזג זוגות של צמתים שכולם בעלי משקל , וייצור צמתים חדשים במשקל .

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

לדוגמה, עבור
, עם שכיחויות {1, 1, 1, 1}:
- מיזוג 1 ו-1 נותן עץ עם שורש 2. נחזור על כך. נקבל שני עצים עם שורש 2.

- מיזוג שני השורשים במשקל 2 נותן עץ עם שורש 4.

העץ הסופי הוא עץ בינארי שלם שבו כל 4 העלים בעומק 2.


לכן, קיימת בחירת שכיחויות (למשל, שכיחויות שוות) שעבורה העץ האופטימלי הוא עץ בינארי שלם.


### סעיף ב'
כדי שעץ נתון יהיה עץ קוד תחיליות אופטימלי (עץ הופמן) עבור סט שכיחויות מסוים, תנאי הכרחי ומספיק הוא שתכונת האחים תתקיים: לכל צומת פנימי
, כל עלה בתת-העץ של חייב להיות בעל שכיחות קטנה או שווה לשכיחות של כל עלה שאינו נמצא בתת-העץ של . דרך פשוטה יותר להבטיח זאת היא להקצות שכיחויות כך שעלים עמוקים יותר מקבלים שכיחויות נמוכות יותר.

נניח שהעץ הנתון הוא בעל המבנה הבא (שמוצג באיור חסר):
- עלים
בעומק 3.
- עלים
בעומק 2.
- עלים
בעומק 2.

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


- לעלים בעומק 3:
.
- לעלים בעומק 2:
.

רשימת השכיחויות המלאה היא:
.

נימוק: סדר השכיחויות מהקטן לגדול הוא {1, 1, 2, 3, 4, 5, 5}. סדר העומקים של העלים מהגדול לקטן הוא {3, 3, 3, 2, 2, 2, 2}. מכיוון שהעלים עם השכיחויות הקטנות ביותר נמצאים בעומקים הגדולים ביותר, תכונת האופטימליות של קוד הופמן נשמרת. אלגוריתם הופמן, כאשר יופעל על שכיחויות אלו, יבצע מיזוגים באופן הבא (אחת האפשרויות):
1. מיזוג {1, 1}
צומת במשקל 2.
2. מיזוג {2, 2}
צומת במשקל 4 (הצומת הקודם והעלה 2).
3. מיזוג {3, 4}
צומת במשקל 7.
4. מיזוג {5, 5}
צומת במשקל 10.
5. מיזוג {4, 7}
צומת במשקל 11.
6. מיזוג {10, 11}
שורש במשקל 21.
ניתן לבדוק שמבנה זה תואם את המבנה שהנחנו, ולכן השכיחויות שהצענו תקפות.


### סעיף ג'
טענה: לכל עץ בינארי מלא
עם עלים, קיימת רשימת שכיחויות $f_1,
obreak\dots, f_n
T$ הוא עץ קוד תחיליות אופטימלי.

**הוכחה באינדוקציה על מספר העלים
:**

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

הנחת האינדוקציה: נניח שהטענה נכונה לכל עץ בינארי מלא עם
עלים.

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

כעת, נבנה עץ חדש
מ- על ידי הסרת העלים ו- והפיכת אביהם לעלה. העץ הוא עץ בינארי מלא עם עלים. לפי הנחת האינדוקציה, קיימת עבור רשימת שכיחויות, $f'_1,
obreak\dots, f'_{n-1}
T'f'_{(1)} \le f'_{(2)} \le
obreak\dots \le f'_{(n-1)}$.


השכיחות של העלה
ב- היא אחת מהשכיחויות ברשימה זו, נסמנה .

כעת נבנה רשימת שכיחויות $F = \{f_1,
obreak\dots, f_n\}
Tf_u, f_v > 0f_u + f_v = f'_pFF' \setminus \{f'_p\}F = (F' \setminus \{f'_p\}) \cup \{f_u, f_v\}$.

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

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

לכן, בנינו רשימת שכיחויות
שעבורה העץ הוא עץ קוד תחיליות אופטימלי. מכוח האינדוקציה, הטענה נכונה לכל .