ডাইনামিক অ্যারে (Dynamic Array)
পাইথনে, একটি লিস্ট, সেট এবং ডিকশনারি মিউটেবল (mutable) অবজেক্ট।ementara সংখ্যা, স্ট্রিং, এবং টাপল ইমিউটেবল (immutable) অবজেক্ট। মিউটেবল অবজেক্ট মানে আমরা লিস্ট, সেট বা ডিকশনারি থেকে আইটেম যোগ/সরাতে পারি, যাইহোক এটি টাপল বা স্ট্রিংয়ের মত ইমিউটেবল অবজেক্টের জন্য সত্য নয়।
পাইথনে, একটি লিস্ট আসলে একটি ডাইনামিক অ্যারে। চলে একটি ডাইনামিক লিস্ট তৈরি করি:
>>> # একটি খালি লিস্ট তৈরি করুন, নাম list1 >>> list1 = [] >>> type(list1)
আমাদের খালি লিস্ট list1-এ কিছু আইটেম যোগ করুন:
>>> # আইটেম যোগ করুন
>>> list1 = [2, 4, 6]
>>> list1
[2, 4, 6]
>>> # আরেকটি উপায় আইটেম যোগ করার, append ব্যবহার করে
>>> list1.append('Tutorialspoint')
>>> list1
[2, 4, 6, 'Tutorialspoint']
একটি লিস্ট থেকে কিছু আইটেম সরান:
>>> # লিস্ট থেকে আইটেম ডিলিট করুন >>> list1.pop() 'Tutorialspoint' >>> list1 [2, 4, 6]
উপরে থেকে আমরা দেখতে পাচ্ছি যে লিস্ট আসলে একটি অ্যারের এক্সটেনশন, যেখানে আমরা লিস্টের আকার মডিফাই (বাড়ানো বা কমানো) করতে পারি। আমরা "শূন্য" আকারের একটি লিস্ট দিয়ে শুরু করেছি এবং তারপর "চার"টি আইটেম যোগ করেছি।
ডাইনামিক অ্যারে বাস্তবায়নের বেসিক্স
একটি উদাহরণ বিবেচনা করুন যেখানে লিস্ট অর্থাৎ list1-এ append করা হচ্ছে যখন অ্যারেতে আকার ফুল হয়ে গেলে, তবে আমাদের আকার সীমাবদ্ধতা überwinden করতে নিচের ধাপগুলো নিতে হবে। এটিই ডাইনামিক অ্যারে বাস্তবায়নের ভিত্তি:
- একটি নতুন অ্যারে list2 বড়ার ক্যাপাসিটি দিয়ে অ্যালোকেট করুন
- list2[i] = list1[i] সেট করুন, i = 0,1...n-1 এর জন্য, যেখানে n হলো বর্তমান আইটেমের সংখ্যা।
- list1 = list2 সেট করুন, যেহেতু এখন list2 আমাদের নতুন লিস্টকে রেফার করছে।
- এবং তারপর, শুধু নতুন আইটেমটি আমাদের লিস্টে (list1) ইনসার্ট (append) করুন।
চলে পাইথন প্রোগ্রামিং-এ ডাইনামিক অ্যারে কনসেপ্ট বাস্তবায়ন করার একটি সিম্পল কোড তৈরি করি। আমরা পাইথনের বিল্ট-ইন লাইব্রেরি ক্লাস ctypes ব্যবহার করে আমাদের নিজস্ব ডাইনামিক অ্যারে ক্লাস তৈরি করব যা ctypes মডিউল থেকে রা অ্যারে হিসেবে ব্যবহার করা হবে।
dynamicArray.py
import ctypes
class DynamicArray(object):
# ইনিশিয়ালাইজ করুন
def __init__(self):
# আমাদের তিনটি অ্যাট্রিবিউট থাকবে
self.n = 0 # ডিফল্ট
self.capacity = 1 # ডিফল্ট
self.A = self.make_array(self.capacity) # make_array পরে ডিফাইন করা হবে
# Length মেথড
def __len__(self):
# এটি অ্যারেতে এলিমেন্টের সংখ্যা রিটার্ন করবে
return self.n
def __getitem__(self, k):
# এটি k ইনডেক্সের এলিমেন্ট রিটার্ন করবে
if not 0 <= k < self.n:
return IndexError('k is out of bounds')
return self.A[k]
def append(self, element):
# ক্যাপাসিটি চেক করুন
if self.n == self.capacity:
# নতুন অ্যারের জন্য ক্যাপাসিটি ডাবল করুন
self._resize(2 * self.capacity) # _resize মেথড পরে ডিফাইন করা হবে
# অ্যারে A-এর n ইনডেক্সে এলিমেন্ট সেট করুন
self.A[self.n] = element
self.n += 1
def _resize(self, new_cap): # new_cap নতুন ক্যাপাসিটির জন্য
# অ্যারে B ডিক্লোর করুন
B = self.make_array(new_cap)
for k in range(self.n):
B[k] = self.A[k] # অ্যারে A থেকে B-এ এলিমেন্ট রেফারেন্স করুন
# একবার রেফার করা হলে
self.A = B # A এখন অ্যারে B
self.capacity = new_cap # ক্যাপাসিটি রিসেট করুন
# ctypes ব্যবহার করে make-array মেথড তৈরি করুন
def make_array(self, new_cap):
return (new_cap * ctypes.py_object)()
arr = DynamicArray()
আমাদের ডাইনামিক ক্লাস ব্যবহার করার জন্য প্রস্তুত, চলে এর সাথে কিছু ট্রাই করি:
>>> len(arr)
0
>>> arr.append(1)
>>> # প্রথম আইটেম ইনপুট
>>> len(arr)
1
>>> arr.append('Tutorialspoint')
>>> # দ্বিতীয় আইটেম ইনপুট
>>> len(arr)
2
>>> arr[1]
'Tutorialspoint'
এতটুকু, আমরা আমাদের নিজস্ব ডাইনামিক অ্যারে তৈরি করেছি এবং আমরা অ্যারে রিসাইজ করতে পারি যা পাইথনে একটি লিস্ট।