עצים וגרפיםבינוני5 דק' קריאה
ייצוגי גרפים - מטריצת שכנויות מול רשימת שכנויות
השוואה בין שתי הדרכים העיקריות לייצג גרף בקוד, וההשפעה על ביצועי האלגוריתמים.
כדי לעבוד עם גרף בקוד, צריך לאחסן אותו בזיכרון. שתי הגישות העיקריות הן מטריצת שכנויות (Adjacency Matrix) ורשימת שכנויות (Adjacency List), ולכל אחת יתרונות וחסרונות.
מטריצת שכנויות
מטריצה בגודל V×V שבה matrix[i][j] = 1 אם יש קשת מ-i ל-j (או המשקל שלה בגרף משוקלל), אחרת 0.
// Graph with 4 nodes, edges: 0-1, 0-2, 1-3
const matrix = [
[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 0],
[0, 1, 0, 0],
];
// Check edge: matrix[0][2] === 1 -> O(1)רשימת שכנויות
מערך שבו לכל צומת יש רשימה של שכניו. זה הייצוג הנפוץ יותר בפועל, במיוחד לגרפים דלילים.
const adj = {
0: [1, 2],
1: [0, 3],
2: [0],
3: [1],
};
// Iterate neighbors of 0: O(deg(0))השוואה
| קריטריון | מטריצת שכנויות | רשימת שכנויות |
|---|---|---|
| זיכרון | O(V²) | O(V + E) |
| בדיקה אם יש קשת (u,v) | O(1) | O(deg(u)) |
| מעבר על שכנים של u | O(V) | O(deg(u)) |
| הוספת קשת | O(1) | O(1) |
| מתאים ל- | גרפים צפופים | גרפים דלילים |
ברוב היישומים בעולם האמיתי (רשתות חברתיות, מפות, אינטרנט) הגרפים דלילים - E ≪ V². לכן רשימת שכנויות היא ברירת המחדל בפועל ובאלגוריתמים כמו BFS, DFS ו-Dijkstra.