האלגוריתם של ג'ונסון

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

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

האלגוריתם נקרא על שמו של דונלד ב. ג'ונסון, אשר פרסם אותו בשנת 1977‏[1].

תיאור האלגוריתם[עריכת קוד מקור | עריכה]

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

על כן, האלגוריתם "מתקן" את המשקלים בדרך הבאה: הוא מגדיר פונקציה \ h:V\to\mathbb{R} שמתאימה לכל צומת מספר ממשי, ואז מתקנת באמצעותה את המשקל של כל קשת. אם משקל הקשת \ (u,v) היה \ w(u,v), היא מגדירה משקל חדש \ w'(u,v)=w(u,v)+h(u)-h(v). ניתן להראות ששינוי זה של המשקלים לא משנה את התכונה המהותית שנחוצה בגרף - כל מסלול קל ביותר בגרף המקורי הוא קל ביותר גם בגרף החדש (תכונה זו אינה נשמרת אם מגדילים את משקלי כל הקשתות במספר קבוע אחד לכולן, למשל).

כדי למצוא פונקציה \ h שתבטיח שהמשקלים בגרף החדש יהיו כולם חיוביים, אלגוריתם ג'ונסון משתמש באלגוריתם בלמן-פורד בדרך הבאה: ראשית הוא מוסיף לגרף המקורי צומת חדש \ s ומוסיף קשת במשקל 0 מ-\ s אל כל \ v\isin V. כעת הוא מריץ את אלגוריתם בלמן פורד על הצומת \ s. אם האלגוריתם מתריע על מעגל שלילי, אלגוריתם ג'ונסון מודיע זאת ומפסיק. אחרת, הוא משתמש בתוצאת אלגוריתם בלמן פורד כדי להגדיר את הפונקציה \ h כך: \ h(u)=\delta(s,u) כאשר \ \delta(s,u) הוא משקל המסלול הקל ביותר מ-\ s אל \ u. לאחר תיקון המשקלות בגרף המקורי מריץ אלגוריתם ג'ונסון את אלגוריתם דייקסטרה על כל הצמתים, כמתואר לעיל.

משמאל לימין: הגרף המקורי עם משקלות שליליים ; הוספת צומת חדש \ q וקשת במשקל 0 מ-\ q אל כל \ v\isin V והרצת אלגוריתם בלמן פורד על הצומת \ q ; תיקון המשקלות בגרף המקורי

סיבוכיות זמן[עריכת קוד מקור | עריכה]

כיוון שסיבוכיות הזמן של אלגוריתם דייקסטרה היא \ O(E+V\log V) במימוש האופטימלי שלו, והאלגוריתם מורץ \ V פעמים (פעם אחת לכל אחד מהצמתים), סיבוכיות הזמן של חלק זה של האלגוריתם היא \ O(VE+V^2\log V). סיבוכיות בלמן פורד היא \ O(VE) ומכיוון שהוא מורץ רק פעם אחת הוא אינו משפיע על זמן ריצת האלגוריתם.

כאשר הגרף דליל, כלומר מבחינה פורמלית מתקיים \ E \in O(V^2), סיבוכיות האלגוריתם של ג'ונסון תהיה נמוכה מ-\ O(V^3), שהיא הסיבוכיות של אלגוריתמים אחרים לפתרון בעיית המסלולים הקצרים ביותר בין כל שני זוגות צמתים, דוגמת האלגוריתם של פלויד-וורשאל.

הערות שוליים[עריכת קוד מקור | עריכה]

  1. ^ Johnson, Donald B. (1977), "Efficient algorithms for shortest paths in sparse networks", Journal of the ACM 24 (1): 1–13