מה זה BFS?
Breadth-First Search (BFS) מבוסס על חציית צמתים על ידי הוספת השכנים של כל צומת לתור המעבר החל מצומת השורש. ה-BFS עבור גרף דומה לזה של עץ, למעט העובדה שלגרפים עשויים להיות מחזורים. בניגוד לחיפוש עומק ראשון, כל הצמתים השכנים בעומק נתון נחקרים לפני שממשיכים לשלב הבא.
אלגוריתם BFS
להלן השלבים הכרוכים בשימוש בחיפוש רוחב ראשון כדי לחקור גרף:
- קח את הנתונים עבור מטריצת הסמיכות או רשימת הסמיכות של הגרף.
- צור תור ומלא אותו בפריטים.
- הפעל את צומת השורש (כלומר לקבל את צומת השורש בתחילת התור).
- הפוך את ראש התור לתור (או אלמנט ראשוני), ולאחר מכן תור את כל הצמתים הסמוכים של התור משמאל לימין. פשוט תורידו את הראש וחזרו לפעולה אם לצומת אין צמתים קרובים שצריך לחקור. (הערה: אם מגיח שכן שנחקר בעבר או נמצא בתור, אל תעמיד אותו בתור; במקום זאת, דלג עליו.)
- המשך בצורה זו עד שהתור ריק.
יישומי BFS
בגלל הגמישות של האלגוריתם, Breadth-First Search שימושי למדי בעולם האמיתי. אלה כמה מהם:
- ברשת עמית לעמית מגלים צמתים עמיתים. רוב לקוחות הטורנט, כגון BitTorrent, uTorrent ו-qBittorent, משתמשים בתהליך זה כדי למצוא 'זרעים' ו'עמיתים' ברשת.
- האינדקס נבנה באמצעות טכניקות מעבר גרפים בסריקת אינטרנט. הפרוצדורה מתחילה בדף המקור כצומת השורש ופועלת למטה לכל הדפים המשניים המקושרים לדף המקור (ותהליך זה ממשיך). בגלל העומק המופחת של עץ הרקורסיה, לחיפוש רוחב-ראשון יש יתרון מובנה כאן.
- השימוש במערכות ניווט GPS באמצעות ה-GPS, ערוך חיפוש ברוחב ראשון לאיתור אתרים סמוכים.
- הטכניקה של צ'ייני, המשתמשת בקונספט של חיפוש רוחב ראשון, משמשת לאיסוף אשפה.
דוגמה BFS Traversal
כדי להתחיל, בואו נסתכל על דוגמה פשוטה. נתחיל עם 0 כצומת השורש ונמשיך במורד הגרף.
המרת מחרוזת ל-char java
שלב 1: תור (0)
תוֹר
0 |
שלב 2: Dequeue(0), Enqueue(1), Enqueue(3), Enqueue(4)
תוֹר
1 | 3 | 4 |
שלב 3: תור(1), תור(2)
שם מוצרי איפור
תוֹר
3 | 4 | 2 |
שלב 4: Dequeue(3), Enqueue(5). לא נוסיף שוב 1 לתור כי 0 כבר נחקר.
תוֹר
4 | 2 | 5 |
שלב 5: תור (4)
תוֹר
מיון רשימה לפי Java
2 | 5 |
שלב 6: תור (2)
תוֹר
java הוא ריק
5 |
שלב 7: תור (5)
תוֹר
התור ריק כעת ולכן נעצור את התהליך.
תוכנית Java לחיפוש רוחב ראשון
ישנן מספר גישות להתמודדות עם הקוד. בעיקר נדון בשלבים הכרוכים בהטמעת חיפוש ראשון ברוחב ב-Java. ניתן להשתמש ברשימת סמיכות או מטריצת סמיכות לאחסון גרפים; כל אחת מהשיטות מקובלת. רשימת הסמיכות תשמש לייצוג הגרף שלנו בקוד שלנו. בעת הטמעת אלגוריתם Breadth-First Search ב-Java, הרבה יותר קל להתמודד עם רשימת הסמיכות, מכיוון שעלינו לעבור רק ברשימת הצמתים המחוברים לכל צומת לאחר שהצומת מוציא את התור מהראש (או ההתחלה) של הצומת. תוֹר.
הגרף המשמש להדגמת הקוד יהיה זהה לזה ששימש בדוגמה הקודמת.
BFSTraversal.java
import java.io.*; import java.util.*; public class BFSTraversal { private int node; /* total number number of nodes in the graph */ private LinkedList adj[]; /* adjacency list */ private Queue que; /* maintaining a queue */ BFSTraversal(int v) { node = v; adj = new LinkedList[node]; for (int i=0; i<v; i++) { adj[i]="new" linkedlist(); } que="new" void insertedge(int v,int w) adj[v].add(w); * adding an edge to the adjacency list (edges are bidirectional in this example) bfs(int n) boolean nodes[]="new" boolean[node]; initialize array for holding data int a="0;" nodes[n]="true;" que.add(n); root node is added top of queue while (que.size() !="0)" n="que.poll();" remove element system.out.print(n+' '); print (int i="0;" < adj[n].size(); iterate through linked and push all neighbors into if (!nodes[a]) only insert nodes they have not been explored already nodes[a]="true;" que.add(a); public static main(string args[]) bfstraversal graph="new" bfstraversal(6); graph.insertedge(0, 1); 3); 4); graph.insertedge(4, 5); graph.insertedge(3, graph.insertedge(1, 2); 0); graph.insertedge(2, graph.insertedge(5, system.out.println('breadth first traversal is:'); graph.bfs(0); pre> <p> <strong>Output:</strong> </p> <pre> Breadth First Traversal for the graph is: 0 1 3 4 2 5 </pre> <hr></v;>