עצים וגרפיםבינוני6 דק׳ קריאה

חיפוש לרוחב מול חיפוש לעומק - מה ההבדל ומתי להשתמש בכל אחד?

השוואה מלאה בין חיפוש לרוחב לחיפוש לעומק, כולל מבנה הנתונים שמאחורי כל אחד ותרחישי שימוש.

BFS (Breadth-First Search, חיפוש לרוחב) ו-DFS (Depth-First Search, חיפוש לעומק) הם שני אלגוריתמי הסריקה הבסיסיים לגרפים ועצים. שניהם מבקרים את כל הצמתים ב-O(V + E), אך בסדר שונה לחלוטין - עם השלכות שונות על תוצאות החיפוש.

BFS - חיפוש שכבה אחר שכבה

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

function bfs(graph, start) {
  const visited = new Set([start]);
  const queue = [start];
  while (queue.length) {
    const node = queue.shift();
    for (const neighbor of graph[node]) {
      if (!visited.has(neighbor)) {
        visited.add(neighbor);
        queue.push(neighbor);
      }
    }
  }
}

DFS - חיפוש לעומק עד הקצה

DFS מתחיל מהצומת ההתחלתי וממשיך לעומק עד שלא ניתן להמשיך, אז חוזר אחורה ומנסה כיוון אחר. מממש עם מחסנית (Stack) - רקורסיבית או איטרטיבית.

function dfs(graph, node, visited = new Set()) {
  visited.add(node);
  for (const neighbor of graph[node]) {
    if (!visited.has(neighbor)) {
      dfs(graph, neighbor, visited);
    }
  }
}

השוואה

קריטריוןBFSDFS
מבנה נתוניםתור (Queue)מחסנית (Stack)
סדר ביקורשכבה-שכבהלעומק, ואז חזרה
מסלול קצר ביותר?כן (ללא משקלים)לא מובטח
זיכרוןO(רוחב מקסימלי)O(עומק מקסימלי)
עדיף ל-מסלולים קצרים, גרפים רדודיםבדיקת קיום מסלול, topological sort, גרפים עמוקים

Dijkstra ו-A* הם הרחבות של BFS - הם מוסיפים עדיפות (תור עדיפויות) כדי לטפל במשקלי קשתות שונים. כשכל הקשתות שוות - BFS רגיל מספיק ומהיר יותר.

מתי לבחור BFS?

  • מציאת המסלול הקצר ביותר (מספר קצבאות) בגרף לא-משוקלל
  • רשתות חברתיות (מציאת 'מרחק' בין אנשים)
  • בעיות 'שכבות' כמו מציאת רדיוס, חיבוריות לפי עומק

מתי לבחור DFS?

  • בדיקת קיום מסלול בין שני צמתים
  • מציאת מחזורים (Cycle Detection) בגרף
  • Topological Sort של DAG
  • פתרון מבוכים ו-backtracking
  • רכיבים קשירים (Connected Components)

שאלות נפוצות

איזה מבנה נתונים עומד מאחורי כל אלגוריתם?

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

האם DFS יכול למצוא מסלול קצר ביותר?

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

מה צורך יותר זיכרון, BFS או DFS?

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

מאמרים קשורים

ויזואליזציה של אלגוריתמי גרפיםלכל המאמרים