গ্রাফ মডেলিং: Adjacency Matrix এবং Adjacency List

গ্রাফ (Graph in C) - সি দিয়ে ডেটা স্ট্রাকচার (DSA using C) - Computer Programming

410

গ্রাফ মডেলিং: Adjacency Matrix এবং Adjacency List

গ্রাফ একটি নন-লিনিয়ার ডেটা স্ট্রাকচার যা ভেরটেক্স (vertices) এবং তাদের মধ্যে সংযোগকারী এজ (edges) দ্বারা গঠিত। গ্রাফ মডেলিং এমন একটি প্রক্রিয়া যা গ্রাফের গঠন এবং এর সংযোগগুলোকে একটি নির্দিষ্ট ডেটা স্ট্রাকচারে প্রজেক্ট করে। গ্রাফ মডেলিংয়ের জন্য সাধারণত দুটি পদ্ধতি ব্যবহৃত হয়: Adjacency Matrix এবং Adjacency List


১. Adjacency Matrix

Adjacency Matrix একটি 2D অ্যারে (ম্যাট্রিক্স) যা একটি গ্রাফের প্রতিটি ভেরটেক্সের মধ্যে সম্পর্ক বা সংযোগ প্রতিনিধিত্ব করে। এই ম্যাট্রিক্সে, matrix[i][j] মানে হল যে ভেরটেক্স i এবং ভেরটেক্স j এর মধ্যে একটি এজ আছে কিনা।

গঠন:

  • যদি গ্রাফটি ডিরেক্টেড (directed) হয়, তাহলে matrix[i][j] = 1 বা matrix[i][j] = 0 এর মাধ্যমে নির্দেশ করা হয় যে i থেকে j তে একটি এজ রয়েছে কিনা।
  • যদি গ্রাফটি আনডিরেক্টেড (undirected) হয়, তাহলে matrix[i][j] = 1 এবং matrix[j][i] = 1 হবে।

ধাপ:

  1. একটি 2D অ্যারে তৈরি করুন যার সাইজ V x V (V হচ্ছে ভেরটেক্সের সংখ্যা)।
  2. যদি ভেরটেক্স i এবং ভেরটেক্স j এর মধ্যে এজ থাকে, তাহলে matrix[i][j] তে 1 সেট করুন, অন্যথায় 0 রাখুন।

উদাহরণ:

ধরা যাক আমাদের একটি গ্রাফ রয়েছে, যার 4টি ভেরটেক্স (A, B, C, D) এবং এজসমূহ (A -> B, B -> C, C -> D, D -> A)। এর জন্য Adjacency Matrix হবে:

    A  B  C  D
A [ 0, 1, 0, 0 ]
B [ 0, 0, 1, 0 ]
C [ 0, 0, 0, 1 ]
D [ 1, 0, 0, 0 ]

সি প্রোগ্রামে Adjacency Matrix এর ইমপ্লিমেন্টেশন:

#include <stdio.h>

#define V 4  // ভেরটেক্সের সংখ্যা

void printMatrix(int graph[V][V]) {
    for (int i = 0; i < V; i++) {
        for (int j = 0; j < V; j++) {
            printf("%d ", graph[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int graph[V][V] = {
        {0, 1, 0, 0},
        {0, 0, 1, 0},
        {0, 0, 0, 1},
        {1, 0, 0, 0}
    };

    printf("Adjacency Matrix:\n");
    printMatrix(graph);

    return 0;
}

২. Adjacency List

Adjacency List গ্রাফের একটি বহুল ব্যবহৃত উপস্থাপন পদ্ধতি, যেখানে প্রতিটি ভেরটেক্সের জন্য একটি লিঙ্কড লিস্ট (বা অ্যারে) থাকে, এবং ওই লিস্টে সেই ভেরটেক্সের সাথে সংযুক্ত সব ভেরটেক্সের রেফারেন্স থাকে। এই পদ্ধতিতে, গ্রাফের সংযোগগুলি কেবলমাত্র যে ভেরটেক্সগুলির মধ্যে একটি সম্পর্ক আছে তাদের মধ্যে সংরক্ষিত হয়, ফলে মেমরি দক্ষতা বৃদ্ধি পায়।

গঠন:

  • প্রতিটি ভেরটেক্স একটি লিস্ট ধারণ করে, এবং প্রতিটি লিস্টের মধ্যে ভেরটেক্সের সাথে সংযুক্ত অন্যান্য ভেরটেক্সের মান থাকবে।

উদাহরণ:

ধরা যাক আমাদের একটি গ্রাফ রয়েছে, যার 4টি ভেরটেক্স (A, B, C, D) এবং এজসমূহ (A -> B, B -> C, C -> D, D -> A)। এর জন্য Adjacency List হবে:

A -> B
B -> C
C -> D
D -> A

সি প্রোগ্রামে Adjacency List এর ইমপ্লিমেন্টেশন:

#include <stdio.h>
#include <stdlib.h>

// গ্রাফের জন্য নোড স্ট্রাকচার
struct Node {
    int vertex;
    struct Node* next;
};

// গ্রাফের জন্য অ্যাডজেসেন্সি লিস্ট
struct Graph {
    int V;
    struct Node** adjList;
};

// নতুন নোড তৈরি
struct Node* createNode(int v) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->vertex = v;
    newNode->next = NULL;
    return newNode;
}

// গ্রাফ তৈরি
struct Graph* createGraph(int V) {
    struct Graph* graph = (struct Graph*)malloc(sizeof(struct Graph));
    graph->V = V;
    graph->adjList = (struct Node**)malloc(V * sizeof(struct Node*));

    for (int i = 0; i < V; i++) {
        graph->adjList[i] = NULL;
    }

    return graph;
}

// একটি এজ যুক্ত করা
void addEdge(struct Graph* graph, int src, int dest) {
    struct Node* newNode = createNode(dest);
    newNode->next = graph->adjList[src];
    graph->adjList[src] = newNode;
}

// গ্রাফ প্রিন্ট করা
void printGraph(struct Graph* graph) {
    for (int i = 0; i < graph->V; i++) {
        struct Node* temp = graph->adjList[i];
        printf("\nVertex %d: ", i);
        while (temp) {
            printf("%d -> ", temp->vertex);
            temp = temp->next;
        }
        printf("NULL\n");
    }
}

int main() {
    struct Graph* graph = createGraph(4);
    
    addEdge(graph, 0, 1);  // A -> B
    addEdge(graph, 1, 2);  // B -> C
    addEdge(graph, 2, 3);  // C -> D
    addEdge(graph, 3, 0);  // D -> A
    
    printGraph(graph);

    return 0;
}

Comparing Adjacency Matrix and Adjacency List

PropertyAdjacency MatrixAdjacency List
Memory UsageRequires O(V^2) space, where V is the number of verticesRequires O(V + E) space, where E is the number of edges
Space EfficiencyLess efficient for sparse graphsMore efficient for sparse graphs
Accessing EdgeO(1) for checking if there is an edgeO(V) in the worst case for finding a specific edge
Adding EdgeO(1) if indices are knownO(1) for adding an edge in the list
Deleting EdgeO(1) for deleting an edgeO(V) for deleting an edge (if not doubly linked)

সারসংক্ষেপ

  • Adjacency Matrix একটি 2D অ্যারে ভিত্তিক গ্রাফ মডেলিং পদ্ধতি, যেখানে প্রতিটি ভেরটেক্সের জন্য একটি ম্যাট্রিক্সের মাধ্যমে সংযোগ প্রদর্শিত হয়। এটি ঘন গ্রাফের জন্য উপযুক্ত।
  • Adjacency List একটি গ্রাফ মডেলিং পদ্ধতি যেখানে প্রতিটি ভেরটেক্সের জন্য একটি লিঙ্কড লিস্ট থাকে, এবং এটি সাধারণত সাশ্রয়ী এবং স্পার্স (sparse) গ্রাফের জন্য উপযুক্ত।

এটি আপনার প্রয়োজনে সবচেয়ে উপযুক্ত গ্রাফ মডেলিং পদ্ধতি নির্বাচন করতে সাহায্য করবে।

Content added By
Promotion

Are you sure to start over?

Loading...