লুয়া (Lua) ভাষায় কিউ (Queue) এবং প্রায়োরিটি কিউ (Priority Queue) তৈরি করতে টেবিল (Tables) এবং কিছু কাস্টম লজিক ব্যবহার করা হয়। কিউ একটি ডেটা স্ট্রাকচার যা FIFO (First In, First Out) প্রিন্সিপল অনুসরণ করে, অর্থাৎ প্রথমে প্রবেশ করা উপাদান প্রথমে বের হয়। অন্যদিকে, প্রায়োরিটি কিউ উপাদানগুলোকে তাদের প্রাধান্য (priority) অনুসারে সাজিয়ে রাখে, যাতে উচ্চ প্রাধান্য সম্পন্ন উপাদানগুলি আগে বের হয়।
এই টিউটোরিয়ালে আমরা কিউ এবং প্রায়োরিটি কিউ তৈরি করার পদ্ধতি দেখব।
১. কিউ (Queue) তৈরি করা
কিউ (Queue) একটি সাধারণ ডেটা স্ট্রাকচার যা FIFO প্রিন্সিপল অনুসরণ করে। আমরা এটি একটি টেবিল ব্যবহার করে তৈরি করতে পারি, যেখানে enqueue এবং dequeue অপারেশনগুলো কাজ করবে।
কিউ তৈরি করা:
Queue = {}
Queue.__index = Queue
-- কিউ কন্সট্রাক্টর
function Queue.new()
return setmetatable({items = {}}, Queue)
end
-- এনকিউ (enqueue): নতুন আইটেম কিউতে যোগ করা
function Queue:enqueue(item)
table.insert(self.items, item)
end
-- ডিকিউ (dequeue): কিউ থেকে প্রথম আইটেম বের করা
function Queue:dequeue()
if #self.items == 0 then
return nil, "Queue is empty"
end
return table.remove(self.items, 1)
end
-- কিউয়ের সাইজ
function Queue:size()
return #self.items
end
-- কিউয়ের প্রথম আইটেম
function Queue:peek()
return self.items[1]
endএখানে, আমরা Queue টেবিলটি কিউ ক্লাস হিসেবে ব্যবহার করেছি। কিউ তৈরি করতে Queue.new() ফাংশনটি ব্যবহার করা হয়েছে, যা একটি খালি টেবিল রিটার্ন করবে। enqueue ফাংশনটি নতুন উপাদান কিউতে যোগ করে এবং dequeue ফাংশনটি কিউ থেকে প্রথম উপাদান বের করে।
কিউ ব্যবহার করা:
local queue = Queue.new()
-- এনকিউ (enqueue)
queue:enqueue("Item 1")
queue:enqueue("Item 2")
queue:enqueue("Item 3")
print(queue:dequeue()) -- আউটপুট: Item 1
print(queue:dequeue()) -- আউটপুট: Item 2
print(queue:dequeue()) -- আউটপুট: Item 3এখানে, তিনটি আইটেম কিউতে যোগ করা হয়েছে এবং পরে ডিকিউ করে সেগুলি বের করা হয়েছে।
২. প্রায়োরিটি কিউ (Priority Queue) তৈরি করা
প্রায়োরিটি কিউ একটি কিউ টাইপ, যেখানে উপাদানগুলির প্রাধান্য থাকে এবং উপাদানগুলো তাদের প্রাধান্যের ভিত্তিতে কিউ থেকে বের হয়। এই কিউতে সাধারণত প্রতিটি উপাদান একটি প্রাধান্য সঙ্গে থাকে এবং সেই অনুযায়ী উপাদানগুলো বের করা হয়।
প্রায়োরিটি কিউ তৈরি করা:
PriorityQueue = {}
PriorityQueue.__index = PriorityQueue
-- প্রায়োরিটি কিউ কন্সট্রাক্টর
function PriorityQueue.new()
return setmetatable({items = {}}, PriorityQueue)
end
-- এনকিউ (enqueue): নতুন আইটেম কিউতে যোগ করা, প্রাধান্য অনুসারে
function PriorityQueue:enqueue(item, priority)
table.insert(self.items, {item = item, priority = priority})
table.sort(self.items, function(a, b)
return a.priority > b.priority -- উচ্চ প্রাধান্য প্রথমে থাকবে
end)
end
-- ডিকিউ (dequeue): কিউ থেকে সর্বোচ্চ প্রাধান্য সম্পন্ন আইটেম বের করা
function PriorityQueue:dequeue()
if #self.items == 0 then
return nil, "Priority Queue is empty"
end
return table.remove(self.items, 1).item
end
-- কিউয়ের সাইজ
function PriorityQueue:size()
return #self.items
endএখানে, PriorityQueue টেবিলটি প্রায়োরিটি কিউ ক্লাস হিসেবে ব্যবহৃত হচ্ছে। enqueue ফাংশনে উপাদান এবং তার প্রাধান্য পাস করা হয় এবং table.sort ব্যবহার করে উপাদানগুলো প্রাধান্য অনুসারে সাজানো হয়।
প্রায়োরিটি কিউ ব্যবহার করা:
local pq = PriorityQueue.new()
-- এনকিউ (enqueue) বিভিন্ন প্রাধান্য সহ
pq:enqueue("Item 1", 1)
pq:enqueue("Item 2", 3)
pq:enqueue("Item 3", 2)
print(pq:dequeue()) -- আউটপুট: Item 2 (হাই প্রিয়োরিটি)
print(pq:dequeue()) -- আউটপুট: Item 3
print(pq:dequeue()) -- আউটপুট: Item 1 (লো প্রিয়োরিটি)এখানে, প্রথমে প্রাধান্য অনুসারে আইটেমগুলো কিউতে যোগ করা হয়েছে এবং পরে তাদের প্রাধান্য অনুসারে ডিকিউ করা হয়েছে।
সারসংক্ষেপ
লুয়া ভাষায় কিউ এবং প্রায়োরিটি কিউ তৈরি করতে টেবিল (tables) ব্যবহার করা হয় এবং ফাংশনগুলোর মাধ্যমে কিউয়ের বিভিন্ন কার্যকলাপ পরিচালিত হয়:
- কিউ (Queue) FIFO (First In, First Out) প্রিন্সিপল অনুসরণ করে।
- প্রায়োরিটি কিউ (Priority Queue) একটি প্রাধান্য ভিত্তিক কিউ, যেখানে উপাদানগুলোর প্রাধান্য অনুযায়ী সাজানো হয় এবং বের করা হয়।
এই ডেটা স্ট্রাকচারগুলি লুয়া ভাষায় অনেক কার্যক্রম যেমন টাস্ক ম্যানেজমেন্ট, ইভেন্ট হ্যান্ডলিং ইত্যাদিতে ব্যবহৃত হতে পারে।
Read more