בעיית הנתיב היא בעיה מהותית בתורת המורכבות החישובית הכרוכה במציאת נתיב בין שני קודקודים בגרף. בהינתן גרף G = (V, E) ושני קודקודים s ו-t, המטרה היא לקבוע אם קיים נתיב מ-s ל-t ב-G.
כדי לפתור את בעיית הנתיב, גישה אחת היא להשתמש באלגוריתם סימון. אלגוריתם הסימון הוא טכניקה פשוטה ויעילה שניתן להשתמש בה כדי לקבוע אם קיים נתיב בין שני קודקודים בגרף.
האלגוריתם פועל באופן הבא:
1. התחל בסימון קודקוד ההתחלה s כמו ביקר.
2. עבור כל קודקוד v הסמוך ל-s, סמן את v כמו ביקר והוסף אותו לתור.
3. בזמן שהתור לא ריק, חזור על השלבים הבאים:
א. הסר קודקוד u מהתור.
ב. אם u הוא קודקוד המטרה t, אז נמצא נתיב מ-s ל-t.
ג. אחרת, עבור כל קודקוד v הסמוך ל-u שלא ביקר בו, סמן את v כביקור והוסף אותו לתור.
אלגוריתם הסימון משתמש באסטרטגיית חיפוש רוחב-תחילה (BFS) כדי לחקור את הגרף ולסמן קודקודים כמו ביקרו. על ידי כך, הוא מבטיח ביקור בכל קודקוד שניתן להגיע אליו מקודקוד ההתחלה, מה שמאפשר לאלגוריתם לקבוע אם קיים נתיב בין קודקודי ההתחלה והיעד.
מורכבות הזמן של אלגוריתם הסימון היא O(|V| + |E|), כאשר |V| הוא מספר הקודקודים בגרף ו- |E| הוא מספר הקצוות. הסיבה לכך היא שהאלגוריתם מבקר בכל קודקוד ובכל קצה פעם אחת. מבחינת תיאוריית המורכבות החישובית, אלגוריתם הסימון שייך למחלקה P, המייצגת בעיות שניתן לפתור בזמן פולינומי.
להלן דוגמה להמחשת היישום של אלגוריתם הסימון:
שקול את הגרף הבא:
A --- B --- C | | D --- E --- F
נניח שאנו רוצים לקבוע אם יש נתיב מקודקוד A לקודקוד F. אנו יכולים להשתמש באלגוריתם הסימון באופן הבא:
1. התחל בסימון קודקוד A כמו ביקר.
2. הוסף קודקוד A לתור.
3. הסר את קודקוד A מהתור.
4. סמן את קודקוד B כמבקר והוסף אותו לתור.
5. הסר את קודקוד B מהתור.
6. סמן את קודקוד C כמבקר והוסף אותו לתור.
7. הסר את קודקוד C מהתור.
8. סמן את קודקוד D כמבקר והוסף אותו לתור.
9. הסר את קודקוד D מהתור.
10. סמן את קודקוד E כמבקר והוסף אותו לתור.
11. הסר את קודקוד E מהתור.
12. סמן את קודקוד F כמבקר.
13. מכיוון שקודקוד F הוא קודקוד המטרה, נמצא נתיב מ-A ל-F.
בדוגמה זו, אלגוריתם הסימון קובע בהצלחה שיש נתיב מקודקוד A לקודקוד F.
בעיית הנתיבים בתורת המורכבות החישובית כוללת מציאת נתיב בין שני קודקודים בגרף. אלגוריתם הסימון הוא טכניקה פשוטה ויעילה שניתן להשתמש בה כדי לפתור בעיה זו על ידי ביצוע חיפוש ברוחב ראשון וסימון קודקודים כפי שביקרתם. לאלגוריתם יש מורכבות זמן של O(|V| + |E|) והוא שייך למחלקה P.
שאלות ותשובות אחרונות אחרות בנושא מוּרכָּבוּת:
- האם מחלקה PSPACE לא שווה למחלקה EXPSPACE?
- האם מחלקת המורכבות P היא תת-קבוצה של מחלקת PSPACE?
- האם נוכל להוכיח שמחלקות Np ו-P זהות על ידי מציאת פתרון פולינום יעיל לכל בעיה שלמה של NP ב-TM דטרמיניסטי?
- האם מחלקת NP יכולה להיות שווה למחלקה EXPTIME?
- האם יש בעיות ב-PSPACE שעבורן אין אלגוריתם NP ידוע?
- האם בעיית SAT יכולה להיות בעיה שלמה של NP?
- האם בעיה יכולה להיות במחלקת מורכבות NP אם יש מכונת טיורינג לא דטרמיניסטית שתפתור אותה בזמן פולינומי
- NP היא מחלקה של שפות שיש להן מאמת זמן פולינומי
- האם P ו-NP הם בעצם אותה דרגת מורכבות?
- האם כל הקשר הוא שפה חופשית בשיעור המורכבות P?
צפו בשאלות ותשובות נוספות ב-Complexity