כיצד ליישם חיפוש עומק ראשון (DFS) ב-C++

Kyzd Lyysm Hypws Wmq R Swn Dfs B C



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

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

פעל לפי ההנחיות של מאמר זה ליישום DFS ב-C++.







הטמעת DFS ב-C++

בסעיף הבא, נעבור על איך DFS מיושם ב-C++. אפשר לעקוב אחר השלבים שניתנו ליישום DFS .



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

פסאודוקוד DFS

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



DFS ( ג א )
א. ביקר = נָכוֹן
ל כל b ∈ g. Adj [ א ]
אם ב. ביקר == שֶׁקֶר
DFS ( g,b )
חוֹם ( )
{
עבור כל a ∈ g
א. ביקר = שֶׁקֶר
עבור כל a ∈ g
DFS ( g, א )
}

כאן g, a ו-b מייצגים את הגרף, הצומת והצומת הביקור הראשון בערימה בהתאמה.





הטמעת DFS ב-C++

תוכנית C++ עבור DFS היישום ניתן להלן:



#include
#include
#include<רשימה>
באמצעות מרחב שמות סטד ;
תבנית < סוג שם ט >
מעמד DepthFirstSearch
{
פְּרָטִי :
מַפָּה < t, רשימה < ט > > adjList ;
פּוּמְבֵּי :
DepthFirstSearch ( ) { }
בָּטֵל Add_edge ( ט א, ט ב, bool אתה = נָכוֹן )
{
adjList [ א ] . התנגדות ( ב ) ;
אם ( אתה )
{
adjList [ ב ] . התנגדות ( א ) ;
}
}
בָּטֵל הדפס ( )
{
ל ( אוטומטי אני : adjList ) {
cout << אני. ראשון << '->' ;
ל ( כניסה לא : אני. שְׁנִיָה ) {
cout << כְּנִיסָה << ',' ;
}
cout << endl ;
}
}
בָּטֵל dfs_helper ( t node,map < ט, bool > & ביקר ) {
ביקר [ צוֹמֶת ] = נָכוֹן ;
cout << צוֹמֶת << '' << endl ;
ל ( לא שכן : adjList [ צוֹמֶת ] ) {
אם ( ! ביקר [ שָׁכֵן ] ) {
dfs_helper ( שכן, ביקר ) ;
}
}
}
בָּטֵל DFS ( t src )
{
מַפָּה < ט, bool > ביקר ;
dfs_helper ( src, ביקר ) ;
}
} ;
int רָאשִׁי ( ) {
DepthFirstSearch < int > ז ;
ז. Add_edge ( 0 , 5 ) ;
ז. Add_edge ( 0 , 7 ) ;
ז. Add_edge ( 4 , 7 ) ;
ז. Add_edge ( 7 , 8 ) ;
ז. Add_edge ( 2 , 1 ) ;
ז. Add_edge ( 0 , 6 ) ;
ז. Add_edge ( 2 , 4 ) ;
ז. Add_edge ( 3 , 2 ) ;
ז. Add_edge ( 3 , 6 ) ;
ז. Add_edge ( 7 , 5 ) ;
ז. Add_edge ( 5 , 8 ) ;
ז. הדפס ( ) ;
ז. DFS ( 6 ) ;
cout << endl ;
}

בקוד זה, יישמנו DFS אלגוריתם בעקבות קוד הפסאודו שניתן לעיל. יש לנו 12 זוגות של צמתים. הגדרנו מחלקה ' G ” המייצג גרף בעל קודקודים a ו-b המייצגים צמתים שביקרו ובלתי ביקרו.

תְפוּקָה

סיכום

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