Professional Documents
Culture Documents
)1
האלגוריתם שנראה דומה לאלגוריתם של צביעת מסילה ,אבל אם שיפור של ביצוע שני שלבים
של האלגוריתם בסיבוב אחד ,כלומר אחרי 3סיבובים נקבל )– O(log log log log log log n
צבעים כמו עשיית 6שלבים.
האלגוריתם:
נתאר מסילה מהצורה הבאה....…>-u->v->t>- :
בכל שלב כל קודקוד שולח את מספרו לשכניו(גם למעלה וגם למטה אם מסתכלים על כיוון
מסוים) .האלגוריתם מתחיל בצורה רגילה כאשר נסתכל על קודקוד ,vהוא מחשב את המספר
החדש שלו כמו בצורה הרגילה הוא משווה את המספר שלו לקודקוד tנקרא לו , v1עכשיו בגלל
שיש לו את המספר של קודקוד uהוא יכול לחשב גם את המספר ש uיקבל כאשר הוא משווה
את עצמו ל vנקרא לו . v 2כלומר עכשיו vמחזיק שני מספרים אחד של עצמו ואחד של הקודקוד
שלפניו ,וזה תקף לכל קודקוד במסילה שעושה אותה פעולה ,עכשיו קודקוד vמחשב את המספר
כאשר הוא משווה את v1ל v 2כלומר המספר שיחושב באלגוריתם הרגיל בסיבוב שני.וזה יהיה
המספר החדש שלו לאחר סיבוב אחד ,כל קודקוד במסילה פועל באופן הבא ולכן לאחר 3
סיבובים תתקבל צביעה של )O(log log log log log log n
ניתוח סיבוכיות:
זמן :לפי ההגדרה נקבל זמן ריצה של 3סיבובים.
צבעים :נקבל מספר של ) O(log log log log log log nצבעים.
)2
האלגוריתם:
נתחיל כך ,נפרק את הגרף לקבוצות עם דרגה חסומה של ,3aלפי אלגוריתם פירוק שלמדנו ,זמן
זה לוקח ) .O(log nעכשיו נצבע עם אלגוריתם של לינאל שצובע בזמן ) O(log*nב ) O(∆2צבעים.
בגלל שיש לנו גרף מכוון עם דרגה מקסימלית של 3aמהפירוק ,אפשר לבצע צביעה של
) . O((3 a)2עכשיו נבצע רדוקציה ל 3a-צבעים כאשר כל קבוצה בנפרד מבצעת את הצביעה
בתוך עצמה .ניתן לעשות זאת ב) O(aלפי אלגוריתם של Barenboim-elkin-goldenbergואז
רדוקציה של Kuhn and wattenhoferשתוריד לצביעה של 3aחוקית בכל קבוצה שנוצרה.עכשיו
נתחיל מהקבוצה האחרונה שנוצרה , H lכל הצלעות יוצאות לקודקודים בקבוצה .ונסתכל על
הקבוצה לפני אחרונה , H l−1כל הצלעות או יוצאות לקבוצה H lאו לקבוצה הנוכחית .נגדיר
צביעה חדשה לשני הקבוצות "ונחבר אותם" הצביעה מוגדרת כך:כל קודקוד בקבוצה H lמקבל
את הצביעה של ¿> ¿ 0 , H lכלומר 0והצביעה המקורית משלב קודם .כל הקודקודים בקבוצה
H l−1מסתכלים על הצלעות היוצאות שלהם לקבוצה , H lמכיוון שהדרגה המקסימלית היא 3a
אז קיים צבע שאין אותו בקבוצה H lוזה היה הצבע הנוסף שלהם והצבע החדש יוגדר:
¿ ¿ ¿ orignal ¿ newכלומר קיבלנו צביעה חוקית של .∆ 2מכיוון שכל קודקוד צבוע חוקית בתוך
עצמו ולפי הגדרת החיבור כל הקודקודים בקבוצות H l−1, H lשיש ביניהים צלעות גם חוקיים.
עכשיו לפי ההגדרה של אלגוריתם Barenboim-elkin-goldenbergכל הקודקודים בקבוצה H l
ישארו באותו הצבע המקורי ,ונוכל לעשות רדוקציה ל ) O(aבזמן ) O(aואז רדוקציה של Kuhn
and wattenhoferשתיקח גם ) .O(aולכן קיבלנו איחוד של הקבוצות ב) O(aזמן לצביעה של .3a
חוזרים על התהליך לכל הקבוצות ,נשים לב שעכשיו מבחינת H l−2האיחוד של H l−1, H lשצבוע
ב 3aצבעים הוא כמו ש H l−1הסתכלה על H lולכן נוכל לבצע אותם שלבים עד שנקבל צביעה
של כל הגרף ב 3aצבעים.
ניתוח סיבוכיות:
זמן :צביעה התחלתית של כל הקבוצות זה ) O(log n + log*n + aהאיחוד של קבוצות לוקח )O(a
והוא נעשה log nפעמים ולכן סה"כ לוקח ) O(a*log nביחד כל השלבים יקחו ) O(a*log nשזה
זמן הריצה של כל האלגוריתם.
)3
באלגוריתם נסתמך על שאלה ,2כלומר צביעה של גרף עם יעריות aב 3aצבעים ב ).O(a*log n
האלגוריתם:
נסתכל על התת גרף המושרה ע"י קבוצת הקודקודים הצבועים באותו צבע מהתחום {}p,.…,1,2
נגדיר צבע זה בתור . u pלפי הגדרת השאלה יודעים שהיעריות של תת הגרף חסומה ע"י
) ,O(a/pולכן נוכל לצבוע את הגרף ב ) O(a/pצבעים ב ) O((a/p)*log nזמן לפי פתרון תרגיל ,2
נגדיר צבע זה בתור .ucכל קודקוד יהיה צבוע בצבע הבא ,¿ uc ,u p> ¿ :ולכן סה"כ צבעים .O(a) :
הוכחת נכונות:
כל שכן של קודקוד היה בתהחלה באותו צבע כמו שלו מהתחום { }p…,1,2או שהיה שונה ממנו,
אם הוא מאותו התחום אז לפי הצביעה שהגדרנו ucיהיה שונה ולכן הצבעים היו שונים ,אם הם
היו בצבע התחלתי שונה u pיהיה שונה ,ולכן הצביעה חוקית.
ניתוח סיבוכיות:
זמן :זמן הריצה הוא כמו של פתרון תרגיל ,2ולכן הוא ).O((a/p)*log n
)4
נתחיל מצביעה של קודקודי Uכאשר נסתכל רק על הצלעות בתוך הקבוצה .Uהצביעה תתבצע
ב ∆ √ , 3עושים פירוק ל ∆ √יערות ,ואז צביעה ב 3צבעים .סה"כ זמן ) O(log*nכנדרש בינתיים.
עכשיו נבצע גרסא לינאל בצורה שונה טיפה,נגדיר מספר ראשוני qכך ש ∆ ,2 ∆< q< 4נסתכל על
הפולינומים ממעלה ∆ √ . qזה מספר גדול מ ∆ √ 3ולכן נוכל להתאים לכל פולינום צביעה יחודית
מהצביעה שחישבנו לקבוצה .Uעכשיו כל קודקוד בקבוצה ,Wמחשב נק אחת מהצורה { }x,yלפי
פירוק מסוים כאשר x,y<qזה ניתן לעשות מכיוון שהטווח של { }q,qהוא ¿) O( ∆¿¿ 2לעומת
הטווח של Wשהוא (∆)Oאת הפירוק אפשר להגדיר ש x*y=cכאשר cהוא הצבע המקורי של
הקודקוד ב .Wעכשיו נמשיך לפי לינאל ,כל קודקוד בקבוצה Uשולח את צבעו לשכניו ב ,Uוכל
קודקוד ב Wשולח את הצבע { }x,yשחושב .לכל קודקוד ב Uיש ∆ √ חיתוכים על פולינומים של
קודקודים ב,Uהמקס של השכני הוא ∆ √ לפי השאלה ולכן יש ∆ התנגשויות עם קודקודי ,Uויש
מקס ∆ שכנים ב Wל ,Uוכל שכן מייצג נקודה אחת ולכן סה"כ יש מקס ∆ 2התנגשויות ,ולכן יש
קורדינטה אחת rמכיוון ש 2 ∆< qולכן הצבע החדש של קודקודי Uיהיה מהצורה {) }r,P(rכמות
הצבעים ב Uהיא q 2< 16 ∆2שזה ( ∆2)Oאנחנו מכוונים ל.(∆)O -
נמשיך לסיבוב נוסף כאשר נבחר פולינומים ממעלה של ,3כאשר ,( √ ∆)q=Oולכן כמות
הפולינומים השונים היא .q 4כל פולינום נחתך עם כל שכן ב Uב 3נק לכל היותר ,נגדיר לכל
קודקוד ב Wמספר חדש { }x,yבאופן דומה לסיבוב הראשון ,כאשר .x,y<qכאשר נפרק כך x :ייצג
את המספר בצביעה המקורית של Wחלקי ∆ √ ו – yייצג √ ∆ modכלומר x*√ ∆ +y = cכאשר c
זה הצביעה המקורית .ולכן הטווח של xיהיה ∆ √ .ומספר ההתנגשויות הכולל של קודקוד מ Uעם
קודקוד מ Wיהיה חסום ב ,xכלומר ∆ √.
נדרוש ש √ ∆ q>4מכיוון שכל קודקוד ב Uיש לכל היותר √ ∆ 3חיתוכים עם שכנים ב ,Uומספר
החיתוכים עם שכנים ב Wהוא ∆ √ ולכן יש קורדינטה אחת שאין בה התנגשות והצביעה {)}r,P(r
תיהיה הצביעה החדשה ולכן הגענו לסה"כ צביעה של כל הגרף ב .(∆)O
)5
בגרף מישורי היעריות חסומה ע"י ,3כלומר .a<=3אפשר לפרק כל גרף ל q*aיעריות בזמן של
¿¿ log n
= . qנפרק ל q*aיערות ,כל יער ניתן לצבוע ב 3-צבעים בזמן של ( Oנגדיר את )\3 )
log q
) , O(log*nסה"כ צבעים קיבלנו 3q∗aמכיוון שיש q*aיערות .נחשב את כמות הצבעים לפי a
שחסום ע"י 3ו qשהגדרנו 3q∗a=3(log¿¿3 logn)=O ¿¿ :ולכן קיבלנו ) O(log nצבעים כנדרש בשאלה.
נחשב את סיבוכיות הזמן :שלב הצביעה בהתחלה לוקח ) O(log*nשלב הפירוק לוקח ¿ Oולכן
סה"כ סיבוכיות היא ¿ O
)6
נשתמש באלגוריתם המבוזר הרנדומי שלמדנו שצובע גרף ב ∆ 2צבעים ) , O( √ log nכל קודקוד
יסתכל על ה log nצלעות שיוצאות ממנו ,יחליט אם להשאיר את הצבע שלו אם הוא שונה מכל
הקודקודים האלו ,ולכן לפי האלגוריתם כמות השכנים שכל פעם קודקוד מסתכל עליהים היא לכל
היותר log nולפי ניתוח סיבוכיות של האלגוריתם ניתן (לא מתייחסים לשאר הקודקודים כרגע)
נוכל לצבוע ב log n -צבעים בזמן ).O( √ log n
אבל:
יש בעיה באלגוריתם ,אם קודקוד uבשלב מסוים בחר צבע ,כלומר כל הקודקודים שהוא מסתכל
עליהים בחרו צבע שונה באותו סיבוב נסתכל על קודקוד vלמשל שיש צלע מ uל vעם אורנטציה
יוצאת .לא בהכרח שקודקוד vיבחר את הצבע להיות הצבע הסופי באותו סיבוב .ולכן אם בסיבוב
מאוחר יותר קודוקד vמסתכל על הקודקודים שבצלעות עם האורנטציה היוצאת ורואה שכל
שהצבע שלו שונה מכולם ,הוא יכול בטעות לבחור אותו צבע כמו ,!uבנוסף בשלב הסופי של
האלגוריתם כאשר צובעים חלקים קשירים עם רדיוס מקסימלי של ) O( √ log nעם log nצבעים
באלגוריתם המקורי לכל רכיב יש ראש שלומד את הרכיב וצובע אותו אבל מכיוון שהוא יכול
ללמוד את כל השכנים של כל הקודקודים ,אבל יש אותה בעיה ,קודקוד מסתכל רק על השכנים
עם האורנטציה היוצאת ,וקודקודים שבחרו צבע באחד הסיבובים ומסתכלים עליו לא נחשבים
כביכול ולכן יכול להיות מקרה של צביעה באותו צבע ,מה שלא קורה באלגוריתם המקורי.
ולכן ניתוח הסיבוכיות לא מסתדר.
נתקן את האלגוריתם כך שהניתוח בכל שלב יהיה אותו דבר ולכן הוא יוכל לעבוד.
התיקון שנעשה הוא כך:
כל קודקוד יגידר לעצמו צבע < >i,cכאשר .O( √ log n)=<i<0
בכל סיבוב iקודקוד uשמגריל צבע מסוים cששונה מכל הקודקודים שהוא מסתכל עליהים יגדיר
את הצבע שלו להיות <. >i,cולכן אם בסיבוב j>iקודקוד vש uהסתכל עליו מגריל אותו צבע c
והוא שונה מכל הקודקודים שהוא מסתכל עליהים-שלא כוללים את uהוא יבחר את הצבע <>j,c
ששונה מהצבע < ,>i,cולכן הצביעה חוקית! בשלב האחרון כל רכיב יכול לבצע צביעה של של
עצמו כאשר הוא מגדיר את הצבע שלו להיות מספר הסיבוב האחרון ,1+ולכן יוכל לצבוע את כל
הרכיב שלו כאשר הוא רק מתייחס לקודקודים שבתוך הרכיב ,מכיוון שכל שאר הקודקודים בחרו
צבע בסיבוב מוקדם יותר.
סה"כ מספר הצבעים הוא ).O(log n √ log nמכיוון שהטווח של iהוא √ log nואנחנו מגרילים
מספר בגודל של .log nזמן הריצה הוא ) O( √ log nלפי האלגוריתם המקורי.
)7
באלגוריתם הרגיל של צביעה של גרף ב )∆( 3Oצריכים למצא אורנטצייה לכיוון הצלעות כדי לקבל
∆ עצים .נגדיר את האורנטציה הפשוטה כך שצלעות יכוונו ל IDגדול יותר ,במודל שאנחנו
מתעסקים ה ID-של כל קודקוד נשמר ב ,ROMאנחנו נמספר את האורנטציה שיוצאת.המספור
יתבצע לפי מספר מהקטן לגדול ,כלומר אם יוצאות צלעות ממני אם IDבסוך הצלעות של 5,4,7
אז המספור שיתקבל הוא 1,0,2בהתאמה.כל קודקוד מחזיק מידע ב RAMלגבי כל הצלעות שלו,
כאשר לכל צלע יש אורנטציה(נכנסת יוצאת),וצבע נוכחי לכל מספור של אורנטציה(כל הצלעות
שיוצאות).כל סיבוב קודקוד שולח את ה IDלכל שכניו,והצבע הנוכחי לפי כל האורנטציות שלו
(בהתחלה הערכים ריקים וצריכים אתחול כמובן זה יקרה תוך סיבוב אחד) .כל סיבוב קודקוד
שולח ומקבל ערכים מכל שכניו ,כאשר הוא מתייחס רק לאורנטציה יוצאת(כלומר קודקוד אב
ששולח לו את הצבע) – שאפשר לחשב נכונות כל פעם מחדש מבחינת הצבע.את הצביעה של
המסילה(עץ כביכול )..נעשה לפי האלגוריתם המבוזר מתייצב במדריך הלמידה ,אם קרתה
תקלה אנחנו עושים צביעה מחדש ומוסיפים סיבית של .failureאנחנו מניחים שה IDשנשלח כל
פעם הוא נכון ,אבל האורנטציה יכלה להשתנות וגם הצבע יכל להשתנות כי זה ערכים שנשמרים
ב RAMולכן כל סיבוב נוכל לקבוע האם הערכים שיש לנו\קיבלנו מהשכנים נכונים ,וזה נכון לכל
קודקוד בגרף .כאשר מתגלה תקלה נוכל לזהות באותו סיבוב ולעשות צביעה מחדש ,אם
האורנטציות\המספור\הצבע של האורנטצייה של קודקוד כלשהו השתנו ,הוא ישלח לכל שכניו את
הצבעים שלו לפי כל האורנטציות ,את האורנטציה בכל מקרה אפשר לחשב מחדש כל פעם
בקלות ולכן קודקודים יוכלו להתייחס בהתאם ,אם הצבע שגוי ,האלגוריתם שיש במדריך
מתמודד אם זה כפי שהסברנו מקודם ,כאשר יש מספור שונה ,הקודקוד יוכל לחשב מחדש את
המספור ולעשות צביעה מחדש למספור הנוכחי ולהתחיל צביעה מחדש לאורנטציה ,הקודקודים
שקיבלו צבע יוכלו לבדוק האם הוא תקין מבחינתם לצביעה הנוכחית של האורנטציה ,ולהתייחס
כמו באלגוריתם במדריך כלומר אם הצבע תקין להתייחס אליו אם לא אז לבצע צביעה מחדש.
כמו בהוכחת הנכונות של האלגוריתם המבוזר מתייצב במדריך הלמידה ,אם בסיבוב אחד לא
קרתה תקלה אז הצביעה חוקית וקטנה ב ) O(log nכל פעם בכל עץ ,עד שתגיע לצביעה של
)∆( ,3Oכאשר יש תקלה שהצבע לא נכון ,המספור של הצלעות השתנה ולכן נשלח צבע לא נכון
מתקיים אותו נוהל של תקלה באלגוריתם ,מוסיפים סיבית failureומחשבים צביעה לפי הID
מחדש ,ולכן כל סיבוב הצביעה החוקית נשמרת .לאחר ) O(log*nסיבובים מרגע סיום תקלות\
תקיפה במערכת הצביעה תתייצב שוב ל 3O (∆) -צבעים.