מבני נתונים ואלגוריתמים - מחברת קורס/גרפים/גרפים וייצוגיהם
תבנית:מבני נתונים ואלגוריתמים - מחברת קורס
דף זה עוסק בגרפים וייצוגיהם. גרפים הם מבנים מתמטיים פשוטים, המתארים "נקודות" ו"קווים" המחברים בין הנקודות. בשל פשטותם הרבה, הם יכולים למדל בעיות מעניינות רבות.
מהו גרף?
ממשק
הנה הממשק של גרף:
# Returns an array of the vertexes of a graph (G).
V(G)
# Returns an array of the edges of a graph (G).
E(G)
# Returns an array of the adjacent vertexes of a vertex (v) in a graph (G).
A(G, v)
מימושים
רשימה מקושרת
במימוש זה מחזיקים מערך ראשי תבנית:קוד בשורה של רשימות-מקושרות משניות:
- במערך הראשי תבנית:קוד בשורה יש איבר לכל צומת (איבר זה הוא כאמור רשימה מקושרת).
- כל רשימה מקושרת מחזיקה את הצמתים שיש קשת מצומת המוצא אליהם.
במימוש זה, כך נממש את שלוש הפעולות שראינו לעיל:
- תבנית:קוד בשורה - נחזיר את המערך תבנית:קוד בשורה. סיבוכיות הפעולה היא .
- תבנית:קוד בשורה - נעבור בלולאה כפולה על כל חוליות הרשימות המקושרות. בלולאה החיצונית נעבור על המערך הראשי תבנית:קוד בשורה, ובלולאה הפנימית נעבור על חוליות הרשימה המשנית. סיבוכיות הפעולה היא .
- תבנית:קוד בשורה - נמצא את הרשימה המשנית בתוך המערך הראשי תבנית:קוד בשורה בזמן , ונעבור על חוליות הרשימה בלולאה. הסיבוכיות היא , כאשר היא קבוצת השכנים של .
מטריצה
במימוש זה מחזיקים מערך ראשי של מערכים בוליאניים משניים:
- במערך הראשי יש איבר לכל צומת (איבר זה הוא כאמור מערך בוליאני).
- במערך המשני יש איבר בוליאני לכל צומת. איבר זה הוא תבנית:קוד בשורה אמ"ם יש קשת מצומת המוצא לאיבר המתאים.
במימוש זה, כך נממש את שלוש הפעולות שראינו לעיל:
- תבנית:קוד בשורה - בדיוק כמימוש רשימה מקושרת, נחזיר את המערך תבנית:קוד בשורה. סיבוכיות הפעולה היא .
- תבנית:קוד בשורה - נעבור בלולאה כפולה על כל האיברים הבוליאניים. בלולאה החיצונית נעבור על המערך הראשי תבנית:קוד בשורה, ובלולאה הפנימית נעבור על איברי המערך המשני. נחזיר זוגות המתאימים רק לאיברים שערכם תבנית:קוד בשורה. סיבוכיות הפעולה היא .
- תבנית:קוד בשורה - נמצא את המערך המשני בתוך המערך הראשי תבנית:קוד בשורה בזמן , ונעבור על איבריו בלולאה. הסיבוכיות היא .
תכונות
לעתים רוצים לייחס תכונות כלשהן לצמתים, לקשתות, או לשניהם. לדוגמה, ייתכן שנרצה לייחס ערך בוליאני לצומת שמשמעו "נבדק". לחלופין, ייתכן שנרצה לייחס מספר כשלהו לקשת שמשמעו אורך הקשת. כדי ליחס תכונות לצמתים, נשתמש במערכים פשוטים. לדוגמה, קטע הקוד הבא מתאר את זאת שצומת 1 נבדק בגרף לעיל, אבל שאר הצמתים לא:
1 n = Length(V(G))
2 Checked = Make-Array(n)
3 Checked[1] = True
4 for i in [2, ..., n]
5 Checked[i] = False
כדי ליחס תכונות לקשתות, נשתמש בטבלאות ערבול. לדוגמה, קטע הקוד הבא מייחס אורכים לקשתות בגרף לעיל:
1 Distances = Make-Hash()
2 Distances[(1, 4)] = 13
3 Distances[(1, 3)] = 100
4 Distances[(2, 6)] = 2.3
5 Distances[(4, 5)] = 2.3
6 Distances[(3, 4)] = 888
גרפים מכוונים ולא מכוונים
בתרשים הראשון בדף זה ראינו גרף מכוון - גרף שבו יש משמעות לצומת המוצא והיעד של כל קשת.
לפעמים אין משמעות לכוון הקשתות, ונניח שלקשתות אין כוון.
כיצד נתייחס לגרף לא-מכוון?
- בציור הגרף, לא נטרח לצייר לקשתות חיצים.
- בשני הייצוגים השונים, נניח (כלומר, שהקשת מופיעה פעמיים).
- אם לקשתות יש תכונות, נניח של ול יש אותן תכונות.