לדלג לתוכן

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

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


נוכיח שאם ו באותו רכיב קשירות, אז Find-Set(u) == Find-Set(v).


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

(בסיס האינדוקציה) אם המרחק הוא 0, אז מדובר באותו צומת. ברור שיתקיים Find-Set(u) == Find-Set(u).

(מעבר האינדוקציה) נניח שהטענה נכונה עבור שני צמתים שמרחקם הוא לכל היותר (לא כולל) , ונתבונן בשני צמתים, ו שמרחקם בדיוק . נניח ששכנו של במסלול הוא . מהנחת האינדוקציה, בסיום הריצה, Find-Set(v) == Find-Set(w). מצד שני, היות שיש קשת בין ו, האלגוריתם יאחד אותם (ע"י קריאה לUnion). לכן בהכרח בסיום הריצה, Find-Set(u) == Find-Set(w). משתי הנקודות הללו נובע כי Find-Set(u) == Find-Set(v).

נוכיח שאם Find-Set(u) == Find-Set(v), אז ו באותו רכיב קשירות.


הוכחה: ההוכחה כמעט זהה להוכחה הקודמת. האינדוקציה תהיה על מספר פעולת הUnion הראשונה שלאחריה התקיים Find-Set(u) == Find-Set(v) לראשונה.

מהתבוננות בConnected-Components, ברור ש6 מתבצעת פעם אחת לכל קשת. מכאן נקבל שמספר הקריאות לFind-Set הוא .

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

משפט:

אם קשיר וחסר מעגלים, אז .


הוכחה: הוכחנו זאת כבר בהרצאה.



משפט:

אם חסר מעגלים, ו, אז קשיר.



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




משפט:

אם קשיר, ו, אז חסר מעגלים.



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

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



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

שימוש בקשת הקלה ביותר בגרף.
שימוש בקשת הקלה ביותר בגרף.

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


תשובה שגויה ע"י שימוש באלגוריתם Kruskal

[עריכה]

כדאי לדעת:

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

להלן הוכחה שגויה לקיום עפ"מ יחידי:

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

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

תשובה שגויה ע"י שימוש לא נכון באינדוקציה

[עריכה]

להלן הוכחה שגויה באינדוקציה:


הוכחה: האינדוקציה היא על מספר הצמתים, .

(בסיס האינדוקציה) כאשר אז יש צומת יחיד והעפ"מ בוודאי יחידי.

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

מעבר אינדוקציה שגוי לעפ"מ יחדי.
מעבר אינדוקציה שגוי לעפ"מ יחדי.


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

סתירה מעבר אינדוקציה שגוי לעפ"מ יחדי.
סתירה מעבר אינדוקציה שגוי לעפ"מ יחדי.


כדאי לדעת:

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

תשובה ע"י שיקול הקשת הזולה ביותר בגרף

[עריכה]

ראשית נוכיח את המשפט הבא.



משפט:

נניח ש הוא גרף, הם שני צמתים, ו היא קשת.

"כווץ" גרף בין שני צמתים - לפני
"כווץ" גרף בין שני צמתים - לפני

נגדיר כעת את הגרף כגרף המתקבל מ"כיווץ" ו לצומת יחיד, .

"כווץ" גרף בין שני צמתים - אחרי
"כווץ" גרף בין שני צמתים - אחרי

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



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

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


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


הוכחה: האינדוקציה היא על מספר הצמתים, .

(בסיס האינדוקציה) כאשר אז יש צומת יחיד והעפ"מ בוודאי יחידי.

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

תשובה ע"י שיקול הקשת היקרה ביותר במעגל

[עריכה]

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

נניח שנוסיף לגרף את הקשת . להלן העץ לפני הוספת הקשת.

העץ לפני הקשת
העץ לפני הקשת

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

העץ לפני הקשת - מסלול מודגש
העץ לפני הקשת - מסלול מודגש

לכן, לאחר הוספת הקשת יש מסלול מ לעצמו: המסלול שאליו משורשרת הקשת .

העץ לפני הקשת - המעגל
העץ לפני הקשת - המעגל

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

מעגל בבניית עפ"מ - מצב המעגל ההתחלתי.
מעגל בבניית עפ"מ - מצב המעגל ההתחלתי.

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

נניח לכן שיש כרגע שני עצים: עץ אדום ועץ שחור. נניח ש שייך לעץ השחור. אז בהכרח שייך לעץ האדום (מדוע?). התרשים הבא מראה זאת.

מעגל בבניית עפ"מ - מצב המעגל לפני הוספת הקשת האחרונה.
מעגל בבניית עפ"מ - מצב המעגל לפני הוספת הקשת האחרונה.

נשים לב שאם שייך לעץ השחור ו לעץ האדום, אז בהכרח יש כך ש שייך לעץ השחור אך שייך לעץ האדום.

מעגל בבניית עפ"מ - קשת טובה יותר מהקשת האחרונה.
מעגל בבניית עפ"מ - קשת טובה יותר מהקשת האחרונה.

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