1 / 23

סמינר באלגוריתמים / גרפים מישוריים

סמינר באלגוריתמים / גרפים מישוריים. המאמר: A SEPARATOR THEOREM FOR PLANAR GRAPHS by Richard J. Lipton and Robert E. Tarjan. שראל כהן נובמבר 2009. להרצאה יהיו שני חלקים . אינטואיציה + תובנות עיקריות ( insights ) פיתוח האלגוריתם "בשלבים". הצגת התובנות העיקריות שבאלגוריתם.

rhonda-cook
Download Presentation

סמינר באלגוריתמים / גרפים מישוריים

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. סמינר באלגוריתמים / גרפים מישוריים המאמר: A SEPARATOR THEOREM FOR PLANAR GRAPHS \ by Richard J. Lipton and Robert E. Tarjan שראל כהן נובמבר 2009

  2. להרצאה יהיו שני חלקים • אינטואיציה + תובנות עיקריות (insights) • פיתוח האלגוריתם "בשלבים". • הצגת התובנות העיקריות שבאלגוריתם. • הצגה מסודרת של האלגוריתם. • האלגוריתם. • הוכחת נכונות. • ניתוח סיבוכיות.

  3. הגדרת הבעיה • מציאת קבוצת הפרדה (Separator) בגודל O(√n):נתון גרף מישורי בלתי מכוון G(V,E), יש למצוא חלוקה של צמתי הגרף לשלושה קבוצות: A, B, C, כך ש: • מספר הצמתים בכל אחת מהקבוצות A ו B הוא לכל היותר 2/3*n • אין קשתות בין הצמתים שבקבוצה A לבין הצמתים שבקבוצה B. • מספר הצמתים בקבוצה C הוא O(√n), זו קבוצת ההפרדה. • לא קיימת קבוצת הפרדה כזו בגרפים כלליים, אפילו אם הם דלילים בקשתות.

  4. הגדרת הבעיה - המשך • למעשה נפתור בעיה קצת מורכבת יותר: • נתון גרף מישורי בלתי מכוון G(V,E), ופונקצית משקל על הצמתים (כך שמשקל כל הצמתים הוא לכל היותר 1), יש למצוא חלוקה של צמתי הגרף לשלושה קבוצות: A, B, C, כך ש: • משקל הצמתים בכל אחת מהקבוצות A ו B הוא לכל היותר 2/3 • אין קשתות בין הצמתים שבקבוצה A לבין הצמתים שבקבוצה B. • מספר הצמתים בקבוצה C הוא O(√n), זו קבוצת ההפרדה.

  5. בשביל מה זה טוב? • "הפרד ומשול". • גודל כל תת בעיה עד 2/3 מגודל הבעיה המקורית. • חיבור יעיל של הפתרונות של תת הבעיות – גודל קבוצת ההפרדה הוא O(√n).

  6. תובנה 1: מעגל פשוט בגרף מישורי הוא חלוקה • בגרף מישורי, כל מעגל פשוט מגדיר חלוקה: • A: הצמתים שבתוך המעגל. • B: הצמתים שמחוץ למעגל. • C: הצמתים שעל המעגל. • תכונה זו לא קיימת עבור גרפים לא מישוריים. תכונה זו בונה את המסגרת של האלגוריתם, ולכן היא "לב" האלגוריתם.

  7. תובנה 1 – אלגוריתם 1 • למעשה ניתן לבנות אלגוריתם כבר מתובנה 1: • מצא-קבוצת-הפרדה (G) : • יהי C מעגל פשוט שרירותי. • כל עוד C מגדיר חלוקה שבה משקל הצמתים בתוך המעגל או משקל הצמתים מחוץ למעגל גדול מ- 2/3: • שפר את המעגל: הוסף/הסר פאה למעגל כך שמשקל החלק הגדול יותר מ- 2/3 ייקטן. • ניתן להניח בלי הגבלת הכלליות: • כל פאה בגרף המישורי היא משולש. אחרת, בתחילת האלגוריתם, נוסיף קשתות בכל פאה, כך שכל פאה תהיה משולש. • משקל כל צומת הוא קטן ממש מ- 1/3. אחרת, יש פתרון פשוט: C תהיה הקבוצה עם הצומת שמשקלה לפחות 1/3, A תהיה קבוצת כל שאר הצמתים ו-Bהקבוצה הריקה.

  8. אלגוריתם 1 – "הוכחת נכונות" • נניח בלי הגבלת הכלליות שמשקל הצמתים מחוץ למעגל גדול ממש מ- 2/3. • כל איטרציה תקטין את משקל הצמתים מחוץ למעגל בלכל היותר 1/3. • בפעם הראשונה שמשקל הצמתים מחוץ לא יהיה יותר מ- 2/3, המעגל יהיה קבוצת הפרדה כנדרש. בעיה • גודל המעגל יכול להיות גם ליניארי ב- n.

  9. הערות ביניים (שקף חדש) • הערה 1: שיפור המעגל גורם להרחבתו בקודקוד אחד או הורדה של קודקוד אחד מהמעגל. • הערה 2 (חידוד): קבוצת ההפרדה C שנמצא באלגוריתם (השלם) תהיה מעגל פשוט (באורך O(√n)) + תוספת של כמה צמתים שאסביר עליהם בהמשך. • הערה 3: אם משקל אחד הצמתים (v) הוא יותר מ- 1/3 אז יש פתרון פשוט: C={v}, A=V\{v}, B=Ф. • הערה 4: ניתן להניח שמשקל הצמתים בתוך המעגל גדול ממשקל הצמתים שמחוץ למעגל. אחרת – נלביש את הגרף על כדור, נבקע "חור" בתוך המעגל, ונפרוש את המעגל המתקבל במישור. "תוך המעגל" ו- "חוץ המעגל" החליפו צד. לכן נניח תמיד שמשקל הצמתים בתוך המעגל גדול יותר ממשקל הצמתים מחוץ למעגל. B *C A

  10. תובנה 2 • תובנה 2: תכונה של עצים: כל קשת שאינה בעץ מגדירה מעגל אחד ויחיד עם קשתות העץ. • אורך המעגל: לכל היותר 2*r+1 כאשר r זה גובה העץ. • ומכאן אנו מקבלים אלגוריתם קצת יותר טוב:

  11. תובנה 2 – אלגוריתם 2 • מתובנה 2 אנו בונים את האלגוריתם השני: • מצא-קבוצת-הפרדה (G) : • מצא עץ פורש T לגרף שגובהו r. • תהי e קשת שרירותית שאינה קשת עץ, ויהי C(e) המעגל היחיד שנוצר על ידי הקשת e והעץ הפורש. • כל עוד C(e) מגדיר חלוקה שבה משקל הצמתים בתוך המעגל או משקל הצמתים מחוץ למעגל גדול מ- 2/3: • שפר את המעגל: ע"י החלפת הקשת e בקשת סמוכה לה (שאינה קשת עץ), כך שמשקל החלק הגדול יותר מ- 2/3 ייקטן. • יתרון: גודל הקבוצה המפרידה הוא לכל היותר 2*r+1

  12. אלגוריתם 2 – שיפור המעגל ע"י החלפת הקשת שיוצרת את המעגל • בחירת הקשת שאינה בעץ שתשפר את המעגל מתבצעת באופן הבא: • ( בלי הגבלת הכלליות נניח שהחלק שבתוך המעגל הוא זה ששוקל יותר מ- 2/3. ונסמן את הצומת בתוך המעגל ששייך למשולש עם הקשת e=(V,W) הוא Y. ) מקרה 2: (V,Y) ו- (W,Y) אינן קשתות עץ מקרה 1: (V,Y) קשת עץ V e W V e W e`2 e`1 e` Y באדום- קשתות עץ Y C(e`1) C(e`2) באדום- קשתות עץ Path(Y,Z) Z Cost( C(e) ) = Cost(C(e`1)) + Cost(C(e`2)) + Cost(Path(Y,Z)) החלף את e ב- e’. מציאת Path(Y,Z) ע"י מעקב אחר ה"קשתות למעלה" בעץ החל מצומת Y ואם יש צורך גם מצומת W. החלף את e ב- e’1 או e’2 שמגדירה את חצי המעגל הכבד.

  13. אלגוריתם 2 – זמן ריצה • ב"מקרה 2" תחילה מחשבים את משקל המסלול Path(Y,Z). אח"כ את משקל כל אחד משני חצאי המעגלים C(e`1), C(e`2) ע"י סריקת הקשתות שבתוכן לסירוגין (בעזרת ייצוג doubly-connected-edges-list) עד שכל הקשתות באחד המעגלים נסרקו, ואז משקל המעגל השני מתקבל מחיסור משקל המעגל הראשון ומשקל המסלול ממשקל המעגל הכולל. • לכן, סה"כ זמן ריצה: O(n) כי לכל קשת מחשבנים עלות של O(1). הבעיה: גובה עץ פורש יכול להיות O(n) ולכן גודל הקבוצה המפרידה עדיין יכול להיות O(n). ננסה להקטין את גובה העץ.

  14. תובנה 3 - כל רמה בעץ BFS היא קבוצת הפרדה • קשתות חוצות בגרף בלתי מכוון – הפרש הרמות בין שני הקודקודים של הקשת הוא לכל היותר 1. • נכון לכל גרף בלתי מכוון. root T L

  15. תובנה 4– הרמות L0, L1, L2 קיימות • תובנה 3: תובנה על עצים: לכל עץ, או שגובהו לכל היותר √n או שיש רמה בעץ שגובהה לכל היותר √n ומספר הצמתים בה גם הוא לכל היותר √n . • סיבה: אחרת היו √nרמות שמספר הצמתים בכל אחת מהן יותר מ- √n בסתירה לכך שיש n צמתים. • השימוש שלנו בתובנה: root • נמצא את הרמה L1 שמשקל הצמתים מעליה (לא כולל אותה) קטן מ- ½, ומשקל הצמתים שמעליה כולל אותה הוא לפחות ½, נסמן את מספר הצמתים ברמות 0 עד L1 ב- k. נמצא את הרמות L0<=L1 ואת L2>=L1 כך שהמרחק בין L0 ל- L1 הוא לכל היותר √k ומספר הצמתים ברמה L0 הוא לכל היותר √k (קיים לפי תובנה 3). באופן סימטרי נמצא רמה L2 שמרחקה מ L1 לכל היותר √(n-k) וגם יש בה לכל היותר √(n-k) צמתים. T משקלk<=1/2 √k L0 √k פחות מ 2/3– פשוט. L1 √(n-k) √(n-k) L2

  16. תובנה 4 - המשך • ראינו: קיימות רמות L0, L1, L2. • נתבונן על שלושה חלקים: הצמתים ברמות 0 עד L0-1, הצמתים ברמות L0+1 עד L1-1, והצמתים ברמות L2+1 עד r כאשר r זו הרמה המקסימאלית. • אם משקל הצמתים בחלק האמצעי הוא לכל היותר 2/3 קיימת חלוקה פשוטה: A יהיה החלק הכבד מבין שלושת החלקים, B יהיה שני החלקים האחרים ו- C תהיה קבוצת הצמים ברמות L0 ו- L1. אחרת: כווץ את הצמתים מעל L0 (וכולל), מחק את הצמתים מתחת (וכולל) L2. 2 √k + 2 √(n-k) <= 2 √(n/2) = 2 √2 √n כי √X פונקציה קמורה. • אחרת, נכווץ את הצמתים שברמות 0 עד L0 ונמחק את הצמתים ברמות L2 עד r. קיבלנו עץ שגובהו √k + √(n-k) <= √2 * √n. נשתמעש באלגוריתם 2 עם העץ הנ"ל כדי למצוא חלוקה של הצמתים שלו לקבוצות A*, B*, C* כך שמשקל הצמתים בכל אחת מהקבוצות A* ו- B* הוא לכל היותר 2/3. נקבל שהגודל של C* לכל היותר פעמיים גובה העץ +1, כלומר לכל היותר 2* √2 √n +1. • נקבע את A להיות קבוצת הצמתים שמשקלה הגדול יותר מבין A*, B*, נקבע את C להיות C* וגם הצמתים ברמות L1, L2, ונקבע את B להיות כל שאר הצמתים. לכן הגודל של C לכל היותר 4* √2 √n, והמשקל של כל אחת מהקבוצות A ו- B לכל היותר 2/3, וזה הפלט המבוקש.

  17. תובנה 4 – אלגוריתם 3 • מתובנה 3 אנו בונים את האלגוריתם השלישי: • מצא-קבוצת-הפרדה (G) : • מצא עץ BFS נסמן אותו ב- T. מצא את הרמות L0<=L1<=L2 של העץ T. • אם משקל הצמתים ברמות L1+1…L2-1 לכל היותר 2/3 קבע את A להיות קבוצת הצמתים שמשקלה הגדול ביותר מבין הצמתים ברמות 0…L0-1, L1+1…L2-1, L2+1…r, קבע את C להיות הצמתים ברמות L1, L2 וקבע את B להיות כל שאר הצמתים בגרף. • אחרת, כווץ את הצמתים ברמות 0…L0, ומחק את הצמתים ברמות L2...r סמן את הגרף המתקבל ב- G* ואת העץ המתקבל ב- T*.מצא חלוקה A*, B*, C* עבור G* כך ש C* קבוצת הפרדה, באופן הבא: • תהי e קשת שרירותית ב- G* שאינה שייכת לעץ T*, ויהי C(e) המעגל היחיד שנוצר על ידי הקשת e והעץ הפורש T*. • כל עוד C(e) מגדיר חלוקה שבה משקל הצמתים בתוך המעגל או משקל הצמתים מחוץ למעגל גדול מ- 2/3: • שפר את המעגל: ע"י החלפת הקשת e בקשת אחרת סמוכה לה (שאינה קשת עץ), כך שמשקל החלק הגדול יותר מ- 2/3 ייקטן.בחירת הקשת שתשפר את המעגל: סמן ב v,w את הצמתים שנוגעים בקשת e. יהי y הצומת השלישי בפאה שנוגעת ב- e מצידו הכבד מ- 2/3. אם (v,y) או (w,y) קשת עץ, בחר את (w,y) או (v,y) בתור קשת השיפור, בהתאמה. אחרת, ע"י מעקב אחר קשתות עץ בכיוון "מעלה העץ" החל מהצומת Y (ובמידת הצורך החל גם מהצומת w), מצא את הצומת Z הראשונה על המעגל כך ש- yz מסלול פשוט בעץ T*. סרוק את הקשתות שמשמאל למסלול y,z ומימין לו לסירוגין במטרה לחשב את משקל הצמתים בתוך כל חצי מעגל כזה. ברגע שסיימנו לסרוק את אחד מחצאי המעגל, אנו יודעים את משקל כל אחד מחצאי המעגל, בחר בתור קשת השיפור מבין (v,y), (w,y) את זו שיוצרת את חצי המעגל הכבד יותר.

  18. טיפול ברכיבים קשירים

  19. חלק ב' הצגה מסודרת של האלגוריתם

  20. האלגוריתם מצא-קבוצת-הפרדה (G) : • מצא שיכון של G במישור על פי האלגוריתם שגיא הציג בשיעור הקודם (השיכון ייוצג ע"י ה- overlay בעזרת doubly-connected-edges-list ). • בצע טריאנגולציה של הגרף: בכל פאה הוסף קשתות, כך שבגרף המתקבל כל הפאות הם משולשים. • מצא עץ BFS לגרף המתקבל, נסמן את העץ ב- T. • מצא את הרמות L0<=L1<=L2 של העץ T. • הסבר: לכל רמה i חשב את מספר הצמתים ברמה במשתנה L(i). מצא את הרמה L1 כך שמשקל הצמתים עד רמה L1-1 קטן מ- ½, ומשקל הצמתים עד רמה L1 הוא לפחות 1/2. מצא את k = מספר הצמתים עד רמה L1 (כולל). מצא מבין √k הרמות שמעל l1 את הרמה L0 שמספר הצמתים בה הוא לכל היותר √k ומצא מבין √(n-k) הרמות שמתחת ל- L1 את הרמה L2 שמספר הצמתים בה הוא לכל היותר √(n-k). • אם משקל הצמתים ברמות L1+1…L2-1 לכל היותר 2/3 קבע את A להיות קבוצת הצמתים שמשקלה הגדול ביותר מבין שלושת החלקים: הצמתים ברמות 0…L0-1, L1+1…L2-1, L2+1…r, קבע את C להיות הצמתים ברמות L1, L2 וקבע את B להיות כל שאר הצמתים בגרף. החזר: A, B, C. • אחרת, כווץ את הצמתים ברמות 0…L0, ומחק את הצמתים ברמות L2...r סמן את הגרף המתקבל ב- G* ואת העץ המתקבל ב- T*.מצא חלוקה A*, B*, C* עבור G* כך ש C* קבוצת הפרדה, באופן הבא: • תהי e קשת שרירותית ב- G* שאינה שייכת לעץ T*, ויהי C(e) המעגל היחיד שנוצר על ידי הקשת e והעץ הפורש T*. • כל עוד C(e) מגדיר חלוקה שבה משקל הצמתים בתוך המעגל או משקל הצמתים מחוץ למעגל גדול מ- 2/3: • שפר את המעגל: ע"י החלפת הקשת e בקשת אחרת סמוכה לה (שאינה קשת עץ), כך שמשקל החלק הגדול יותר מ- 2/3 ייקטן.בחירת הקשת שתשפר את המעגל: סמן ב v,w את הצמתים שנוגעים בקשת e. יהי y הצומת השלישי בפאה שנוגעת ב- e מצידו הכבד מ- 2/3. אם (v,y) או (w,y) קשת עץ, בחר את (w,y) או (v,y) בתור קשת השיפור, בהתאמה. אחרת, ע"י מעקב אחר קשתות עץ בכיוון "מעלה העץ" החל מהצומת Y (ובמידת הצורך החל גם מהצומת w), מצא את הצומת Z הראשונה על המעגל כך ש- yz מסלול פשוט בעץ T*. סרוק את הקשתות שמשמאל למסלול y,z ומימין לו לסירוגין במטרה לחשב את משקל הצמתים בתוך כל חצי מעגל כזה. ברגע שסיימנו לסרוק את אחד מחצאי המעגל, אנו יודעים את משקל כל אחד מחצאי המעגל, בחר בתור קשת השיפור מבין (v,y), (w,y) את זו שיוצרת את חצי המעגל הכבד יותר. • סמן ב- C* את הצמתים על המעגל, ב- A* את הצמתים "בתוך"(בחלקו הכבד) של המעגל, וב- B* את קבוצת הצמתים ש"מחוץ" למעגל. תגדיר את C להיות הצמתים שב- C* איחוד עם קבוצת הצמתים שברמה L1 וברמה L2. תגדיר את A להיות A*. תגדיר את B להיות כל שאר הצמתים. • פלט: A, B, C. • קלט: גרף מישורי בלתי מכוון G=(V,E) כך שלכל צומת יש משקל ממשי אי-שלילי, וסכום המשקלים לכל היותר 1. • פלט: חלוקה של V לשלוש קבוצות צמתים A, B, C כך שאין קשתות בין הצמתים של A והצמתים של B, גם ב- A וגם ב- B משקל הצמתים לכל היותר 2/3, וגודל הקבוצה C לכל היותר 4* √2 √n.

  21. הוכחת נכונות • את עיקר הוכחת הנכונות כבר ראינו. • אם משקל הצמתים בין הרמות L0+1,…, L2-1 לכל היותר 2/3 אז החלוקה נכונה (כי החלק הכבד ביחד עם C הוא לפחות 1/3 ולכן מה שנשאר לכל היותר 2/3). • אחרת בוחרים קשת שרירותית e שמגדירה מעגל עם העץ T ונכנסים ללולאה שבכל איטרציהמחליפה את הקשת e לפי האלגוריתם. • יש להראות שבכל פעם שמחליפים את הקשת e משקל החלק שמחוץ למעגל או שבתוך המעגל, ואשר היה מעל ל- 2/3באיטרציה הקודמת, ייקטן. ברור שהאלגוריתם "מתכנס" כי אנחנו מרחיבים את המעגל כל הזמן לכיוון הצד שהוא יותר כבד מ- 2/3, ולכן יהיו לכל היותר nאיטרציות.ואכן משקל החלק הכבד יורד, כי ב"מקרה 1" (ראו שקפים קודמים) מורידים צומת מהצד הכבד של המעגל, וב"מקרה 2" בוחרים את חצי המעגל הכבד יותר, ומורידים חתיכה (לפחות 2 צמתים) ממה שהיה החלק הכבד של המעגל. • יש להראות שכאשר החלק שהיה כבד מקבל משקל לכל היותר 2/3 (ואז האלגוריתם עוצר) אזי החלוקה שבפלט היא כנדרש. נסמן ב- C* את המעגל שמתקבל בסוף בלולאה, ונסמן ב- A* את קבוצת הצמתים הכבדה יותר מבין: קבוצת הצמתים שבתוך (ולא על) המעגל C* וקבוצת הצמתים שמחוץ (ולא על) המעגל C*, ונסמן ב- B* את קבוצת כל שאר הצמתים. באיטרציה הקודמתA* U C* U B* > 2/3 ולכן A* U C* >= 1/3, ולכן B לכל היותר 2/3. כמו כן המשקל של A=A* לכל היותר 2/3 כי הלולאה הסתיימה. ומספר הצמתים ב- C לכל היותר 4* √2 √n כי גובה העץ T* לכל היותר √2 √n ולכן מספר הצמתים ב- C* לכל היותר 2* √2 √n, ומספר הצמתים ברמות L1, L2 ביחד לכל היותר 2* √2 √n ( כי √k + √(n-k) <= √2* √n בגלל שפונקצית השורש קמורה). • Q.E.D.

  22. ניתוח סיבוכיות • תזכורת: מספר הקשתות בגרף מישורי לכל היותר 3n-6. לכן O(n+m) = O(n). • מציאת שיכון של G במישור: O(n) לפי ההרצאה הקודמת. • ביצוע טריאנגולציה: עוברים על כל פאה, ובכל פאה "משלמים" (accounting) יחידה אחת לכל קשת בגרף, סה"כ O(n). • חישוב T עץ ה- BFS של G: O(n). • חישוב מספר הצמתים בכל רמה, וסכום משקלי הצמתים בכל רמה. O(n). • מציאת הרמות L0<=L1<=L2 בעזרת מספר הצמתים בכל רמה וסכום משקלי הצמתים בכל רמה: O(n). • כיווץ הצמתים שמעל L0 ומחיקת הצמתים שמתחת L2: O(n). • בלולאה: • מציאת הפאה שהקשת הנוכחית e (שאינה קשת עץ) שייכת לה: O(1) כי יש לנו overlay. • אם יש לה קשת סמוכה שהיא קשת עץ אז O(1) לאותה איטרציה. • אחרת, O() של מספר הצמתים שמורידים מ"תוך" המעגל. • ולכן בכל הלולאה משלמים O(1) לכל צומת, ואז כל הלולאה לוקחת O(n). • סה"כ: O(n).

  23. שאלות? Thank You!

More Related