מבני נתונים ואלגוריתמים - מחברת קורס/שיעורי בית 9/תשובות

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

1[עריכה]

נתבונן בפסוודו-קוד של אלגוריתם Kruskal. נשים לב ש7 ממיינת את הקשתות לפי עלותן. במקרה זה, עפ"י נתוני השאלה, נוכל למיין את הקשתות בזמן לינארי ע"י שימוש במיון ספירה. מעבר לכך לא נשנה כלום.

כעת אם נסתכל באלגוריתם, נוכל לראות בנקל שהסיבוכיות היא רק במקרה הגרוע.

2[עריכה]

ראשית נאפיין את בעזרת התנאי שניתן על .



משפט:

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


נסמן כ את מחיר כל קשת (כלומר Edge-Costs[e]), ונסמן כאת סך משקל הקשתות, .


הוכחה: הקבוצה , היא, עפ"י ההגדרה, הקבוצה המביאה למינימום את


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

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

נסמן כ את מחיר הקשת היקרה ביותר פלוס 1 (כלומר ),‏ ונסמן לכל קשת ,‏ .



משפט:

אם נבנה טבלה Edge-Costs'כל שלכל קשת ,‏ Edge-Costs'[e] , ונריץ אלגוריתם עץ פורש מינימום עם Edge-Costs', אז קבוצת הקשתות שתוחזר תהווה קשתות לעץ פורש מקסימום עם Edge-Costs.



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





נוכל, לכן, לפתור את הבעיה בשלבים הבאים:

  1. נבנה את טבלת העלויות Edge-Costs'(בסיבוכיות ).
  2. נריץ את אלגוריתם Prim עם Edge-Costs' (בסיבוכיות ).
  3. נמצא את הקשתות שלא הוחזרו מאלגוריתם Prim (בסיכוכיות ).

הסיבוכיות הכוללת היא .

3[עריכה]

סדר ההדפסות[עריכה]

  • תחילה יודפס 1 כמובן.
  • באיטרציה הראשונה של 8-14, התור יכיל את 1.‏ 10-14 ידפיסו את 2 ו6 ויכניסו אותם לתור (בסדר הזה).
  • באיטרציה השניה, 2 יהיה בראש התור. 3 יודפס ויוכנס לתור.
  • באיטרציה השלישית, 6 יהיה בראש התור. 5 ו7 יודפסו ויוכנסו לתור (בסדר הזה). כעת התור יכיל את 3, 5, ו7 (3 בראש התור)
  • נמשיך כך הלאה.

הצמתים יודפסו בסדר הבא (משמאל לימין): .

ניתוח זמן הריצה[עריכה]

  • 1-2 ו5-7 הן
  • 3-4 הן .
  • הלולאה 8-14 מתבצעת בדיוק פעם אחת עבור כל צומת. בפרט, הבדיקה ב8 והפעולה ב9 עולות .
  • באופן דומה, הלולאה 10-14 מתבצעת בדיוק פעם אחת עבור כל זוג כך ש. הלולאה תורמת לכן .


שימו לב:

חשוב להבין שלמרות שהלולאה 10-14 נמצאת בתוך הלולאה 8-14, זמן הריצה של 10-14 אינו המכפלה .

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

הסיבוכיות, לכן, היא .


4[עריכה]

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

  • 1-2 ו5-7 הן
  • 3-4 הן .
  • הלולאה 8-14 מתבצעת בדיוק פעם אחת עבור כל צומת ב. בפרט, הבדיקה ב8 והפעולה ב9 עולות .
  • באופן דומה, הלולאה 10-14 מתבצעת בדיוק פעם אחת עבור כל זוג כך ש. הלולאה תורמת לכן .

הסיבוכיות, לכן, היא .

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


הכרח[עריכה]

הנה משפט עזר בו נשתמש:


משפט:

לכל ,‏


הוכחה: נשתמש בכללי גבולות וסדרי גדילה:






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

רכיב קשירות קטן.
רכיב קשירות קטן.

מספר הקשתות בגרף הוא



הסיבוכיות היא רק , וקל לראות שביטוי זה אינו .

התכנות[עריכה]

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

רכיב קשירות קטן.
רכיב קשירות קטן.


5[עריכה]

הדפסה לפי הסדר[עריכה]

הטענה איננה נכונה. קל למצוא דוגמאות נגדיות.



דוגמה:

נניח שהגרף הוא המתואר בתרשים הבא.

בעיית החיפוש הרוחבי.
בעיית החיפוש הרוחבי.

בגרף זה, סדר ההדפסות יכול להיות (משמאל לימין): .


עכשיו תורכם:

וודא שהנך מסוגל להראות סידרה אפשרית של תוצאות Delete שיביאו לתוצאה האמורה.


הדפסת כל הצמתים פעם יחידה[עריכה]

הטענה נכונה.


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

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

(בסיס האינדוקציה) עבור הטענה בוודאי נכונה. יש רק צומת אחד שמרחקו מ הוא 0, עצמו, ו מודפס ב5 ומוכנס לשק ב7.

(מעבר האינדוקציה) נניח שהטענה נכונה לכל צומת שמרחקו מ הוא לכל היותר (לא כולל) . נתבונן כעת בצומת כלשהו שמרחקו מ הוא . אם כך, בהכרח קיים צומת כך שיש מסלול מ ל באורך , ו שכן של . מהנחת האינדוקציה, מתישהו יודפס ויוכנס לשק. שורה 9, לכן, מבטיחה גם ש מתשיהו יוצא מהשק. הלולאה 10-14 עוברת על כל שכני , ובפרט . האפשרות היחידה לפיה 12 לא תדפיס את היא ש11 נכשלה. אם 11 נכשלה, אבל, אז בהכרח כבר הודפסה והוכנסה לתור (רק שורה 13 יכולה לקבוע את הערך בVisited לTrue). לכן, בכל מקרה, בהכרח מודפסת ומוכנסת לתור.

6[עריכה]

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

נאמר שצביעה היא חוקית אם:

  • צבוע שחור.
  • אין שני צמתים שביניהם קשת הצבועים באותו צבע.

להלן אלגוריתם הבודק האם לגרף קיימת צביעה חוקית.

Legal-Coloring(G, s)
1	q = Make-Queue()

2	Color = Make-Array( |V| )

3	for u in V
4		Color[u] = Nil

5	Color[s] = Black
6	Enqueue(q, s)

7	while not Empty(q)
8		u = Dequeue(q)
	
9		For every neighbor v of u
10			if Color[v] == Nil
11				Color[v] = (Color[u] == Black)? Red: Black
12				Enqueue(q, v)
13			else if Color[u] == color[v]
14				return False

15	return True



משפט:

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


הוכחה: ההוכחה היא באינדוקציה על האיטרציה של הלולאה 9-14.

(בסיס האינדוקציה) בתחילת האיטרציה הראשונה, רק קיבל צבע (שחור). על לקבל את הצבע שחור בצביעה חוקית, ו אכן מקבל את הצבע שחור בשורה 5.

(מעבר האינדוקציה) נניח שהטענה נכונה עד (לא כולל) לאיטרציה ה. באיטרציה זו מוצא מהתור בשורה 8. מכאן ברור שהוא קיבל את צבעו לפני איטרציה זו, ומהנחת האינדוקציה - צבעו הוא זה שבו הוא חייב להיות צבוע בצביעה חוקית. נתבונן כעת בצומת . הצומת חייב לקבל את צבעו ב11, כאשר הוא מקבל צבע הפוך לצבעו של . אבל היות שיש קשת בין ל, בהכרח חייב לקבל את הצבע ההפוך לצבעו של , ואכן שורה 11 עושה בדיוק זאת.

כעת נוכיח 14 מחזירה False - בהכרח אין צביעה חוקית.


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

כעת נוכיח שאם 16 מחזירה True - בהכרח יש צביעה חוקית.


הוכחה: נניח בשלילה ש16 החזירה True אך הצביעה אינה חוקית. הצומת בוודאי צבוע שחור בסוף הריצה, ולכן חייבים להיות שני צמתים, ו, הצבועים באותו צבע למרות שיש קשת המחברת ביניהם. אחד משני הצמתים קיבל את צבעו לאחר השני, נניח שמדובר ב. נשים לב ש9 היתה עוברת גם על , ו13 היתה מזהה שהם צבועים באותו צבע, ולכן בהכרח 14 היתה מחזירה False. לא ייתכן, על כן, ש16 החזירה True.


עכשיו תורכם:

האם האלגוריתם היה עובד לו היינו משתמשים בשק מהשאלה "חיפוש רוחבי" עם שק במקום תור? (בין הפותרים נכון יוגרל שק).