חזרה למאמרים
עצים וגרפיםבינוני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))
מעבר על שכנים של uO(V)O(deg(u))
הוספת קשתO(1)O(1)
מתאים ל-גרפים צפופיםגרפים דלילים

ברוב היישומים בעולם האמיתי (רשתות חברתיות, מפות, אינטרנט) הגרפים דלילים - E ≪ V². לכן רשימת שכנויות היא ברירת המחדל בפועל ובאלגוריתמים כמו BFS, DFS ו-Dijkstra.