UF - ‫‪Union-Find‬‬ ‫1. הגדרה:‬...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: ‫‪Union-Find‬‬ ‫1. הגדרה:‬ ‫מבנה נתונים, אשר בהינתן אוסף איברים המחולקים לקבוצות זרות,‬ ‫מאפשר ביצוע הפעולות הבאות:‬ ‫• )‪ – Find(i‬החזר את שם הקבוצה אליה שייך ‪.i‬‬ ‫• )‪ – Union(p,q‬בצע איחוד של הקבוצות ‪ p‬ו- ‪ ,q‬החזר את שם‬ ‫הקבוצה החדשה‬ ‫)‪ p‬ו- ‪ q‬נהרסות(.‬ ‫בהתחלה כל איבר מהווה קבוצה בפני עצמו.‬ ‫1‬ ‫עצים הפוכים‬ ‫לכל קבוצה ניצור עץ הפוך )בנים מצביעים לאבא( מכל האיברים שלה.‬ ‫שורש כל עץ הפוך יצביע על רשומה עם שם הקבוצה ומספר איבריה‬ ‫)כותרת(.‬ ‫בנוסף נחזיק מערכי מיפוי לקבוצות ולאיברים.‬ ‫2‬ ‫סיבוכיות‬ ‫)‪O(logN‬‬ ‫מימוש הפעולות‬ ‫)‪ – Find(i‬ממערך האיברים גש לרשומת האיבר בעץ, וטפס לשורש.‬ ‫חזור שוב על הטיפוס, ובדרך העבר את כל הצמתים במסלול‬ ‫כווץ‬ ‫מסלולים‬ ‫העלייה להיות בנים של השורש.‬ ‫)‪ - Union(p,q‬ממערך הקבוצות גש לשורשי העצים. הפנה את שורש‬ ‫הקבוצה הקטנה להצביע על שורשה של הגדולה.‬ ‫איחוד‬ ‫עדכן את גודל הקבוצה המתקבלת, וסלק את כותרת הקבוצה‬ ‫לפי גודל‬ ‫הקטנה והמצביע אליה ממערך הקבוצות.‬ ‫)1(‪O‬‬ ‫)‪O(log*N‬‬ ‫סיבוכיות ‪ m‬פעולות הינה )‪) O(mlog*N‬בהרצאות(.‬ ‫לכן סיבוכיות ממוצעת )‪ (amortized‬של פעולה בודדת הינה‬ ‫3‬ ‫דוגמא לכיווץ מסלולים:‬ ‫לאחר ביצוע )0(‪:find‬‬ ‫4‬ ‫קבוצות עם מקסימום‬ ‫בנוסף לפעולות הרגילות של )‪ find(i‬ו-)‪ ,union(p,q‬צריך להוסיף פעולת‬ ‫)‪ max(i‬שתחזיר את האיבר המקסימלי בקבוצה.‬ ‫פתרון:‬ ‫מבנה נתונים: נשתמש במבנה נתונים ‪ .Union-Find‬בנוסף כל שורש יחזיק את‬ ‫המספר הכי גבוה בקבוצה שלו בשדה ‪.max‬‬ ‫אתחול: כל איבר יהווה קבוצה בפני עצמו, וכן ‪ max‬יכיל את ערך האיבר עצמו.‬ ‫פעולות:‬ ‫)‪ – find(i‬רגיל.‬ ‫)‪ :max(i‬בצע )‪ .z find(i‬והחזר )‪.max(z‬‬ ‫)‪ union(p, q‬צריך לתחזק את ‪ .max‬אי אפשר לאחד את השורשים כך שה‪max‬‬ ‫הקטן יצביע לשורש עם ‪ max‬הגדול כי אז האיחוד לא יתבצע לפי גודל.‬ ‫יש שתי דרכים לעקוף בעיה זו: 1( במידת הצורך להחליף את תכני השורשים.‬ ‫2( לעדכן את ‪ max‬של השורש החדש.‬ ‫5‬ ‫אילן יוחסין‬ ‫נתון אילן יוחסין )קבוע( הממומש כעץ הפוך מכוון. בהתחלה כל הצמתים "חיים".‬ ‫יש לממש ביעילות את הפעולות הבאות:‬ ‫• )‪ – Kill(x‬בהינתן מצביע ‪ x‬לצומת בעץ, יש "להרוג" את הצומת.‬ ‫אסור "להרוג" את השורש )של אילן היוחסין(.‬ ‫• )‪ – Master(x‬יש להחזיר את האב הקדמון הצעיר ביותר של ‪ x‬שעדיין חי.‬ ‫אם ‪ x‬חי, אז ‪.Master(x) = x‬‬ ‫פתרון:‬ ‫מבנה נתונים: נשתמש במבנה נתונים ‪ ,Union-Find‬שבו כל שורש מחזיק את שם‬ ‫האב הקדמון החי היחיד בקבוצה. כלומר, הקבוצה ששמה ‪ z‬תכיל את כל הצמתים‬ ‫עבורם ‪.Master(x) = z‬‬ ‫אתחול: כל איר יהווה קבוצה בפני עצמו )כולם חיים(.‬ ‫פעולות: )‪ – Master(x‬הפעולה שקולה לביצוע )‪ Find(x‬והחזרת שם הקבוצה.‬ ‫ )‪ y) z Master(y‬הוא אביו של ‪.(x‬‬‫ )‪ Union(z, x‬ושם הקבוצה שנוצרה הוא ‪.z‬‬‫שימו לב: זה לא אומר בהכרח השורש של ‪ x‬מופנה לשורש של ‪z‬‬ ‫6‬ ‫)‪ – Kill(x‬בצע:‬ ‫דוגמא: בדוגמא זו החצים מייצגים את האב הקדמון ולא פוינטר במימוש. הקבוצות‬ ‫השונות מסומנות באפור. כלומר האב הקדמון של 6 הוא 3, אבל במימוש 6 יכול‬ ‫להצביע לצומת אחר.‬ ‫סיבוכיות הפתרון:‬ ‫עבור ‪ m‬פעולות ‪ Master-Kill‬מתבצעות )‪ O(m‬פעולות ‪.Union-Find‬‬ ‫לכן במימוש ע"י עצים הפוכים סיבוכיות של ‪ m‬פעולות היא )‪.O(mlog*n‬‬ ‫סיבוכיות משוערכת של פעולה בודדת היא )‪.O(log*n‬‬ ‫7‬ ‫יחסי שקילות‬ ‫דרוש מבנה נתונים המאפשר לתחזק קבוצת ‪ n‬איברים שונים ולבצע עליה את‬ ‫הפעולות הבאות בסיבוכיות מינימלית:‬ ‫• )‪ – Make_EQ(x,y‬קובעת שקילות האיברים ‪.x,y‬‬ ‫• )‪ – Is_EQ(x,y‬בודקת האם ‪ x,y‬שקולים.‬ ‫בהתחלה אין אף זוג איברים ‪ x,y‬המקיימים ‪.x~y‬‬ ‫תזכורת:‬ ‫‪.∀x‬‬ ‫יחס שקילות )נסמנו ~( מוגדר כיחס המקיים את התכונות הבאות:‬ ‫‪x~x‬‬ ‫‪.∀x, y‬‬ ‫‪.∀x, y, z‬‬ ‫‪x~ y⇔ y~x‬‬ ‫‪x~ y∧ y ~ z⇒ x~ z‬‬ ‫1. רפלקסיביות:‬ ‫2. סימטריות:‬ ‫3. טרנזיטיביות:‬ ‫}‪.[ x] = { y : y ~ x‬‬ ‫קבוצת שקילות מוגדרת באופן הבא:‬ ‫8‬ ‫יחס שקילות על קבוצה ‪ A‬מחלק אותה לקבוצות שקילות זרות שאיחודן = ‪.A‬‬ ‫פתרון:‬ ‫נשתמש במבנה ‪ UF‬כאשר בהתחלה כל איבר יהווה קבוצה בפני עצמו.‬ ‫– )‪Make_EQ(x,y‬‬ ‫) )‪If (Find(x) != Find(y‬‬ ‫))‪Union (Find(x), Find(y‬‬ ‫– )‪Is_EQ(x,y‬‬ ‫))‪Return (Find(x) == Find(y‬‬ ‫סיבוכיות: ‪ Make_EQ‬ו- ‪ Is_EQ‬דורשות מספר קבוע של פעולות ‪,Union/Find‬‬ ‫לכן הסיבוכיות שלהן היא )‪ O(log*n‬בממוצע.‬ ‫)‪// x~y ↔ Find(x)=Find(y‬‬ ‫9‬ ‫בעיית ‪Off-line MIN‬‬ ‫נתונה קבוצה ‪) S‬ריקה בהתחלה(. הקבוצה מנוהלת ע"י 2 פעולות:‬ ‫• הכנסת מספר שלם מהתחום ]‪ [1, n‬ל- ‪.S‬‬ ‫• מחיקת האיבר המינימלי ב- ‪ S‬והדפסתו.‬ ‫הנחה: כל איבר מוכנס לקבוצה פעם אחת לכל היותר.‬ ‫דרוש מבנה נתונים שבהינתן סדרת פעולות כזו, מוצא את סדרת הפלט.‬ ‫4‪63D2D15DD‬‬ ‫5123‬ ‫לדוגמא: עבור סדרת הפעולות הבאה:‬ ‫תהיה סדרת הפלט:‬ ‫)מספר מציין הכנסה של מספר זה, ‪ D‬מציין מחיקת המינימום(‬ ‫פתרון פשוט בעזרת עץ/ערימה:‬ ‫עוברים על המערך לפי הסדר. כשרואים מספר מכניסים אותו למבנה. כשרואים ‪D‬‬ ‫מוציאים את המינימום ומכניסים את המינימום לפלט.‬ ‫סיבוכיות: כל הכנסה/הוצאה )‪ O( log n‬ובסך הכול )‪.O( n log n‬‬ ‫01‬ ‫פתרון בעזרת ‪ :UF‬ננצל שתי עובדות על מנת להוריד את הסיבוכיות מ- )‪.O( n log n‬‬ ‫1. כל איבר מ- ‪ 1...n‬מופיע בדיוק פם אחת.‬ ‫2. הקלט נתון מראש ולכן לא חייבים לחשב את הפלט לפי הסדר. למשל, יתכן‬ ‫שנחשב את האיבר של סוף הפלט ראשון.‬ ‫אלגוריתם חדש: לכל ‪ i‬מ-1 עד ‪n‬‬ ‫1. מצא את ה-‪ D‬הראשון שפנוי מימין למיקום ‪.i‬‬ ‫2. הפלט של ה-‪ D‬הוא ‪ i‬וסמן את ה-‪ D‬כתפוס.‬ ‫ניתן למצוא את ה-‪ D‬הראשון מימין ל-‪) i‬שלא בהכרח פנוי( על ידי בנייה של מערך‬ ‫מראש. לשאר הפעולות בעצם יש לנו אילן יוחסין שבו 1+‪ k‬הוא אב קדמון של ‪.k‬‬ ‫ועבור ‪ k‬רוצים לדעת את האב הקדמון הצעיר ביותר של ‪ k‬שעדיין חי. כלומר‬ ‫האינדקס הראשון שגדול מ-‪ k‬שעבורו הפלט של ‪ D‬לא חושב. במקרה זה ה‪master‬‬ ‫יהיה ה-‪ max‬של האיברים בקבוצתו.‬ ‫נסמן את הקלט ב-‪ ,A‬את הפלט ב ‪.C‬‬ ‫הגודל של ‪ C‬הוא מספר ה- ‪-D‬ים ב-‪.A‬‬ ‫11‬ ‫פתרון מפורט:‬ ‫נמספר את ה-‪D‬ים לפי סדר הופעתן בקלט ‪ ,A‬ונשמור במערך ‪ B‬לכל איבר את‬ ‫מספר ה-‪ D‬אליה הוא שייך. בנוסף נחשב גם את גודל הפלט )מספר ה-‪-D‬ים(.‬ ‫בדוגמא:‬ ‫4 ‪A=6 3 D 2 D 1 5 D D‬‬ ‫}4{ = 5‪D1 = {6,3}, D2 = {2}, D3 = {1,5}, D4 = {}, D‬‬ ‫1 3 5 1 2 3=‪B‬‬ ‫כלומר מחשבים מערך ‪ ,B‬וגודל הפלט הוא 1-‪Jmax‬‬ ‫1=‪j‬‬ ‫‪For i=1…|A| do‬‬ ‫‪if A[i] ≠ D then B[A[i]] = j‬‬ ‫‪else /*A[i] = D*/ ++j‬‬ ‫‪Jmax = j‬‬ ‫21‬ ‫1.‬ ‫פתרון מפורט )המשך(:‬ ‫נשתמש במבנה ‪ UF‬של אילן יוחסין. האיברים יהיו ה ‪Dk‬ים מזוהים על‬ ‫ידי 1 עד ‪ .Jmax‬ו 1+‪ k‬הוא אביו של ‪.k‬‬ ‫לכל ‪ i‬מ-1 עד ‪:n‬‬ ‫ נמצא לאיזה ‪ Dk‬שייך הקבוצה של ‪.(k = master(B[i]))) i‬‬‫ הפלט עבור ‪ Dk‬יהיה ‪ . i‬כלומר, ‪ .C[k] = i‬אם ‪ k=Jmax‬אז‬‫מדלגים.‬ ‫ )‪ kill(k‬אם ‪ k=Jmax‬מדלגים.‬‫סיבוכיות:‬ ‫לכל איבר מ-1 עד ‪ n‬ביצענו מספר קבוע של פעולות ‪ ,Union/Find‬לכן‬ ‫סיבוכיות האלגוריתם היא )‪.O(n log*n‬‬ ‫31‬ ‫2.‬ ‫3‬ ‫2‬ ‫51‬ ‫4‪63D2D15DD‬‬ ‫13 5 1 2 3 =‪B‬‬ ‫}5‪{D1}, {D2}, {D3}, {D4}, {D‬‬ ‫פלט:‬ ‫ק לט :‬ ‫דוגמת הרצה:‬ ‫• 1 הכי קרוב ל-3‪ .D‬נבצע )3(‪ master‬ונקבל 3.לכן פעולת מחיקה מספר 3 תדפיס 1.‬ ‫}5‪{D1}, {D2}, {D3, D4}, {D‬‬ ‫}5‪{D1}, {D2, D3, D4}, {D‬‬ ‫}5‪{D1, D2, D3, D4}, {D‬‬ ‫כעת נבצע )3(‪kill‬‬ ‫כעת נבצע )2(‪kill‬‬ ‫כעת נבצע )1(‪kill‬‬ ‫• 2 הכי קרוב ל-2‪ .D‬נבצע )2(‪ master‬ונקבל 2.לכן פעולת מחיקה מספר 2 תדפיס 2.‬ ‫• 3 הכי קרוב ל-1‪ .D‬נבצע )1(‪ master‬ונקבל 1.לכן פעולת מחיקה מספר 1 תדפיס 3.‬ ‫• 4 הכי קרוב ל-5‪ .D‬נבצע )5(‪ master‬ונקבל 5. מכווין שאין מחיקה מספר 5 נדלג.‬ ‫• 5 הכי קרוב ל-3‪ .D‬נבצע )3(‪ master‬ונקבל 4.לכן פעולת מחיקה מספר 4 תדפיס 5.‬ ‫כעת נבצע )4(‪kill‬‬ ‫}5‪{D1, D2, D3, D4, D‬‬ ‫41‬ ...
View Full Document

Ask a homework question - tutors are online