WEEK 3 • هياكل البيانات

Graph Representation

تمثيل الـ Graph في الذاكرة

إيه هو الـ Graph؟

🕸️ الفكرة الأساسية

📖 تشبيه شبكة الأصدقاء

تخيل Facebook:

  • • كل شخص = Node (عقدة)
  • • الصداقة بين شخصين = Edge (حافة)
  • • الشبكة كلها = Graph!

📊 أنواع الـ Graphs

Undirected (غير موجه)

الاتصال في الاتجاهين

مثال: صداقة Facebook

Directed (موجه)

الاتصال في اتجاه واحد

مثال: متابعة Twitter

Weighted (موزون)

كل edge ليه تكلفة/وزن

مثال: المسافات على الخريطة

Unweighted

كل الـ edges متساوية

مثال: شبكة الأصدقاء

Example Graph

A B C D

Edges: A-B, A-C, A-D, B-D, C-D

طرق التمثيل

إزاي نخزن الـ Graph في الكود؟

Adjacency Matrix

جدول 2D: كل خلية بتقول لو فيه edge ولا لأ

A B C D
A 0 1 1 1
B 1 0 0 1
C 1 0 0 1
D 1 1 1 0
Space:O(V²)
Check Edge:O(1)
Find Neighbors:O(V)

✓ مناسب لو:

الـ graph dense (edges كتير)

Adjacency List

كل node عندها list بالـ neighbors بتوعها

A
[B, C, D]
B
[A, D]
C
[A, D]
D
[A, B, C]
Space:O(V + E)
Check Edge:O(degree)
Find Neighbors:O(degree)

✓ مناسب لو:

الـ graph sparse (edges قليلة)

المقارنة

العملية Matrix List
Space O(V²) O(V+E)
Check if Edge exists O(1) O(V)
Find all neighbors O(V) O(degree)
Add Edge O(1) O(1)
الأفضل لـ Dense Graphs Sparse Graphs

💡 متى تستخدم إيه؟

  • Matrix: لو الـ graph صغير أو محتاج تتحقق من وجود edge كتير
  • List: معظم الـ real-world graphs (sparse) - الخيار الافتراضي

Implementation

Graph.js (Adjacency List)
class Graph {
  constructor() {
    this.adjacencyList = {};
  }

  addVertex(vertex) {
    if (!this.adjacencyList[vertex]) {
      this.adjacencyList[vertex] = [];
    }
  }

  addEdge(v1, v2) {
    this.adjacencyList[v1].push(v2);
    this.adjacencyList[v2].push(v1);
  }

  getNeighbors(vertex) {
    return this.adjacencyList[vertex] || [];
  }

  hasEdge(v1, v2) {
    return this.adjacencyList[v1]?.includes(v2);
  }
}

شرح الكود 📖

adjacencyList: Object، كل key = vertex، كل value = array of neighbors
addVertex(): ضيف node جديدة كـ key بـ array فاضي
addEdge(): ضيف كل vertex في list التاني (undirected)
hasEdge(): شوف لو v2 موجود في list بتاعة v1