ডেটা স্ট্রাকচার (Data Structures)
ডেটা স্ট্রাকচার হল ডেটা সংগঠিত, পরিচালনা এবং সংরক্ষণের একটি কাঠামো। এটি একটি প্রোগ্রামে ডেটা অপারেশনের কার্যকারিতা এবং কার্যকরীতা বাড়ানোর জন্য গুরুত্বপূর্ণ। বিভিন্ন ধরণের ডেটা স্ট্রাকচার রয়েছে, এবং প্রতিটি স্ট্রাকচার বিভিন্ন উদ্দেশ্যে ব্যবহার করা হয়। ডেটা স্ট্রাকচারগুলি সাধারণত দুটি প্রধান ক্যাটাগরিতে বিভক্ত: লিনিয়ার এবং নন-লিনিয়ার।
১. লিনিয়ার ডেটা স্ট্রাকচার (Linear Data Structures)
লিনিয়ার ডেটা স্ট্রাকচারগুলি এমন একটি স্ট্রাকচার যেখানে ডেটা উপাদানগুলি একটি সোজা লাইন বা সিকোয়েন্সে সংরক্ষিত হয়। প্রধান লিনিয়ার ডেটা স্ট্রাকচারগুলি হল:
১.১. অ্যারে (Arrays)
- বর্ণনা: একই ধরনের উপাদানের একটি সংগ্রহ যা একটি নির্দিষ্ট আকারে সংরক্ষিত হয়।
- ব্যবহার: সংখ্যা বা টেক্সটের তালিকা সংরক্ষণে।
১.২. লিস্ট (Lists)
- বর্ণনা: ডাইনামিকভাবে পরিবর্তনশীল আকারের একটি সংগ্রহ যা একটি বা একাধিক ডেটা টাইপ ধারণ করতে পারে। এটি সংযুক্ত তালিকার (Linked List) মাধ্যমে সংরক্ষিত হতে পারে।
- ব্যবহার: বিভিন্ন ধরনের ডেটার তালিকা তৈরি করতে।
১.৩. স্ট্যাক (Stack)
- বর্ণনা: লাস্ট ইন ফার্স্ট আউট (LIFO) পদ্ধতি অনুযায়ী কাজ করে, অর্থাৎ সর্বশেষ প্রবেশ করা উপাদান প্রথমে বের হয়।
- ব্যবহার: ফাংশন কলের ইতিহাস, উল্টো অর্ডার ডেটা পরিচালনা করতে।
১.৪. কিউ (Queue)
- বর্ণনা: ফার্স্ট ইন ফার্স্ট আউট (FIFO) পদ্ধতি অনুযায়ী কাজ করে, অর্থাৎ প্রথম প্রবেশ করা উপাদান প্রথমে বের হয়।
- ব্যবহার: প্রিন্টার কল, সিস্টেমের কাজের Queue।
২. নন-লিনিয়ার ডেটা স্ট্রাকচার (Non-Linear Data Structures)
নন-লিনিয়ার ডেটা স্ট্রাকচারগুলি এমন একটি স্ট্রাকচার যেখানে ডেটা উপাদানগুলি একটি হায়ারারকিকাল বা জাল আকৃতিতে সংরক্ষিত হয়। প্রধান নন-লিনিয়ার ডেটা স্ট্রাকচারগুলি হল:
২.১. গ্রাফ (Graphs)
- বর্ণনা: নোড এবং এজ দ্বারা গঠিত, যেখানে নোডগুলি ডেটা এবং এজগুলি তাদের মধ্যে সম্পর্ক নির্দেশ করে।
- ব্যবহার: নেটওয়ার্ক টপোলজি, সামাজিক নেটওয়ার্ক বিশ্লেষণ।
২.২. ট্রি (Trees)
- বর্ণনা: একটি হায়ারারকিকাল ডেটা স্ট্রাকচার যেখানে একটি মূল নোড (Root Node) থাকে এবং প্রতিটি নোডের একটি বা একাধিক সাব-নোড থাকে।
- ব্যবহার: ফাইল সিস্টেম, ডাটাবেসের ইনডেক্সিং।
৩. ডেটা স্ট্রাকচার নির্বাচন
ডেটা স্ট্রাকচার নির্বাচন একটি গুরুত্বপূর্ণ পদক্ষেপ যা প্রোগ্রামের কার্যকারিতা এবং কার্যকরীতা প্রভাবিত করে। কিছু বিষয় বিবেচনায় নেওয়া উচিত:
- ডেটার ধরন: আপনি কী ধরনের ডেটা সংরক্ষণ করতে চান।
- অপারেশনস: আপনি কেমন অপারেশন (যেমন অনুসন্ধান, যুক্ত করা, মুছে ফেলা) করতে চান।
- পারফরম্যান্স: ডেটা স্ট্রাকচারের কার্যকারিতা এবং মেমোরি ব্যবস্থাপনায় প্রভাব।
উপসংহার
ডেটা স্ট্রাকচারগুলি সফটওয়্যার ডেভেলপমেন্টের মৌলিক অংশ। সঠিক ডেটা স্ট্রাকচার নির্বাচন করলে একটি প্রোগ্রামের কার্যকারিতা এবং দক্ষতা উন্নত হয়। প্রোগ্রামারদের এই বিভিন্ন ডেটা স্ট্রাকচারগুলি বোঝা এবং কার্যকরীভাবে ব্যবহার করা শিখতে হবে, যা তাদের সমস্যার সমাধান এবং উন্নত সফটওয়্যার তৈরি করতে সহায়ক হবে।
লিঙ্কড লিস্ট (Linked List)
লিঙ্কড লিস্ট হলো একটি ডেটা স্ট্রাকচার যেখানে ডেটা উপাদানগুলি (nodes) সংলগ্ন থাকে এবং প্রতিটি উপাদান পরবর্তী উপাদানের সাথে একটি লিঙ্কের মাধ্যমে যুক্ত থাকে। এটি অ্যারের তুলনায় বেশি কার্যকর, কারণ এটি ডাইনামিক মেমরি ব্যবস্থাপনা এবং সহজে উপাদান যোগ এবং অপসারণের সুবিধা প্রদান করে।
লিঙ্কড লিস্টের প্রধান তিনটি প্রকার হল:
- সিঙ্গেল লিঙ্কড লিস্ট (Singly Linked List)
- ডাবল লিঙ্কড লিস্ট (Doubly Linked List)
- সার্কুলার লিঙ্কড লিস্ট (Circular Linked List)
১. সিঙ্গেল লিঙ্কড লিস্ট (Singly Linked List)
সিঙ্গেল লিঙ্কড লিস্টে প্রতিটি নোডে একটি ডেটা এবং একটি পরবর্তী নোডের পয়েন্টার থাকে। এটি একমাত্র দিকে চলে যায়, অর্থাৎ প্রতিটি নোড শুধুমাত্র পরবর্তী নোডের দিকে লিঙ্ক করা থাকে।
নোডের ডিক্লারেশন (C উদাহরণ):
struct Node {
int data; // ডেটা সদস্য
struct Node* next; // পরবর্তী নোডের পয়েন্টার
};
সিঙ্গেল লিঙ্কড লিস্টের উদাহরণ:
// সিঙ্গেল লিঙ্কড লিস্ট তৈরি এবং উপাদান যোগ করা
struct Node* head = NULL; // লিস্টের হেড পয়েন্টার
২. ডাবল লিঙ্কড লিস্ট (Doubly Linked List)
ডাবল লিঙ্কড লিস্টে প্রতিটি নোডে তিনটি উপাদান থাকে: একটি ডেটা, একটি পূর্ববর্তী নোডের পয়েন্টার এবং একটি পরবর্তী নোডের পয়েন্টার। এটি উভয় দিকে লিঙ্কেড থাকে।
নোডের ডিক্লারেশন (C উদাহরণ):
struct Node {
int data; // ডেটা সদস্য
struct Node* next; // পরবর্তী নোডের পয়েন্টার
struct Node* prev; // পূর্ববর্তী নোডের পয়েন্টার
};
ডাবল লিঙ্কড লিস্টের উদাহরণ:
// ডাবল লিঙ্কড লিস্ট তৈরি এবং উপাদান যোগ করা
struct Node* head = NULL; // লিস্টের হেড পয়েন্টার
৩. সার্কুলার লিঙ্কড লিস্ট (Circular Linked List)
সার্কুলার লিঙ্কড লিস্টে নোডগুলির শেষ নোড পরবর্তী নোডের পয়েন্টারকে প্রথম নোডের দিকে নির্দেশ করে। এটি একদিকে লিঙ্কড হয়ে থাকে, কিন্তু এটি একটি সার্কুলার স্ট্রাকচার তৈরি করে।
নোডের ডিক্লারেশন (C উদাহরণ):
struct Node {
int data; // ডেটা সদস্য
struct Node* next; // পরবর্তী নোডের পয়েন্টার
};
সার্কুলার লিঙ্কড লিস্টের উদাহরণ:
// সার্কুলার লিঙ্কড লিস্ট তৈরি
struct Node* head = NULL; // লিস্টের হেড পয়েন্টার
লিঙ্কড লিস্টের সুবিধা এবং অসুবিধা
সুবিধা:
- ডাইনামিক মেমরি: লিঙ্কড লিস্টের আকার চলাকালীন পরিবর্তিত হতে পারে, তাই এটি মেমরি ব্যবহারকে অধিক কার্যকরী করে।
- সহজে উপাদান যোগ এবং অপসারণ: নতুন উপাদান যোগ করা এবং মুছে ফেলা সহজ এবং দ্রুত।
অসুবিধা:
- স্মৃতি ব্যবহার: প্রতিটি নোডে অতিরিক্ত পয়েন্টারের জন্য আরও মেমরি প্রয়োজন।
- অ্যাক্সেস টাইম: অ্যারেতে উপাদান অ্যাক্সেসের সময় O(1), কিন্তু লিঙ্কড লিস্টে O(n) সময় লাগে।
উপসংহার
লিঙ্কড লিস্ট হল একটি শক্তিশালী ডেটা স্ট্রাকচার যা ডেটাকে সংগঠিত এবং পরিচালনা করতে সহায়তা করে। সিঙ্গেল, ডাবল এবং সার্কুলার লিঙ্কড লিস্টের প্রতিটির নিজস্ব সুবিধা এবং ব্যবহার আছে, এবং উপযুক্ত পরিস্থিতিতে এগুলোর ব্যবহার ডেটার দক্ষতা এবং কার্যকারিতা বাড়াতে সাহায্য করে।
স্ট্যাক (Stack) এবং কিউ (Queue) হলো দুটি মৌলিক ডেটা স্ট্রাকচার, যা ডেটা সংরক্ষণ এবং পরিচালনার জন্য ব্যবহৃত হয়। এই দুটি ডেটা স্ট্রাকচারের নিজস্ব নিয়ম ও বৈশিষ্ট্য রয়েছে, এবং তারা বিভিন্ন ধরনের সমস্যার সমাধানে সাহায্য করে। নিচে স্ট্যাক এবং কিউয়ের অপারেশন ও ব্যবহার আলোচনা করা হলো।
স্ট্যাক (Stack)
স্ট্যাক হলো একটি LIFO (Last In, First Out) ডেটা স্ট্রাকচার। এর মানে হলো, শেষ উপাদানটি প্রথমে বের হয়। স্ট্যাকের প্রধান অপারেশনগুলি হল:
প্রধান অপারেশন:
- Push: নতুন উপাদান স্ট্যাকে যোগ করা।
- Pop: স্ট্যাক থেকে সর্বশেষ উপাদান মুছে ফেলা এবং সেটি রিটার্ন করা।
- Peek/Top: স্ট্যাকের শীর্ষ উপাদানটি দেখতে পাওয়া (মুছে না ফেলে)।
- IsEmpty: স্ট্যাক খালি কিনা পরীক্ষা করা।
উদাহরণ (Python):
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
if not self.is_empty():
return self.items.pop()
return None
def peek(self):
if not self.is_empty():
return self.items[-1]
return None
def is_empty(self):
return len(self.items) == 0
# স্ট্যাক তৈরি এবং ব্যবহার
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print("Top element:", stack.peek()) # 3
print("Popped element:", stack.pop()) # 3
print("Is stack empty?", stack.is_empty()) # False
কিউ (Queue)
কিউ হলো একটি FIFO (First In, First Out) ডেটা স্ট্রাকচার। এর মানে হলো, প্রথমে যোগ করা উপাদানটি প্রথমে বের হয়। কিউয়ের প্রধান অপারেশনগুলি হল:
প্রধান অপারেশন:
- Enqueue: নতুন উপাদান কিউতে যোগ করা।
- Dequeue: কিউ থেকে প্রথম উপাদান মুছে ফেলা এবং সেটি রিটার্ন করা।
- Front/Peek: কিউয়ের প্রথম উপাদানটি দেখতে পাওয়া (মুছে না ফেলে)।
- IsEmpty: কিউ খালি কিনা পরীক্ষা করা।
উদাহরণ (Python):
class Queue:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
if not self.is_empty():
return self.items.pop(0)
return None
def front(self):
if not self.is_empty():
return self.items[0]
return None
def is_empty(self):
return len(self.items) == 0
# কিউ তৈরি এবং ব্যবহার
queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
print("Front element:", queue.front()) # 1
print("Dequeued element:", queue.dequeue()) # 1
print("Is queue empty?", queue.is_empty()) # False
ব্যবহার
স্ট্যাকের ব্যবহার:
- ফাংশন কল স্ট্যাক: ফাংশনের কল ট্রেসিং এবং রিটার্নিংয়ের জন্য।
- পুনরাবৃত্তি সমস্যা: যেমন টার্নারি ট্রি ট্রাভার্সাল।
- অভিব্যক্তি মূল্যায়ন: পোলিশ এবং ইনফিক্স ক্যালকুলেশন।
- ব্রাউজার হিস্ট্রি: ব্যবহারকারীর পূর্ববর্তী পৃষ্ঠায় ফিরে যাওয়ার জন্য।
কিউয়ের ব্যবহার:
- ক্লাউড কম্পিউটিং: কাজের ব্যাচ প্রক্রিয়াকরণ।
- ব্রাউজার সংযোগ: HTTP অনুরোধের জন্য।
- প্রিন্টার কিউ: মুদ্রণের জন্য কাজের তালিকা।
- ব্লাড ব্যাঙ্ক ম্যানেজমেন্ট: রক্তদানকারীর সেবা প্রদান।
উপসংহার
স্ট্যাক এবং কিউ দুটি মৌলিক ডেটা স্ট্রাকচার, যা বিভিন্ন ধরনের সমস্যার সমাধানে অত্যন্ত কার্যকর। স্ট্যাকগুলি LIFO পদ্ধতির ওপর কাজ করে, যেখানে কিউ FIFO পদ্ধতির ওপর। সঠিকভাবে এই ডেটা স্ট্রাকচারগুলি ব্যবহার করা প্রোগ্রামিং দক্ষতা বৃদ্ধি করে এবং সিস্টেমের কার্যকারিতা বাড়ায়।
ট্রি (Tree) একটি গাণিতিক ডেটা স্ট্রাকচার যা হায়ারার্কিকাল (সামরিক) সম্পর্ককে উপস্থাপন করে। এটি মূলত একটি গাছের মতো গঠন, যেখানে একটি মূল নোড (root node) থাকে এবং এটি বিভিন্ন শাখা (branches) এবং পাতা (leaves) নিয়ে গঠিত। ট্রি ডেটা স্ট্রাকচারগুলির মধ্যে বিভিন্ন ধরনের ট্রি রয়েছে, যার মধ্যে বাইনারি ট্রি, বাইনারি সার্চ ট্রি (BST), এবং AVL ট্রি অন্যতম। নিচে এগুলোর সম্পর্কে বিস্তারিত আলোচনা করা হলো।
১. বাইনারি ট্রি (Binary Tree)
বিবরণ: বাইনারি ট্রি একটি ট্রি ডেটা স্ট্রাকচার যেখানে প্রতিটি নোড সর্বাধিক দুটি সন্তান (child) নোড ধারণ করতে পারে, যা সাধারণত "বাম সন্তান" (left child) এবং "ডান সন্তান" (right child) হিসেবে পরিচিত।
বৈশিষ্ট্য:
- গঠন: প্রতিটি নোডে ০, ১ বা ২টি সন্তান থাকতে পারে।
- গভীরতা: একটি বাইনারি ট্রির গভীরতা হল সেই সর্বাধিক স্তরের সংখ্যা যা মূল নোড থেকে পাতালোক পর্যন্ত চলে যায়।
- বিন্যাস: সাধারণত বাইনারি ট্রির তিনটি প্রধান ট্রাভার্সাল পদ্ধতি থাকে: ইন-অর্ডার (in-order), প্রি-অর্ডার (pre-order), এবং পোস্ট-অর্ডার (post-order)।
উদাহরণ:
A
/ \
B C
/ \
D E
২. বাইনারি সার্চ ট্রি (Binary Search Tree - BST)
বিবরণ: বাইনারি সার্চ ট্রি একটি বিশেষ ধরনের বাইনারি ট্রি, যেখানে প্রতিটি নোডের বাম সন্তানটির মান উক্ত নোডের মানের চেয়ে ছোট এবং ডান সন্তানটির মান উক্ত নোডের মানের চেয়ে বড়। এটি ডেটা অনুসন্ধান এবং সংরক্ষণ করার জন্য কার্যকরী।
বৈশিষ্ট্য:
- ডেটা সংগঠন: BST এর সাহায্যে দ্রুত ডেটা অনুসন্ধান, ইনসার্ট, এবং ডিলিট করা যায় (গড় সময় O(log n))।
- অর্ডার: ইন-অর্ডার ট্রাভার্সাল করলে BST এর এলিমেন্টগুলি ক্রমবর্ধমানভাবে পাওয়া যায়।
উদাহরণ:
10
/ \
5 15
/ \ / \
3 7 12 20
৩. AVL ট্রি (AVL Tree)
বিবরণ: AVL ট্রি একটি ব্যালেন্সড বাইনারি সার্চ ট্রি, যেখানে প্রতিটি নোডের বাম ও ডান subtree এর উচ্চতার মধ্যে সর্বাধিক ১-এর পার্থক্য থাকে। AVL ট্রি ডেটার কার্যকরী সঞ্চয় নিশ্চিত করে এবং দ্রুত অনুসন্ধান এবং ইনসার্টের জন্য পরিচিত।
বৈশিষ্ট্য:
- ব্যালেন্সিং: AVL ট্রি ইনসার্ট বা ডিলিট করার পর, যদি কোন নোডের ব্যালেন্স ফ্যাক্টর ১, ০, বা -১ এর বাইরে চলে যায়, তবে তা পুনর্বিন্যাস করা হয়।
- গতি: AVL ট্রি গড় সময় O(log n) এ অনুসন্ধান, ইনসার্ট এবং ডিলিটের কাজ করে।
উদাহরণ:
30
/ \
20 40
/ \ \
10 25 50
সারসংক্ষেপ
- বাইনারি ট্রি: একটি সাধারণ ট্রি স্ট্রাকচার, যেখানে প্রতিটি নোডের সর্বাধিক দুটি সন্তান থাকে।
- BST: বাইনারি সার্চ ট্রি, যা অনুসন্ধান ও সঞ্চয়ের জন্য একটি বিশেষ রূপের ট্রি।
- AVL ট্রি: একটি ব্যালেন্সড BST, যা ডেটার উচ্চ কার্যকারিতা নিশ্চিত করে এবং দ্রুত অনুসন্ধান, ইনসার্ট এবং ডিলিট অপারেশন করে।
এই ট্রি ডেটা স্ট্রাকচারগুলো ডেটা সংগঠনের জন্য অত্যন্ত গুরুত্বপূর্ণ এবং সঠিকভাবে ব্যবহার করা হলে ডেটা পরিচালনার গতি ও কার্যকারিতা বৃদ্ধি পায়।
গ্রাফ (Graphs)
গ্রাফ হল একটি গাণিতিক ডেটা স্ট্রাকচার যা ভেরটেক্স (শীর্ষক) এবং এজ (প্রান্ত) দ্বারা গঠিত। গ্রাফ ব্যবহার করে বিভিন্ন ধরনের সমস্যার মডেলিং করা হয়, যেমন নেটওয়ার্ক, রাস্তা ম্যাপ, সামাজিক নেটওয়ার্ক ইত্যাদি।
গ্রাফের প্রকারভেদ
গ্রাফের বিভিন্ন প্রকার রয়েছে, যার মধ্যে কিছু গুরুত্বপূর্ণ প্রকার নিচে উল্লেখ করা হলো:
১. অর্থোডেক্স গ্রাফ (Undirected Graph): যেখানে প্রান্তের দিক নেই এবং দুটি শীর্ষের মধ্যে একটি সংযোগ থাকে। উদাহরণস্বরূপ, একটি শহরের দুইটি স্থান।
২. দিকনির্দেশিত গ্রাফ (Directed Graph): যেখানে প্রতিটি প্রান্ত একটি নির্দিষ্ট দিক নির্দেশ করে। উদাহরণস্বরূপ, একটি রাস্তার নকশা যেখানে একদিকের ট্রাফিক রয়েছে।
৩. ওজনযুক্ত গ্রাফ (Weighted Graph): যেখানে প্রতিটি প্রান্তের সাথে একটি ওজন যুক্ত থাকে। এটি সাধারণত দূরত্ব বা খরচ নির্দেশ করে।
৪. অসীম গ্রাফ (Cyclic Graph): যেখানে একটি বা একাধিক চক্র থাকে, অর্থাৎ, একটি নোডে ফিরে আসা সম্ভব।
৫. অবসারণকারী গ্রাফ (Acyclic Graph): যেখানে কোন চক্র নেই। যেমন, একটি গাছ (Tree) হল একটি অবসারণকারী গ্রাফ।
৬. বিপরীত গ্রাফ (Complete Graph): যেখানে প্রতিটি শীর্ষের সাথে অন্য সব শীর্ষের সরাসরি সংযোগ থাকে।
BFS (Breadth-First Search)
BFS হল একটি গ্রাফ ট্রাভার্সাল অ্যালগরিদম যা গ্রাফের সমস্ত শীর্ষগুলোকে স্তরের ভিত্তিতে অনুসন্ধান করে। এটি সাধারণত একটি কিউ (Queue) ব্যবহার করে।
BFS-এর কাজ করার প্রক্রিয়া:
- একটি কিউ তৈরি করুন এবং প্রথম শীর্ষকে এন্ট্রি করুন।
- কিউ থেকে একটি শীর্ষ বের করুন এবং এটি পরিদর্শন করুন।
- পরিদর্শিত শীর্ষের সমস্ত অগ্রবর্তী শীর্ষকে কিউতে এন্ট্রি করুন।
- পুনরাবৃত্তি করুন যতক্ষণ না কিউ ফাঁকা হয়।
উদাহরণ (Python):
from collections import deque
def bfs(graph, start):
visited = set() # পরিদর্শিত শীর্ষের সেট
queue = deque([start]) # কিউতে প্রথম শীর্ষ যুক্ত করা
while queue:
vertex = queue.popleft() # কিউ থেকে শীর্ষ বের করা
if vertex not in visited:
print(vertex) # পরিদর্শন করা
visited.add(vertex) # পরিদর্শিত হিসাবে চিহ্নিত করা
queue.extend(neighbor for neighbor in graph[vertex] if neighbor not in visited) # অগ্রবর্তী শীর্ষগুলো যুক্ত করা
DFS (Depth-First Search)
DFS হল একটি গ্রাফ ট্রাভার্সাল অ্যালগরিদম যা গ্রাফের শীর্ষগুলোকে গভীরভাবে অনুসন্ধান করে। এটি সাধারণত একটি স্ট্যাক (Stack) ব্যবহার করে বা রিকারশন (Recursion) মাধ্যমে করা হয়।
DFS-এর কাজ করার প্রক্রিয়া:
- একটি স্ট্যাক তৈরি করুন এবং প্রথম শীর্ষকে এন্ট্রি করুন।
- স্ট্যাক থেকে একটি শীর্ষ বের করুন এবং এটি পরিদর্শন করুন।
- পরিদর্শিত শীর্ষের সমস্ত অগ্রবর্তী শীর্ষকে স্ট্যাকে এন্ট্রি করুন।
- পুনরাবৃত্তি করুন যতক্ষণ না স্ট্যাক ফাঁকা হয়।
উদাহরণ (Python):
def dfs(graph, vertex, visited=None):
if visited is None:
visited = set() # পরিদর্শিত শীর্ষের সেট
if vertex not in visited:
print(vertex) # পরিদর্শন করা
visited.add(vertex) # পরিদর্শিত হিসাবে চিহ্নিত করা
for neighbor in graph[vertex]: # অগ্রবর্তী শীর্ষগুলো
dfs(graph, neighbor, visited) # রিকারশন ব্যবহার করে
উপসংহার
গ্রাফ একটি শক্তিশালী ডেটা স্ট্রাকচার যা বিভিন্ন সমস্যার মডেলিং করতে সক্ষম। গ্রাফের প্রকারভেদ, BFS এবং DFS গ্রাফ ট্রাভার্সাল অ্যালগরিদমের মৌলিক অংশ। BFS স্তরের ভিত্তিতে অনুসন্ধান করে, जबकि DFS গভীরভাবে অনুসন্ধান করে। এগুলি গ্রাফের বিভিন্ন তথ্য বের করার জন্য ব্যবহৃত হয় এবং বিভিন্ন বাস্তব জীবনের সমস্যায় গুরুত্বপূর্ণ ভূমিকা পালন করে।
Read more