אלגוריתם חיפוש לרוחב – הבדלי גרסאות

מתוך ויקיפדיה, האנציקלופדיה החופשית
תוכן שנמחק תוכן שנוסף
תיקון שגיאה
שיטת הסריקה הרוחבית, הBFS, משמשת כבסיס למספר אלגוריתמים, 2 מהם כבר היו מצוינים כאן בערך, ואני הוספתי את "אדמונדס-קארפ" שמשתמש בשיטה כדי למיין לעצמו מסלולים מקדקוד התחלה לקדקוד יעד לפי מספר הקשתות במסלול.
שורה 2: שורה 2:
'''אלגוריתם חיפוש לרוחב''' ([[אנגלית]]: '''Breadth-first search''', [[ראשי תיבות]]: '''BFS''') הוא [[אלגוריתם]] המשמש למעבר על צומתי [[גרף (תורת הגרפים)|גרף]], לרוב תוך [[אלגוריתם חיפוש|חיפוש]] צומת המקיים תכונה מסוימת. צומת כלשהו בגרף נקבע להיות הצומת ההתחלתי <math>V_0</math>, והאלגוריתם עובר על כל הצמתים במרחק צלע אחת מ<math>V_0</math>, ואז על כל הצמתים במרחק 2 צלעות מ<math>V_0</math> וכן הלאה . צורת חיפוש זו היא חיפוש לרוחב הגרף, בניגוד ל[[אלגוריתם חיפוש לעומק|חיפוש לעומק הגרף]].
'''אלגוריתם חיפוש לרוחב''' ([[אנגלית]]: '''Breadth-first search''', [[ראשי תיבות]]: '''BFS''') הוא [[אלגוריתם]] המשמש למעבר על צומתי [[גרף (תורת הגרפים)|גרף]], לרוב תוך [[אלגוריתם חיפוש|חיפוש]] צומת המקיים תכונה מסוימת. צומת כלשהו בגרף נקבע להיות הצומת ההתחלתי <math>V_0</math>, והאלגוריתם עובר על כל הצמתים במרחק צלע אחת מ<math>V_0</math>, ואז על כל הצמתים במרחק 2 צלעות מ<math>V_0</math> וכן הלאה . צורת חיפוש זו היא חיפוש לרוחב הגרף, בניגוד ל[[אלגוריתם חיפוש לעומק|חיפוש לעומק הגרף]].


חיפוש לרוחב סורק את הגרף בצורה שמבטיחה שכל צומת שנמצא באותו [[גרף קשיר#רכיבי קשירות| רכיב קשירות]] של הצומת ההתחלתי ייבדק, וסריקה זו נעשית בזמן אופטימלי, הליניארי למספר הקשתות והצמתים בגרף. בשל כך, חיפוש לרוחב מהווה בסיס לאלגוריתמים רבים שפועלים על גרפים, בהם [[אלגוריתם דייקסטרה]] ו[[האלגוריתם של פרים]].
חיפוש לרוחב סורק את הגרף בצורה שמבטיחה שכל צומת שנמצא באותו [[גרף קשיר#רכיבי קשירות| רכיב קשירות]] של הצומת ההתחלתי ייבדק, וסריקה זו נעשית בזמן אופטימלי, הליניארי למספר הקשתות והצמתים בגרף. בשל כך, חיפוש לרוחב מהווה בסיס לאלגוריתמים רבים שפועלים על גרפים, בהם [[אלגוריתם דייקסטרה]], [[האלגוריתם של פרים]] ו[[האלגוריתם של אדמונדס-קארפ]].


פלט האלגוריתם, המכונה עץ החיפוש לרוחב (BFS), מקיים את התכונה שהמסלול משורש העץ לכל אחד מהצמתים הוא המסלול בעל מספר הצלעות הנמוך ביותר בגרף המקורי, ובגרף שאינו [[גרף ממושקל]] הוא גם המסלול הקצר ביותר.
פלט האלגוריתם, המכונה עץ החיפוש לרוחב (BFS), מקיים את התכונה שהמסלול משורש העץ לכל אחד מהצמתים הוא המסלול בעל מספר הצלעות הנמוך ביותר בגרף המקורי, ובגרף שאינו [[גרף ממושקל]] הוא גם המסלול הקצר ביותר.

גרסה מ־14:18, 12 ביולי 2019

סדר סריקת הקודקודים בחיפוש לרוחב

אלגוריתם חיפוש לרוחב (אנגלית: Breadth-first search, ראשי תיבות: BFS) הוא אלגוריתם המשמש למעבר על צומתי גרף, לרוב תוך חיפוש צומת המקיים תכונה מסוימת. צומת כלשהו בגרף נקבע להיות הצומת ההתחלתי , והאלגוריתם עובר על כל הצמתים במרחק צלע אחת מ, ואז על כל הצמתים במרחק 2 צלעות מ וכן הלאה . צורת חיפוש זו היא חיפוש לרוחב הגרף, בניגוד לחיפוש לעומק הגרף.

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

פלט האלגוריתם, המכונה עץ החיפוש לרוחב (BFS), מקיים את התכונה שהמסלול משורש העץ לכל אחד מהצמתים הוא המסלול בעל מספר הצלעות הנמוך ביותר בגרף המקורי, ובגרף שאינו גרף ממושקל הוא גם המסלול הקצר ביותר.

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

תיאור אינטואיטיבי

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

תיאור פורמלי

קטע הקוד הבא הוא פסאודו קוד.

   function breadthFirstSearch (Start, Goal)
   { 
       enqueue(Queue,Start)
       setVisited(start)
       while notEmpty(Queue)
       {
           Node := dequeue(Queue)
           if Node = Goal
           {
               return Node
           }
           for each Child in Expand(Node)
           {
               if notVisited(Child)
               {              
                   setVisited(Child)
                   enqueue(Queue, Child)
               }
           }
       }
   }

ראו גם

קישורים חיצוניים