জটিল ডেটা স্ট্রাকচার হল এমন ডেটা স্ট্রাকচার, যেগুলি সাধারণ ডেটা স্ট্রাকচারের তুলনায় আরো শক্তিশালী, যেমন অ্যারে, লিস্ট, স্ট্যাক, কিউ, এবং ম্যাপ, কিন্তু তারা আরও বেশি মাত্রায় সংগঠিত এবং কার্যকরী। এই ধরনের স্ট্রাকচারের মধ্যে নেস্টেড (nested) ডেটা, একাধিক স্তরের ডেটা, এবং বিভিন্ন উপাদান বা ক্লাসের সমন্বয় থাকে।
স্কালাতে, জটিল ডেটা স্ট্রাকচারস ব্যবহার করা হয় এমন জটিল ডেটা মডেল তৈরি করার জন্য, যা মাল্টিপল এলিমেন্টগুলির সমন্বয়ে কাজ করতে পারে।
এখানে কিছু সাধারণ জটিল ডেটা স্ট্রাকচারস এর উদাহরণ দেওয়া হলো:
১. ট্রি (Tree) ডেটা স্ট্রাকচার
ট্রি ডেটা স্ট্রাকচার হল এমন একটি হায়ারারকিক্যাল (hierarchical) ডেটা স্ট্রাকচার যেখানে একে একে নোডগুলি যুক্ত থাকে এবং প্রতিটি নোডে ডেটা বা মান থাকে।
উদাহরণ: বাইনারি ট্রি (Binary Tree)
sealed trait Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
case object Empty extends Tree
// একটি উদাহরণ বাইনারি ট্রি তৈরি করা
val tree = Node(1, Node(2, Empty, Empty), Node(3, Empty, Empty))এখানে, Node একটি বাইনারি ট্রির নোড এবং Empty একটি শূন্য নোড উপস্থাপন করে।
২. গ্রাফ (Graph) ডেটা স্ট্রাকচার
গ্রাফ হল এমন একটি ডেটা স্ট্রাকচার যা ভেরটিস (vertices) বা নোড এবং তাদের মধ্যে সংযোগকারী এজ (edges) ধারণ করে। গ্রাফগুলি সিম্পল (undirected) বা ডিরেক্টেড (directed) হতে পারে এবং এটি সাইকেল (cycle) সহ বা ছাড়া থাকতে পারে।
উদাহরণ: আনডাইরেক্টেড গ্রাফ (Undirected Graph)
import scala.collection.mutable
class Graph {
var adjList: mutable.Map[Int, List[Int]] = mutable.Map()
def addVertex(v: Int): Unit = {
if (!adjList.contains(v)) adjList(v) = List()
}
def addEdge(v1: Int, v2: Int): Unit = {
adjList(v1) = v2 :: adjList.getOrElse(v1, List())
adjList(v2) = v1 :: adjList.getOrElse(v2, List())
}
}
val g = new Graph
g.addVertex(1)
g.addVertex(2)
g.addEdge(1, 2)
println(g.adjList) // Map(1 -> List(2), 2 -> List(1))এখানে, একটি গ্রাফ তৈরি করা হয়েছে যেখানে দুটি নোড (1 এবং 2) রয়েছে এবং তাদের মধ্যে একটি এজ (সংযোগ) রয়েছে।
৩. হ্যাশ ম্যাপ (Hash Map)
হ্যাশ ম্যাপ এমন একটি ডেটা স্ট্রাকচার যা কীগুলির সাথে মান সংরক্ষণ করে এবং দ্রুত মান খোঁজার জন্য হ্যাশিং ব্যবহার করে।
উদাহরণ: হ্যাশ ম্যাপ
val hashMap = scala.collection.mutable.Map[String, Int]()
hashMap("Alice") = 25
hashMap("Bob") = 30
println(hashMap) // Map(Alice -> 25, Bob -> 30)এখানে, একটি হ্যাশ ম্যাপ তৈরি করা হয়েছে যেখানে কীগুলি স্ট্রিং (যেমন, "Alice") এবং মানগুলি পূর্ণসংখ্যা (যেমন, 25)।
৪. হ্যাশ সেট (Hash Set)
হ্যাশ সেট হল একটি ডেটা স্ট্রাকচার যা ইউনিক উপাদান সংরক্ষণ করে। এটি হ্যাশিং ব্যবহার করে যাতে দ্রুত সদস্য পরীক্ষা করা যায়।
উদাহরণ: হ্যাশ সেট
val hashSet = scala.collection.mutable.Set[String]()
hashSet += "apple"
hashSet += "banana"
hashSet += "apple" // Duplicate value will not be added
println(hashSet) // Set(apple, banana)এখানে, একটি হ্যাশ সেট তৈরি করা হয়েছে যেখানে শুধু ইউনিক মানগুলো সংরক্ষিত হয়েছে। "apple" একটি ডুপ্লিকেট হিসেবে যোগ হতে পারবে না।
৫. স্ট্যাক (Stack) এবং কিউ (Queue)
স্ট্যাক এবং কিউ হল লিনিয়ার ডেটা স্ট্রাকচার, তবে তাদের মধ্যে পার্থক্য হল:
- স্ট্যাক: LIFO (Last In, First Out) পদ্ধতি অনুসরণ করে।
- কিউ: FIFO (First In, First Out) পদ্ধতি অনুসরণ করে।
উদাহরণ: স্ট্যাক (Stack)
val stack = scala.collection.mutable.Stack[Int]()
stack.push(10)
stack.push(20)
stack.push(30)
println(stack.pop()) // 30
println(stack.pop()) // 20এখানে, একটি স্ট্যাক তৈরি করা হয়েছে এবং push ও pop অপারেশনগুলো দেখানো হয়েছে।
উদাহরণ: কিউ (Queue)
val queue = scala.collection.mutable.Queue[Int]()
queue.enqueue(10)
queue.enqueue(20)
queue.enqueue(30)
println(queue.dequeue()) // 10
println(queue.dequeue()) // 20এখানে, একটি কিউ তৈরি করা হয়েছে এবং enqueue এবং dequeue অপারেশনগুলো ব্যবহার করা হয়েছে।
৬. টুপল (Tuple)
টুপল হল এমন একটি ডেটা স্ট্রাকচার যা বিভিন্ন ধরনের মান ধারণ করতে পারে। এটি একটি অর্ডারড ডেটা স্ট্রাকচার, যেখানে একাধিক উপাদান একই সাথে থাকতে পারে।
উদাহরণ: টুপল
val person = ("Alice", 30, "Engineer")
val (name, age, profession) = person
println(s"Name: $name, Age: $age, Profession: $profession") // Name: Alice, Age: 30, Profession: Engineerএখানে, একটি টুপল তৈরি করা হয়েছে, যাতে বিভিন্ন ধরনের মান (স্ট্রিং, ইন্টিজার) সংরক্ষিত হয়েছে।
৭. অ্যারে (Array) এবং অ্যারে লিস্ট (ArrayList)
অ্যারে এবং অ্যারে লিস্ট হল এক ধরনের ডেটা স্ট্রাকচার যা সিকোয়েন্সিয়াল (ordered) উপাদান সংরক্ষণ করে।
উদাহরণ: অ্যারে
val numbers = Array(1, 2, 3, 4, 5)
println(numbers(2)) // 3এখানে, একটি অ্যারে তৈরি করা হয়েছে এবং ২-নম্বর ইনডেক্স থেকে মান অ্যাক্সেস করা হয়েছে।
সারাংশ
জটিল ডেটা স্ট্রাকচারগুলি ডেটা সংরক্ষণ এবং প্রসেসিং এর জন্য শক্তিশালী টুল। ট্রি, গ্রাফ, হ্যাশ ম্যাপ, হ্যাশ সেট, স্ট্যাক, কিউ, টুপল ইত্যাদি বিভিন্ন ধরনের জটিল ডেটা স্ট্রাকচার আপনাকে বৃহৎ ও জটিল ডেটাসেটগুলি কার্যকরভাবে সংগঠিত ও প্রক্রিয়া করতে সাহায্য করে। প্রতিটি ডেটা স্ট্রাকচারের একটি নির্দিষ্ট উদ্দেশ্য থাকে এবং আপনি আপনার প্রয়োজন অনুসারে সেগুলি নির্বাচন করতে পারেন।
Read more