Practical Session No. 14 Union/Find & MST זמן ריצה: רצף של m פעולות, Makeset, Union, Find ש- n מתוכן הן פעולות Makeset ניתן לביצוע באמצעות יער של קבוצות זרות, עם איחוד לפי דרגה, וכיווץ מסלולים בזמן: α(m, n)( n, m עבור כל ערכים ריאליים של α(m, n) 4 כאשר:,O(m α(m, n)) היא הפונקציה ההפוכה לפונקציית אקרמן(, ולכן בכל שימוש מעשי ניתן להתייחס לזה כאל: O(m) שאלה מס' 1:
3 1 1 P = 4
2 O(1) if there is a pointer to the last element in the list. 2
ניתן לפתור שאלה זו גם בעזרת מימוש של union find באמצעות עצים מושרשים, עם איחוד לפי דרגה, וכיווץ מסלולים בזמן: ((n,o(m α(m, כאשר: 4 (n α(m, עבור כל ערכים ריאליים של α(m, )(n,n m היא הפונקציה ההפוכה לפונקציית אקרמן(, ולכן בכל שימוש מעשי ניתן להתייחס לזה כאל:.O(m)
שאלה 2: אי-זוגי( ומשתתפים בו שני HEX הוא משחק לוח שמנוהל ע"ג לוח של שחקנים- שחור ולבן. בכל צעד השחקן שזה תורו, בוחר באחד המשושים הפנויים ומניח עליו אבן בצבע שלו. מטרתו של השחקן השחור היא ליצור רצף של אבנים שחורות בין הקצה הימני התחתון של הלוח והקצה השמאלי העליון שלו, ומטרת השחקן הלבן ליצור רצף אבנים לבנות בין שני הקצוות האחרים. הצע אלגוריתם לניהול המשחק. פתרון: K ( משושים K K לוח המשחק יהיה מטריצה Board בגודל.K K Board[i,j] מסמן את מצבו של המשושה בשורה ועמודה : אם הוא פנוי, אם יש עליו אבן שחורה ו- 1 אם יש עליו אבן לבנה. במהלך המשחק ננהל קבוצות של משושים ונאחד בין רצפים של משושים עם אבנים באותו צבע. המשושה שמתאים ל-[ Board[i,j ייוצג ע"י האיבר.<i,j> בהתחלה, כל משושה מהווה קבוצה נפרדת. כאשר שחקן בצבע X הניח אבן בצבע שלו על Board[i,j] נאחד את הקבוצה של <i,j> עם כל הקבוצות של המשושים הסמוכים אשר עליהם יש אבנים בצבע X )לפני האיחוד נבדוק לגבי כל משושה סמוך שעליו יש אבן בצבע X אם הוא כבר שייך לקבוצה של <i,j> ואם לא, נאחד בין הקבוצות(. בנוסף, נוסיף עבור כל אחד מארבע קצותיו של הלוח "משושה דמה" )שניים שחורים ושניים לבנים( וכאשר שחקן בצבע X מניח אבן על משושה שנמצא באחד מהקצוות שהוא צריך לחבר )ימין-עליון ושמאל-תחתון עבור X=white וימין-תחתון ושמאל-עליון,)X=black נאחד את הקבוצה של המשושה שעליו הונחה האבן גם עם "משושה הדמה" המתאים. בכדי לבדוק אם שחקן בצבע X ניצח יש לבדוק האם שני משושי-הדמה שלו נמצאים באותה קבוצה. 1 0 j i מספר פעולות ה- makeset הוא כגודל הלוח ועוד ארבע משושי-דמה. על כל משושה מניחים פעם אחת לכל היותר אבן צבועה, ואז מכיוון שלכל משושה יש לכל היותר ששה שכנים, מבוצע מספר קבוע של בדיקות find ו- union )כולל הבדיקה האם שני משושי-הדמה הם באותה קבוצה(. בסה"כ, ) 2 O(K פעולות MakeSet, Union, Find וזמן הריצה הכללי לניהול המשחק יהיה: logk) O(K 2 logk 2 =( O(K 2 אם נממש את מבנה הנתונים באמצעות רשימות מקושרות עם איחוד לפי דרגה, ו-( O(k 2 α(k 2, k 2 )) = O(k 2 אם נממש את מבנה נתונים באמצעות עצים מושרשים עם איחוד לפי דרגה וכיווץ מסלולים.
MST Minimum Spanning Tree (MST) Given a weighted, connected, undirected graph: A spanning tree is a sub-graph that is a tree and connects all the vertices of the original graph together. A minimum spanning tree (MST) is a spanning tree with weight less than or equal to the weight of every other spanning tree. Known algorithms: Prim and Kruskal
Kruskal The algorithm starts with V different trees (each tree consists of one of the vertices in V). At each step unions two trees by adding the edge with minimal weight that doesn't creates a cycle. MST-Kruskal(G, w) A Ø for each vertex v V(G) Make-Set(v) sort the edges in E(G) by non-decreasing weight w for each edge (u,v) E(G) in order by non-decreasing weight if Find-Set(u) Find-Set(v) A A {(u,v)} Union(u,v) return A Complexity: Assuming that the optimized union-find is used the runtime is (ElogE) = O(ElogV). Prim The algorithm starts with a tree T={r} (tree consisting of a single vertex) and extends it until it spans all the vertices in V(G). At each step the minimal weight edge of all the edges connecting T to the vertices that have not been covered by T yet is added to T. key[u] =min{w(u,v): (u,v) E(G) and v T} MST-Prim (G, w, r) Q V(G) for each v Q key[v] key[r] 0 π[r] NIL while Q Ø
v Extract-Min(Q) for each u Adj[v] if u Q and w(v,u) < key[u] π[u] v key[u] w(v,u) decreasekey (Q, u) Complexity: Using a binary heap the runtime is O(VlogV + ElogV) = O(ElogV). שאלה 3 E ' נתון גרף (E G =,V) לא מכוון וקשיר עם משקלות חיוביים על הצלעות. רוצים למצוא קבוצת צלעות שמכילה צלע אחת מינימאלי. לפחות מכל מעגל ב- G ואשר משקלה פתרון: נמצא עץ פורש מקסימאלי ) T T = (V, E ואז נחזיר את.E = E\E T ראשית, נראה שאכן E מכילה קשת אחת לכל מעגל. זה נכון משום ש- T לא מכיל מעגלים, כלומר בכל מעגל של G יש לפחות צלע אחת שאינה נמצאת ב- T, כלומר היא נמצאת ב-= E.E\E T כעת נראה ש- E ממשקל מינימאלי. נסמן משקל ע"י.wt נתבונן באיזושהי קבוצת צלעות אחרת, E, אשר מכילה צלע אחת לפחות מכל מעגל של G. בגלל ש- E מכילה צלע אחת לפחות מכל מעגל של G, ברור שבקבוצה ''E \E אין מעגלים, כלומר הצלעות ב- E\E הן יער ואפשר להשלים אותן לעץ T ומקבלים ש - ) wt(e wt(t ) + wt(e ) wt(t) + )הערה: E ו- T לא מכילים צלעות משותפות אבל ייתכן שב- E ו- T יש צלעות משותפות ולכן משקלם הכללי עשוי להיות יותר גדול(. כעת, מכיוון ש- T הוא עץ פורש מקסימאלי, הרי ש- wt(t).wt(t ) לכן מקבלים ש- ) wt(e wt(e ) כנדרש. שאלה 4 יש לתכנן רשת תקשורת עבור n ערים, כאשר מחיר קו בין עיר u ועיר v הוא המרחק בין שתי הערים )בקו אווירי(. יש לתכנן רשת תקשורת כך שמחירה יהיה מינימאלי תוך התחשבות בתנאים הבאים: חלק מהערים כבר מחוברות ביניהן ע"י קווי תקשורת ולכן ניתן לחסוך בהקמת הרשת החדשה ע"י שימוש בתשתיות קיימות.
בחלק מן הערים )שאינן מחוברות לתשתיות קיימות( קמו ארגוני ירוקים שמתנגדים לחיבור קווי תקשורת ואנחנו מעוניינים לחבר את אותן ערים למספר קטן ככל האפשר של קווי תקשורת, כלומר למזער את מספרם של קווי התקשורת ברשת אשר מחוברים לאיזושהי עיר "ירוקה". הצע אלגוריתם למציאת רשת בעלות מינימאלית. פתרון: רדוקציה לבעיית :MST נייצג את הערים וקווי התקשורת ע"י גרף (E G =,V) כאשר נעניק לכל זוג ערים משקל עבור הצלע שמחברת אותם באופן הבא: כל קווי התקשורת הקיימים יקבלו משקל. 0 כל קווי התקשורת האחרים אשר אינם מקושרים לעיר שבה יש ארגוני-ירוקים יקבלו את המשקל של עלות הקמתם. לבסוף, נסמן ב- X את המרחק המקסימאלי של שתי ערים כלשהן. עבור קווי התקשורת שקשורות לעיר או ערים שבהן יש ארגוני ירוקים, נעניק לצלע משקל שהוא המרחק בין שתי הערים +.X על הרשת שנוצרה נחשב.MST נבחן את התנהגותו של האלגוריתם של קרוסקל לחישוב MST על הגרף שהגדרנו. בסדר המיון של הצלעות, יופיעו בהתחלה כל הצלעות שמייצגות קווי-תקשורת קיימים, אח"כ כאלו המייצגות קוי-תקשורת לערים "לא-ירוקות" ולבסוף צלעות המייצגות קווי-תקשורת לערים "ירוקות". לכן, בהתחלה הוא יבחר קווי תקשורת קיימים והוא יעבור לבחור צלעות שיש להן משקל גדול מ- 0 רק לאחר שימצה את האפשרות לבחור צלעות במשקל 0. לאחר מכן, יבחר מתוך הצלעות שמייצגות קוי-תקשרות של ערים "לא-ירוקות" ויעבור לבחור קווים לערים ירוקות רק לאחר שימצה את האפשרות לצלעות אחרות. שאלה 5 מפקד של רשת ריגול צריך למסור הודעה לכל N הפעילים בקבוצה, ההודעה כמובן צריכה להשאר סודית. לכל שני פעילים i,j הנמצאים בקשר יש הסתברות ידועה < 1 (j < P(i, 0 שאם i מעביר את ההודעה ל- j ההודעה תתגלה. המטרה של המפקד היא לתכנן את רשת העברת ההודעה כך המידע יגיע לכל הפעילים תוך מזעור הסתברות גלוי ההודעה. מה יעשה? פתרון: נבנה גרף על כל הפעילים, כאשר יש צלע בין כל שני פעילים הנמצאים בקשר. אנחנו רוצים שההודעה תגיע לכל הפעילים ולכן מחפשים תת-גרף בו יש מסלול מהצומת s, המייצג את המפקד לכל הפעילים, כלומר, תת-גרף קשיר. בתת-גרף האופטימאלי עבורנו לא יופיע מעגל, מכיוון שלו היה מעגל היה ניתן לזרוק צלע במעגל בלי לפגוע בקשירות ותוך הפחתת הסיכון להתגלות, ולפיכך לא היה אופטימאלי. ולכן אנחנו מחפשים עץ פורס בגרף עבורו ההסתברות לגילוי ההודעה מינימאלי.
ההסתברות לאי גילוי ההודעה עבור צלע בודדת הוא ((j P(i, 1) ולכן ההסתברות הכללית לאי גילוי ההודעה עבור תת-עץ כלשהוא T הוא: ((j P(i, 1) על פני כל,i) (j T כלומר אנחנו מחפשים עץ T עבורו ((j P(i, 1) על פני כל,i) (j T הוא מקסימלי. נשתמש בכך ש log)( היא פונקציה מונוטונית עולה ולכן מחפשים T כך ש j))) log( (1 P(i, מקסימלי. אבל: j)) log( (1 P(i, j))) = log(1 P(i, ולכן שקול למציאת עץ פורש מקסימלי בגרף שלנו כאשר משקל צלע log(1 P(i, j)) הוא (i, j) או לחלופין למציאת MST כאשר משקל צלע (j,i) הוא ((j. log(1 P(i, j))( log(1 P(i, הוא מספר חיובי(. שאלה 6 האם אפשר לפתור הבעיה הקודמת ללא הפונקציה log()? פתרון: למעשה אפשר להריץ MST כאשר משקל צלע (i,j) הוא P(i,j(!! בריצת prim על הגרף תחת כל אחת משני המישקולים השונים אותה הצלע תבחר בכל שלב! כאשר P(i,j( מינימלי בכל שלב אם"ם -log(1-p(i,j)) מינימלי. )כלומר הפתרון הקודם רק מסביר למה זה עובד (. שאלה ממבחן נתון גרף G עם משקולות חיוביים ושונים. תהא w פונקצית המשקל כך ש- w(e)>1 לכל e. סמנו נכון / לא נכון לגבי כל אחד מהמשפטים הבאים: נגדיר פונקצית משקל חדשה: 1/w(e(.w (e) = w(e) טענה: העץ הפורש המינימאלי עפ"י w זהה בקבוצת צלעותיו לעץ הפורש המינימאלי עפ"י 'w. נכון/לא נכון עץ מכפלה פורש מינימלי הוא עץ פורש של G שמכפלת משקלות צלעותיו מינימלית. טענה: עץ מכפלה פורש מינימלי זהה בקבוצת צלעותיו לעץ הפורש המינימאלי. נכון/לא נכון.1.2 נתון גרף קשיר ולא מכוון,G=(V,E( וידוע שכל המשקלות על הקשתות שונים זה מזה ורק לשתי קשתות יש אותו המשקל. תארו בקצרה אלגוריתם הבודק אם ל- G קיים MST )עץ פורש מינימלי( יחיד. נתחו זמן ריצה ונמקו.
פתרון:. 1 נכון. 2 נכון נמיין את צלעות G עפ"י משקלן בזמן.O( E log E ( תהי S1 הסדרה שהתקבלה. נסרוק את הסדרה S1 בזמן O( E ( ונמצא את זוג הצלעות עם אותו המשקל. ניצור סדרה נוספת S2 הזהה ל- S1 פרט לכך שזוג הצלעות עם אותו המשקל מופיעות בה בסדר הפוך. נריץ את האלגוריתם למציאת עפ"מ של קרוסקל פעמיים, פעם על S1 ופעם על S2. יהיו T1 ו- T2 העצים שהתקבלו, בהתאמה. אם T1 מכיל את אחד מבני הזוג בלבד ואלו T2 מכיל את השני, אזי קיימים שני,MST אחרת קיים עץ יחיד. במהלך ריצת האלגוריתם למציאת,MST נשים לב מה קורה אם זוג הצלעות עם אותו המשקל, כך שנוכל לקבוע מיד בגמר הריצה האם T2 שונה מ- T1 או לא. שאלה ממבחן )מועד א 2002( חברת הבניה "מבנים בע"מ" רוצה לשמור את נתוני משכורות העובדים ולבצע מספר פעולות עליהם. החברה מעסיקה כבר n עובדים. הציעו מבנה נתונים בגודל,O(n) התומך בפעולות הבאות בזמנים הנתונים. פעולה תיאור זמן O(n) אתחול המבנה. employees היא רשימה לא ממוינת של n העובדים והמשכורות שלהם. median_key3 הוא השלישון של משכורות העובדים ידוע ונתון מראש ומשתנה ביחד עם העדכונים. Init(employees, median_key3) O(logn) למבנה הנתונים. k הוספת עובד בעל משכורת Insert(k) O(logn) O(logn) הוצאת עובד בעל משכורת מינימאלית. אם יש יותר מאחד, אז יש להוציא אחד מהם. הוצאת עובד בעל משכורת מקסימאלית. אם יש יותר מאחד, אז יש להוציא אחד מהם. Remove_Min() Remove_Max() (1)O הדפסת המשכורת הממוצעת של העובדים בחברה Average() O(1) הדפסת השלישון של משכורת העובדים בחברה )ראו הגדרה בהמשך( Median3()
n 3 הגדרה: ה- השלישון שווה לערך המופיע במקום ה- לאחר מיון האיברים, כלומר האיבר n 3 בגודלו. עבור 7=n והערכים: 1,2,,,2,15,15,7 השלישון הוא, השלישון הוא 7 עבור 6=n והערכים: 7,,,2,1,1,2 השלישון הוא 7 עבור 6=n והערכים: 7,7,7,,,2,5 דוגמה: הערות: 1. פתרון שבו 7 מתוך, הפעולות ירוצו בזמן הנדרש יקנה 70% מהנקודות 2. כתיבת "לא יודע/יודעת" במקום קשקושים, תקנה 20% מהנקודות פתרון: הפתרון כולל 4 ערימות, מקושרות ביניהן. ערימה H1 היא ערימת מינימום שתחזיק את כל האיברים. ערימה H2 היא ערימת מקסימום שתחזיק את כל האיברים. n 3 האיברים הקטנים ביותר. n 3 האיברים הגדולים ביותר. n ערימה H3 היא ערימת מקסימום שתחזיק את ערימה H4 היא ערימת מינימום שתחזיק את כל איבר יופיע, אם כן, בשלוש ערימות:,H1 H2 ואחת מבין,H3. H4 כל המופעים יהיו מחוברים במצביעים הדדיים. כמו כן נשמור שני משתנים: - n מספר העובדים )האיברים(, ו- - sum סכום כל המשכורות. Init נבנה את 4 הערימות, עם הקשרים ביניהן, ונחשב סכום המשכורות. ב- H3 יהיו n 3 שווה ל- median_key. ב- איברים: כל האיברים שקטנים מ- median_key3, ומספר איברים שערכם O(n) יהיו שאר האיברים. סה"כ זמן: H4. O(1) ב- sum / n נדפיס Average()
Median3() על פי הבנייה, החציון ישב תמיד בשורש ערימה H3. נוכל להדפיסו ב-.O(1) ו- H2. ל- H1 k את האיבר נכניס ב- k. sum ב- 1 ואת n נגדיל את Insert(k) מקרה :1 Median3() : k נכניס את k ל- H4. ייתfן ויש צורך להעביר איבר מ- H4 ל- H3 )במקרה ו- 1 = ). n mod 3 האיבר שיש להעביר, שנסמנו k, הוא האיבר המינימלי ב- H4 והוא נמצא בשורש של H4. נוציא את k מ- H4, ונכניס אותו ל- H3. אגב, k יכנס לשורש של H3 והוא יהיה השלישון החדש של מבנה הנתונים. מקרה 2: Median() : k < מקרה זה דומה למקרה 1. גם הפעם יש צורך בתיקון אם שלישון השתנה, כלומר = 1 3. n mod נעשה זאת ע"י הוצאת האיבר הגדול ביותר ב- H3 )אגב זהו השלישון, שנמצא בשורש(, והכנסתו ל- H4. Remove_Min() הוצאת האיבר המינימלי. נמצא אותו ב-( O(1 בשורש של H2, ובעזרת המצביעים נוכל להוציא אותו מן הערימות האחרות )בדומה ל- / extract_max extract_minשל ערימה( ב-( O(logn. במידת הצורך יש להעביר איבר אחד בין הערימות ל- Insert. בדומה ו- H4 H3 שנוציא את האיבר מהשורש של H1. רק זהה ל-() Remove_Min, Remove_Max() במידת הצורך יש להעביר איבר אחד בין הערימות H3 ו- H4 בדומה ל- Insert. min max median H1 min-heap size: n H2 max-heap size: n H3 max-heap size: n 3 H4 min-heap size: n n 3