Follow Us
মাধ্যম নির্বাচন করুন / Select Medium:
Eng (English) Beng (বাংলা) Hindi (हिन्दी)
পশ্চিমবঙ্গ মধ্যশিক্ষা পর্ষদ (WBBSE) • শ্রেণি XII • Computer Science • অধ্যায় 2
আনুমানিক সময়: 120 Mins
অগ্রগতি: অধ্যয়নে সক্রিয়

Data Structures (ডেটা স্ট্রাকচার)

কম্পিউটার বিজ্ঞানে ডেটা স্ট্রাকচার হলো মেমরিতে ডেটা সুবিন্যস্ত ও দক্ষতার সাথে সংরক্ষণ এবং পরিচালনার মৌলিক প্রযুক্তিগত কাঠামো। পশ্চিমবঙ্গ উচ্চমাধ্যমিক শিক্ষা সংসদ (WBCHSE) দ্বাদশ শ্রেণির কম্পিউটার সায়েন্স পাঠ্যক্রমের এই দ্বিতীয় অধ্যায়ে লিনিয়ার ডেটা স্ট্রাকচার (যেমন ধারাবাহিক অ্যারে, LIFO নিয়মের স্ট্যাক, FIFO নিয়মের কিউ এবং ডায়নামিক লিঙ্কড লিস্ট) এবং নন-লিনিয়ার হায়ারারকিক্যাল ডেটা স্ট্রাকচার (যেমন বাইনারি ট্রি ও বাইনারি সার্চ ট্রি) পুঙ্খানুপুঙ্খভাবে আলোচিত হয়েছে। শিক্ষার্থীরা অ্যালগরিদমের সময় ও স্থান জটিলতা (অ্যাসিম্পটোটিক বিগ-ও নোটেশন), 1D ও 2D অ্যারে মেমরি অ্যাড্রেস গণনা, ইনফিক্স থেকে পোস্টফিক্স এক্সপ্রেশন রূপান্তর, বৃত্তাকার কিউ এবং ট্রির রিকার্সিভ ট্রাভার্সাল পদ্ধতি গভীরভাবে আয়ত্ত করতে পারবে।

অধ্যায়টির গুরুত্ব

বাস্তব সফটওয়্যার ইঞ্জিনিয়ারিং ও সিস্টেম ডিজাইনে উপযুক্ত ডেটা স্ট্রাকচার নির্বাচনই একটি অ্যাপ্লিকেশনের গতি ও মেমরি দক্ষতা নির্ধারণ করে। অপারেটিং সিস্টেমের টাস্ক শিডিউলিংয়ে কিউ ও প্রায়োরিটি কিউ, কম্পাইলারের গাণিতিক সমীকরণ বিশ্লেষণ ও ফাংশন কলে স্ট্যাক, মেমরি বরাদ্দে লিঙ্কড লিস্ট এবং ডাটাবেজ ইনডেক্সিং ও দ্রুত অনুসন্ধানে বাইনারি সার্চ ট্রি অপরিহার্য। উচ্চমাধ্যমিক বোর্ড পরীক্ষায় সম্পূর্ণ নম্বর অর্জন এবং পরবর্তীতে সর্বভারতীয় ইঞ্জিনিয়ারিং বা বিসিএ/বিএসসি কম্পিউটার সায়েন্সের ভিত্তি মজবুত করতে এই অধ্যায়ের তাত্ত্বিক ও ব্যবহারিক ধারণা অত্যন্ত ফলপ্রসূ।

অধ্যায়ের বিষয়সূচি ও রূপরেখা

1 মডিউল ১: ডেটা স্ট্রাকচারের ভিত্তি ও...
2 মডিউল ২: লিনিয়ার অ্যারে ও অনুসন্ধান...
3 মডিউল ৩: স্ট্যাক (LIFO): আর্কিটেকচা...
4 মডিউল ৪: কিউ (FIFO): লিনিয়ার, বৃত্...
5 মডিউল ৫: লিঙ্কড লিস্ট: ডায়নামিক মে...
6 মডিউল ৬: হায়ারারকিক্যাল ট্রি ও বাই...

সম্পূর্ণ তত্ত্ব ও ধারণাগত আলোচনা

মডিউল ১: ডেটা স্ট্রাকচারের ভিত্তি ও জটিলতা বিশ্লেষণ

১.১ ডেটা স্ট্রাকচারের মৌলিক ধারণা ও বিমূর্ত ডেটা টাইপ (ADT)

ডেটা স্ট্রাকচার (Data Structure): মেমরিতে বিপুল পরিমাণ ডেটা এমনভাবে সুবিন্যস্ত রাখা যাতে বিভিন্ন গাণিতিক ও যৌক্তিক অপারেশন (যেমন সন্ধান, সংযোজন, অপসারণ) সর্বনিম্ন সময়ে ও মেমরিতে সম্পন্ন করা যায়। Abstract Data Type (ADT) হলো ডেটার এমন এক গাণিতিক রূপরেখা যা ডেটার ওপর কী কী অপারেশন করা যাবে তা নির্দিষ্ট করে, কিন্তু মেমরিতে কীভাবে তা বাস্তবায়িত হবে তা অভ্যন্তরীণভাবে গোপন রাখে।

ডেটা স্ট্রাকচারের শ্রেণিবিন্যাস প্রধানত দুটি ভাগে বিভক্ত:

  • প্রিমিটিভ বনাম নন-প্রিমিটিভ: প্রিমিটিভ ডেটা টাইপ (যেমন int, float, char) সরাসরি প্রসেসরের নির্দেশ দ্বারা পরিচালিত হয়। নন-প্রিমিটিভ ডেটা স্ট্রাকচার প্রিমিটিভ উপাদানগুলোর সমন্বয়ে গঠিত জটিল রূপ (যেমন অ্যারে, স্ট্যাক, কিউ, লিঙ্কড লিস্ট)।
  • লিনিয়ার বনাম নন-লিনিয়ার: লিনিয়ার ডেটা স্ট্রাকচারে উপাদানগুলো ক্রমানুসারে একটির পর একটি অবস্থান করে, যেখানে প্রথম ও শেষ উপাদান ব্যতীত প্রতিটির একটি পূর্বসূরী (predecessor) ও উত্তরসূরী (successor) থাকে। নন-লিনিয়ার ডেটা স্ট্রাকচারে উপাদানগুলো বহু-স্তরে বা জালিকার আকারে বিন্যস্ত থাকে (যেমন ট্রি ও গ্রাফ)।
  • স্ট্যাটিক বনাম ডায়নামিক: স্ট্যাটিক কাঠামোতে কম্পাইল টাইমে নির্দিষ্ট আকারের মেমরি বরাদ্দ হয় (যেমন ফিক্সড অ্যারে); ডায়নামিক কাঠামোতে প্রোগ্রাম চলার সময় প্রয়োজন অনুযায়ী হিপ মেমরি বরাদ্দ ও মুক্ত করা হয় (যেমন লিঙ্কড লিস্ট)।
১.২ ডেটা স্ট্রাকচারের মৌলিক অপারেশনসমূহ ও জটিলতা বিশ্লেষণ

যেকোনো পূর্ণাঙ্গ ডেটা স্ট্রাকচারে প্রধানত ছয়টি মৌলিক অপারেশন সম্পন্ন করা যায়:

  • ট্রাভার্সাল (Traversal): কাঠামোর প্রতিটি উপাদানকে নির্দিষ্ট ক্রমে অন্তত একবার পরিদর্শন ও প্রসেস করা।
  • ইনসার্শন (Insertion): কাঠামোর নির্দিষ্ট অবস্থানে নতুন উপাদান যুক্ত করা।
  • ডিলিশন (Deletion): কাঠামো থেকে নির্দিষ্ট উপাদান অপসারণ করে মেমরি মুক্ত করা।
  • সার্চিং (Searching): নির্দিষ্ট কি-এর (Key) মান মেমরিতে আছে কি না এবং তার অবস্থান খুঁজে বের করা।
  • সর্টিং (Sorting): উপাদানগুলোকে মানের ঊর্ধ্বক্রম বা নিম্নক্রমে সুবিন্যস্ত করা।
  • মার্জিং (Merging): দুটি পৃথক সুবিন্যস্ত কাঠামোর উপাদানগুলোকে একটি একক সুবিন্যস্ত কাঠামোতে একত্রিত করা।
কাঠামোর ধরন উপাদানের বিন্যাস মেমরি বরাদ্দ ট্রাভার্সাল জটিলতা প্রধান উদাহরণ
লিনিয়ার স্ট্রাকচার একমাত্রিক ক্রমিক সম্পর্ক (পূর্বসূরী ও উত্তরসূরী) ধারাবাহিক (অ্যারে) বা পয়েন্টার দ্বারা সংযুক্ত (লিস্ট) $O(n)$ রৈখিক ট্রাভার্সাল 1D/2D অ্যারে, স্ট্যাক, কিউ, লিঙ্কড লিস্ট
নন-লিনিয়ার স্ট্রাকচার হায়ারারকিক্যাল বহু-স্তরীয় বা জালিকা সম্পর্ক হিপ মেমরিতে পয়েন্টারভিত্তিক সংযোগ রিকার্সিভ ট্রাভার্সাল (Pre/In/Post-order) বাইনারি ট্রি, বাইনারি সার্চ ট্রি (BST), গ্রাফ

মডিউল ২: লিনিয়ার অ্যারে ও অনুসন্ধান অ্যালগরিদম

২.১ লিনিয়ার অ্যারে ও মেমরি অ্যাড্রেস গণনার গাণিতিক সূত্রাবলী

অ্যারে (Array): একই জাতীয় ডেটা উপাদানের ধারাবাহিক সংকলন যা মেমরিতে পরস্পর সংলগ্ন স্থানে সংরক্ষিত থাকে। বেস অ্যাড্রেস এবং উপাদানের আকার জানা থাকলে যেকোনো উপাদানের মেমরি অবস্থান $O(1)$ সময়ে সরাসরি নির্ণয় করা যায়:

  • 1D অ্যারে অ্যাড্রেস সূত্র: বেস অ্যাড্রেস $B$, উপাদানের বাইট সাইজ $W$, এবং লোয়ার বাউন্ড $LB$ হলে: $$\text{Address}(A[k]) = B + W \times (k - LB)$$
  • 2D অ্যারে রো-মেজর অর্ডার (RMO): উপাদানের সংরক্ষণ সারি অনুসারে ক্রমান্বয়ে হয়। $R \times C$ আকারের অ্যারেতে: $$\text{Address}(A[i][j]) = B + W \times [C \times (i - LBR) + (j - LBC)]$$
  • 2D অ্যারে কলাম-মেজর অর্ডার (CMO): উপাদানের সংরক্ষণ কলাম অনুসারে ক্রমান্বয়ে হয়: $$\text{Address}(A[i][j]) = B + W \times [(i - LBR) + R \times (j - LBC)]$$
২.২ অনুসন্ধান অ্যালগরিদম: লিনিয়ার সার্চ বনাম বাইনারি সার্চ

মেমরিতে নির্দিষ্ট উপাদানের অবস্থান নির্ণয়ের দুটি প্রধান পদ্ধতি নিচে তুলে ধরা হলো:

# পাইথনে নির্ভুল বাইনারি সার্চ অ্যালগরিদম
def binary_search(arr, target):
    low = 0
    high = len(arr) - 1
    
    while low <= high:
        # ওভারফ্লো প্রতিরোধী মধ্যবিন্দু গণনা:
        mid = low + (high - low) // 2
        
        if arr[mid] == target:
            return mid  # উপাদানটি mid ইনডেক্সে পাওয়া গেছে
        elif arr[mid] < target:
            low = mid + 1  # ডান অর্ধে অনুসন্ধান
        else:
            high = mid - 1  # বাম অর্ধে অনুসন্ধান
            
    return -1  # উপাদানটি অ্যারেতে অনুপস্থিত
তুলনামূলক বৈশিষ্ট্য লিনিয়ার (সিকোয়েন্সিয়াল) সার্চ বাইনারি (ডিভাইড অ্যান্ড কনকার) সার্চ
পূর্বশর্ত কোনো পূর্বশর্ত নেই। এলোমেলো (unsorted) তালিকায় চলে। অবশ্যই সুবিন্যস্ত (Sorted): ঊর্ধ্বক্রম বা নিম্নক্রমে থাকতে হবে।
সর্বাধিক সময় জটিলতা $O(n)$ — শেষ উপাদান পর্যন্ত পুরো তালিকা স্ক্যান করতে হয়। $O(\log_2 n)$ — প্রতি পদক্ষেপে তালিকা অর্ধেক হ্রাস পায়।
সর্বনিম্ন সময় জটিলতা $O(1)$ — উপাদানটি প্রথম ইনডেক্স $0$-এ পেলে। $O(1)$ — উপাদানটি একদম মধ্যবিন্দুতে পেলে।
অ্যাক্সেস মেকানিজম ধারাবাহিক অ্যাক্সেস। অ্যারে ও লিঙ্কড লিস্ট উভয়ের জন্য প্রযোজ্য। র্যান্ডম অ্যাক্সেস আবশ্যক। লিঙ্কড লিস্টে সরাসরি প্রয়োগ অসম্ভব।

মডিউল ৩: স্ট্যাক (LIFO): আর্কিটেকচার ও এক্সপ্রেশন মূল্যায়ন

৩.১ স্ট্যাক আর্কিটেকচার: LIFO নীতি ও সীমারেখা শর্তাবলী

স্ট্যাক (Stack): একটি সীমাবদ্ধ লিনিয়ার ডেটা স্ট্রাকচার যা কঠোরভাবে Last-In, First-Out (LIFO) নীতি অনুসরণ করে। এতে উপাদান প্রবেশ করানো (Push) এবং অপসারণ করা (Pop) উভয়ই কেবল একটি নির্দিষ্ট শীর্ষবিন্দু বা Top of Stack (TOS)-এ ঘটে।

  • টপ পয়েন্টার (top): স্ট্যাকের শীর্ষ উপাদানের ইনডেক্স নির্দেশ করে। ফাঁকা স্ট্যাকে top = -1।
  • স্ট্যাক ওভারফ্লো (Stack Overflow): স্ট্যাকটি সম্পূর্ণ পূর্ণ থাকা অবস্থায় (top == MAX - 1) পুনরায় push করার চেষ্টা করলে ওভারফ্লো ঘটে।
  • স্ট্যাক আন্ডারফ্লো (Stack Underflow): ফাঁকা স্ট্যাক থেকে (top == -1) কোনো উপাদান pop বা peek করার চেষ্টা করলে আন্ডারফ্লো ঘটে।
# পাইথনে অবজেক্ট-ওরিয়েন্টেড স্ট্যাক রূপায়ন
class Stack:
    def init(self, capacity=10):
        self.stack = []
        self.capacity = capacity
        
    def is_empty(self):
        return len(self.stack) == 0
        
    def is_full(self):
        return len(self.stack) >= self.capacity
        
    def push(self, val):
        if self.is_full():
            raise OverflowError("Stack Overflow: স্ট্যাক সম্পূর্ণ পূর্ণ!")
        self.stack.append(val)
        
    def pop(self):
        if self.is_empty():
            raise IndexError("Stack Underflow: স্ট্যাক ফাঁকা!")
        return self.stack.pop()
        
    def peek(self):
        if self.is_empty():
            return None
        return self.stack[-1]
৩.২ পলিশ নোটেশন ও এক্সপ্রেশন মূল্যায়ন

গাণিতিক সমীকরণ লেখার তিনটি প্রধান রূপ রয়েছে:

  • ইনফিক্স নোটেশন: অপারেটর দুটি অপারেন্ডের মাঝে থাকে (যেমন A + B * C)। মানুষের জন্য সহজ হলেও কম্পিউটারে বন্ধনী ও অগ্রাধিকারের নিয়ম মেনে চলতে হয়।
  • প্রিফিক্স নোটেশন (পলিশ): অপারেটর অপারেন্ডের পূর্বে থাকে (যেমন + A * B C)। কোনো বন্ধনীর প্রয়োজন হয় না।
  • পোস্টফিক্স নোটেশন (রিভার্স পলিশ - RPN): অপারেটর অপারেন্ডের ঠিক পরে থাকে (যেমন A B C * +)। কম্পিউটার ও কম্পাইলার স্ট্যাকের মাধ্যমে অত্যন্ত দ্রুত এটি হিসাব করতে পারে।
নোটেশনের প্রকার অপারেটরের অবস্থান বন্ধনীর প্রয়োজনীয়তা মূল্যায়নের কৌশল আদর্শ উদাহরণ
ইনফিক্স (Infix) অপারেন্ড ১ <অপারেটর> অপারেন্ড ২ অগ্রাধিকার বদলাতে অপরিহার্য অপারেটর ও অপারেন্ড দুটি পৃথক স্ট্যাক (A + B) * (C - D)
প্রিফিক্স (Prefix) <অপারেটর> অপারেন্ড ১ অপারেন্ড ২ সম্পূর্ণ অনাবশ্যক ডান থেকে বামে অপারেন্ড স্ট্যাক স্ক্যান * + A B - C D
পোস্টফিক্স (Postfix) অপারেন্ড ১ অপারেন্ড ২ <অপারেটর> সম্পূর্ণ অনাবশ্যক বাম থেকে ডানে অপারেন্ড স্ট্যাক স্ক্যান A B + C D - *

মডিউল ৪: কিউ (FIFO): লিনিয়ার, বৃত্তাকার ও ডেক গঠন

৪.১ কিউ আর্কিটেকচার: FIFO নীতি ও ফলস ওভারফ্লো সংকট

কিউ (Queue): একটি লিনিয়ার ডেটা স্ট্রাকচার যা কঠোরভাবে First-In, First-Out (FIFO) নীতি মেনে চলে। এতে দুটি স্বাধীন প্রান্তিক পয়েন্টার কাজ করে:

  • ফ্রন্ট পয়েন্টার (front): যে প্রান্ত থেকে উপাদান মুছে ফেলা হয় (dequeue)।
  • রিয়ার পয়েন্টার (rear): যে প্রান্তে নতুন উপাদান যুক্ত করা হয় (enqueue)।
  • লিনিয়ার কিউ-এর ফলস ওভারফ্লো (False Overflow): ক্রমান্বয়ে উপাদান প্রবেশ ও অপসারণের ফলে rear অ্যারের শেষ প্রান্তে পৌঁছে যায় (rear == MAX - 1)। তখন front-এর পূর্বে মেমরি খালি থাকলেও নতুন উপাদান প্রবেশ করানো যায় না এবং কিউ ওভারফ্লো দেখায়।
৪.২ বৃত্তাকার কিউ ও কিউ-এর রূপভেদসমূহ

বৃত্তাকার কিউ (Circular Queue) ফলস ওভারফ্লো দূর করতে অ্যারের শেষ প্রান্তকে মডিউলো গাণিতিক নিয়মে প্রথম প্রান্তের সাথে যুক্ত করে:

  • চক্রাকার অগ্রগতি: rear = (rear + 1) % MAX এবং front = (front + 1) % MAX।
  • সম্পূর্ণ পূর্ণ শর্ত: (rear + 1) % MAX == front।
  • সম্পূর্ণ ফাঁকা শর্ত: front == -1।
কিউ ভ্যারিয়েন্ট পয়েন্টার মেকানিজম ইনসার্শন ও ডিলিশন প্রান্ত মেমরি ব্যবহার দক্ষতা ব্যবহারিক প্রয়োগ
লিনিয়ার কিউ রৈখিক বৃদ্ধি (front++, rear++) Rear-এ প্রবেশ, Front-এ অপসারণ দুর্বল (ফলস ওভারফ্লো হয়) সাধারণ প্রিন্ট স্পুলার, ডেটা বাফার
বৃত্তাকার কিউ মডিউলো রিং: (ptr + 1) % MAX Rear-এ প্রবেশ, Front-এ অপসারণ সর্বোত্তম (খালি জায়গা পুনর্ব্যবহৃত হয়) OS রাউন্ড-রবিন শিডিউলার, স্ট্রিমিং
ডেক (Deque) উভয় প্রান্তে দ্বিমুখী পয়েন্টার সুবিধা উভয় প্রান্তেই প্রবেশ ও অপসারণ সমর্থিত অত্যন্ত নমনীয় (স্ট্যাক বা কিউ উভয় হিসেবে চলে) ব্রাউজার হিস্ট্রি, আনডু-রিডু মেকানিজম
প্রায়োরিটি কিউ আগমনের সময় নয়, অগ্রাধিকার মূল্যায়িত হয় সর্বোচ্চ অগ্রাধিকারের উপাদান আগে নির্গত হয় হিপ (Heap) ট্রি কাঠামোর সাহায্যে $O(\log n)$ CPU প্রি-এম্পটিভ শিডিউলিং, ডিকস্ট্রা অ্যালগরিদম

মডিউল ৫: লিঙ্কড লিস্ট: ডায়নামিক মেমরি ও পয়েন্টার অপারেশন

৫.১ ডায়নামিক মেমরি ও লিঙ্কড লিস্টের নোড আর্কিটেকচার

অ্যারের স্থির আকার এবং উপাদান স্থানান্তর জনিত $O(n)$ অপচয় রোধ করতে লিঙ্কড লিস্ট (Linked List) ব্যবহৃত হয়। এতে হিপ মেমরিতে পৃথক নোড (Node) তৈরি করে পয়েন্টারের সাহায্যে সংযুক্ত করা হয়। প্রতিটি নোডে দুটি প্রধান অংশ থাকে:

  • ডেটা ফিল্ড (Data): মূল মান বা তথ্য সংরক্ষণ করে।
  • লিঙ্ক বা নেক্সট ফিল্ড (Next): পরবর্তী নোডের মেমরি অ্যাড্রেস ধারণ করে। শেষ নোডের নেক্সট মান None (বা NULL) হয়।
  • হেড পয়েন্টার (Head): তালিকার প্রথম নোডকে নির্দেশ করে। তালিকা খালি থাকলে head is None।
৫.২ একক, দ্বৈত ও বৃত্তাকার লিঙ্কড লিস্টের তুলনা

লিঙ্কড লিস্টের তিনটি প্রধান রূপ রয়েছে:

  • একক লিঙ্কড লিস্ট (SLL): কেবল একমুখী পথ। শুরুতে নতুন নোড যুক্ত করার সময় কোনো উপাদান না সরিয়ে সরাসরি $O(1)$ সময়ে করা যায়।
  • দ্বৈত লিঙ্কড লিস্ট (DLL): প্রতিটি নোডে দুটি পয়েন্টার থাকে (prev ও next)। উভয় দিকেই ট্রাভার্সাল সম্ভব।
  • বৃত্তাকার লিঙ্কড লিস্ট (CLL): শেষ নোডের নেক্সট পয়েন্টার None না হয়ে পুনরায় head-কে নির্দেশ করে।
তুলনামূলক মানদণ্ড ধারাবাহিক অ্যারে (Array) একক লিঙ্কড লিস্ট (SLL)
মেমরি সংস্থাপন কঠোরভাবে সংলগ্ন ও ধারাবাহিক মেমরি ব্লক হিপ মেমরিতে এলোমেলো নোড, পয়েন্টারে সংযুক্ত
ইনডেক্স দ্বারা র্যান্ডম অ্যাক্সেস $O(1)$ সরাসরি অ্যাক্সেস সম্ভব $O(n)$ হেড থেকে ক্রমান্বয়ে যেতে হয়
প্রারম্ভে ইনসার্শন বা ডিলিশন $O(n)$ — বাকি সব উপাদান সরাতে হয় $O(1)$ — কেবল পয়েন্টার পরিবর্তন, স্থানান্তর নেই
মেমরি ওভারহেড কোনো অতিরিক্ত পয়েন্টার ওভারহেড নেই প্রতিটি নোডে ৪ বা ৮ বাইটের পয়েন্টার ওভারহেড
আকার পরিবর্তনযোগ্যতা নির্দিষ্ট বা ব্যয়বহুল কপি অপারেশনের প্রয়োজন সম্পূর্ণ ডায়নামিক; প্রয়োজনমতো বাড়ে ও কমে

মডিউল ৬: হায়ারারকিক্যাল ট্রি ও বাইনারি সার্চ ট্রি (BST)

৬.১ ট্রি ডেটা স্ট্রাকচারের পরিভাষা ও বাইনারি ট্রি

ট্রি (Tree): একটি নন-লিনিয়ার হায়ারারকিক্যাল ডেটা স্ট্রাকচার যা একগুচ্ছ নোড এবং সংযোগকারী এজ (Edge) দ্বারা গঠিত। এতে একটি নির্দিষ্ট রুট নোড (Root Node) থাকে এবং বাকি নোডগুলো উপ-বৃক্ষে বিভক্ত থাকে।

  • ডিগ্রি (Degree): একটি নোডের মোট প্রত্যক্ষ চাইল্ড নোডের সংখ্যা।
  • লিফ নোড (Leaf Node): যে নোডের ডিগ্রি শূন্য অর্থাৎ কোনো সন্তান বা চাইল্ড নেই।
  • উচ্চতা (Height): রুট থেকে যেকোনো লিফ পর্যন্ত দীর্ঘতম পথের মোট এজের সংখ্যা। $h$ উচ্চতার একটি বাইনারি ট্রির সর্বাধিক নোড সংখ্যা $N_{\max} = 2^{h+1} - 1$।
  • বাইনারি ট্রি (Binary Tree): এমন ট্রি যেখানে প্রতিটি নোডের সর্বাধিক দুটি চাইল্ড থাকতে পারে (বাম চাইল্ড ও ডান চাইল্ড)।
৬.২ বাইনারি সার্চ ট্রি (BST) ও রিকার্সিভ ট্রাভার্সাল পদ্ধতিসমূহ

বাইনারি সার্চ ট্রি (BST): একটি বিশেষায়িত বাইনারি ট্রি যা কঠোরভাবে নিচের নিয়ম মেনে চলে:

BST-এর মৌলিক নিয়ম: প্রতিটি নোড $N$-এর ক্ষেত্রে:
• $N$-এর বাম সাব-ট্রির সকল কি-এর মান $N$-এর থেকে কঠোরভাবে ছোট।
• $N$-এর ডান সাব-ট্রির সকল কি-এর মান $N$-এর থেকে কঠোরভাবে বড়।
• বাম ও ডান উভয় সাব-ট্রিই নিজস্বভাবে বৈধ বাইনারি সার্চ ট্রি হবে।
ট্রাভার্সাল পদ্ধতি নোড পরিদর্শনের ক্রম বিশেষ বৈশিষ্ট্য ব্যবহারিক প্রয়োগ
প্রি-অর্ডার (Pre-order) রুট $\to$ বাম $\to$ ডান (DLR) রুট নোড সর্বদা সবার প্রথমে পরিদর্শন হয়। ট্রি ক্লোন করা, প্রিফিক্স এক্সপ্রেশন গঠন
ইন-অর্ডার (In-order) বাম $\to$ রুট $\to$ ডান (LDR) যেকোনো BST-এর ইন-অর্ডার সর্বদা সর্টেড ঊর্ধ্বক্রম মান দেয়! ট্রি সর্টিং, BST যাচাইকরণ
পোস্ট-অর্ডার (Post-order) বাম $\to$ ডান $\to$ রুট (LRD) রুট নোড সর্বদা সবার শেষে পরিদর্শন হয়। ট্রি ডিলিট করা, পোস্টফিক্স এক্সপ্রেশন গঠন

প্রোগ্রামিং সিনট্যাক্স, কমান্ড ও অনুবাদক নীতি

1D অ্যারের মেমরি অ্যাড্রেস নির্ণয় সূত্র
Address(A[k]) = B + W * (k - LB)
2D অ্যারে রো-মেজর অর্ডার (RMO) অ্যাড্রেস সূত্র
Address(A[i][j]) = B + W * [C * (i - LBR) + (j - LBC)]
2D অ্যারে কলাম-মেজর অর্ডার (CMO) অ্যাড্রেস সূত্র
Address(A[i][j]) = B + W * [(i - LBR) + R * (j - LBC)]
বাইনারি সার্চের পুনরাবৃত্তি সমীকরণ ও জটিলতা
T(n) = T(n / 2) + O(1) ==> T(n) = O(log2 n)
বৃত্তাকার কিউ পয়েন্টার বৃদ্ধি ও পূর্ণ শর্ত
rear = (rear + 1) % MAX | Full: (rear + 1) % MAX == front
h উচ্চতার বাইনারি ট্রির সর্বাধিক নোড সংখ্যা
$$N_max = 2^(h + 1) - 1$$

সমাধানকৃত উদাহরণ ও প্রয়োগ (Solved Examples)

উদাহরণ 1
একটি পূর্ণসংখ্যার অ্যারে A[10..50] মেমরিতে সংরক্ষিত আছে যার বেস অ্যাড্রেস 3000। যদি প্রতিটি উপাদান মেমরিতে 4 বাইট জায়গা নেয়, তবে A[32]-এর মেমরি অ্যাড্রেস কত হবে?
ধাপে ধাপে সমাধান / উত্তর:
ধাপ ১: প্রদত্ত মানসমূহ চিহ্নিত করি:
  • বেস অ্যাড্রেস ($B$) = 3000
  • উপাদানের আকার ($W$) = 4 বাইট
  • লোয়ার বাউন্ড ($LB$) = 10
  • উদ্দিষ্ট ইনডেক্স ($k$) = 32
ধাপ ২: 1D অ্যারে অ্যাড্রেস সূত্র প্রয়োগ: $$\text{Address}(A[k]) = B + W \times (k - LB)$$ ধাপ ৩: সূত্রে মান বসিয়ে হিসাব করি: $$\text{Address}(A[32]) = 3000 + 4 \times (32 - 10)$$ $$\text{Address}(A[32]) = 3000 + 4 \times 22$$ $$\text{Address}(A[32]) = 3000 + 88 = 3088$$ সঠিক উত্তর: $A[32]$ উপাদানের মেমরি অ্যাড্রেস হলো 3088.
উদাহরণ 2
স্ট্যাক অ্যালগরিদম ব্যবহার করে নিচের ইনফিক্স এক্সপ্রেশনটিকে পোস্টফিক্স এক্সপ্রেশনে রূপান্তর করো: (A + B) * C - D / E
ধাপে ধাপে সমাধান / উত্তর:
ধাপ ১: বাম থেকে ডানে টোকেন স্ক্যান করে স্ট্যাকের অবস্থা পর্যবেক্ষণ করি:
স্ক্যান করা টোকেন অপারেটর স্ট্যাক পোস্টফিক্স আউটপুট
((—
A(A
+( +A
B( +A B
)ফাঁকা (+ নির্গত)A B +
**A B +
C*A B + C
-- (* নির্গত)A B + C *
D-A B + C * D
/- /A B + C * D
E- /A B + C * D E
Endফাঁকা (/ ও - নির্গত)A B + C * D E / -
সঠিক উত্তর: সমতুল্য পোস্টফিক্স এক্সপ্রেশন হলো: A B + C * D E / -
উদাহরণ 3
স্ট্যাকের অবস্থা প্রদর্শন করে নিচের পোস্টফিক্স এক্সপ্রেশনটির মান নির্ণয় করো: 20 4 / 3 * 7 2 + -
ধাপে ধাপে সমাধান / উত্তর:
ধাপ ১: বাম থেকে ডানে ক্রমান্বয়ে টোকেন প্রসেস করি:
  • টোকেন 20: অপারেন্ড → Push 20. স্ট্যাক: [20]
  • টোকেন 4: অপারেন্ড → Push 4. স্ট্যাক: [20, 4]
  • টোকেন /: অপারেটর → Pop $op_2 = 4$, pop $op_1 = 20$. মান $20 / 4 = 5$. Push 5. স্ট্যাক: [5]
  • টোকেন 3: অপারেন্ড → Push 3. স্ট্যাক: [5, 3]
  • টোকেন *: অপারেটর → Pop $op_2 = 3$, pop $op_1 = 5$. মান $5 \times 3 = 15$. Push 15. স্ট্যাক: [15]
  • টোকেন 7: অপারেন্ড → Push 7. স্ট্যাক: [15, 7]
  • টোকেন 2: অপারেন্ড → Push 2. স্ট্যাক: [15, 7, 2]
  • টোকেন +: অপারেটর → Pop $op_2 = 2$, pop $op_1 = 7$. মান $7 + 2 = 9$. Push 9. স্ট্যাক: [15, 9]
  • টোকেন -: অপারেটর → Pop $op_2 = 9$, pop $op_1 = 15$. মান $15 - 9 = 6$. Push 6. স্ট্যাক: [6]
ধাপ ২: ফলাফল: এক্সপ্রেশন শেষ হওয়ায় স্ট্যাকে অবশিষ্ট চূড়ান্ত মান হলো 6। সঠিক উত্তর: প্রদত্ত পোস্টফিক্স এক্সপ্রেশনের মান হলো 6.
উদাহরণ 4
5 ধারণক্ষমতার (ইনডেক্স 0 থেকে 4) একটি বৃত্তাকার কিউ প্রথমে ফাঁকা আছে (front = -1, rear = -1)। নিচের অপারেশনগুলোর পর front ও rear-এর মান নির্ণয় করো: (a) Enqueue(10), (b) Enqueue(20), (c) Dequeue(), (d) Enqueue(30), (e) Enqueue(40), (f) Enqueue(50), (g) Enqueue(60)।
ধাপে ধাপে সমাধান / উত্তর:
প্রতিটি অপারেশনের পর পয়েন্টারের অবস্থা:
  1. প্রাথমিক অবস্থা: front = -1, rear = -1 (কিউ সম্পূর্ণ ফাঁকা)।
  2. (a) Enqueue(10): প্রথম উপাদান। front = 0, rear = 0। অ্যারে: [10, _, _, _, _]।
  3. (b) Enqueue(20): rear = (0 + 1) % 5 = 1, front = 0। অ্যারে: [10, 20, _, _, _]।
  4. (c) Dequeue(): 10 বের হয়ে যাবে। front = (0 + 1) % 5 = 1, rear = 1। অ্যারে: [_, 20, _, _, _]।
  5. (d) Enqueue(30): rear = (1 + 1) % 5 = 2, front = 1। অ্যারে: [_, 20, 30, _, _]।
  6. (e) Enqueue(40): rear = (2 + 1) % 5 = 3, front = 1। অ্যারে: [_, 20, 30, 40, _]।
  7. (f) Enqueue(50): rear = (3 + 1) % 5 = 4, front = 1। অ্যারে: [_, 20, 30, 40, 50]।
  8. (g) Enqueue(60): পরবর্তী অবস্থান (rear + 1) % 5 = (4 + 1) % 5 = 0। যেহেতু 0 != front (1), তাই বৃত্তাকারে ঘুরে rear = 0-এ 60 যুক্ত হবে। অ্যারে: [60, 20, 30, 40, 50]। এখন (rear + 1) % 5 == front (1) হওয়ায় কিউ সম্পূর্ণ পূর্ণ!
চূড়ান্ত অবস্থা:
  • front = 1 (মান = 20)
  • rear = 0 (মান = 60)
  • উপাদান সংখ্যা = 5 (সম্পূর্ণ পূর্ণ)।
উদাহরণ 5
পাইথনে একটি সম্পূর্ণ Stack ক্লাস তৈরি করো যাতে push(), pop(), peek(), isEmpty() এবং display() মেথড অন্তর্ভুক্ত থাকে। যথাযথ আন্ডারফ্লো ও ওভারফ্লো শর্ত পরীক্ষা নিশ্চিত করো।
ধাপে ধাপে সমাধান / উত্তর:
পাইথন প্রোগ্রাম কোড:
class ArrayStack:
    def init(self, max_size=5):
        self.stack = []
        self.max_size = max_size

    def is_empty(self):
        return len(self.stack) == 0

    def is_full(self):
        return len(self.stack) >= self.max_size

    def push(self, element):
        # ওভারফ্লো নিয়ন্ত্রণ
        if self.is_full():
            print("ত্রুটি: স্ট্যাক ওভারফ্লো! স্ট্যাকটি সম্পূর্ণ পূর্ণ।")
            return False
        self.stack.append(element)
        print(f"{element} সফলভাবে পুশ করা হয়েছে।")
        return True

    def pop(self):
        # আন্ডারফ্লো নিয়ন্ত্রণ
        if self.is_empty():
            print("ত্রুটি: স্ট্যাক আন্ডারফ্লো! স্ট্যাকটি ফাঁকা।")
            return None
        popped_item = self.stack.pop()
        print(f"{popped_item} পপ করা হয়েছে।")
        return popped_item

    def peek(self):
        if self.is_empty():
            print("স্ট্যাক ফাঁকা, কোনো শীর্ষ উপাদান নেই।")
            return None
        return self.stack[-1]

    def display(self):
        if self.is_empty():
            print("স্ট্যাক: [ফাঁকা]")
            return
        print("স্ট্যাকের উপাদানসমূহ (শীর্ষ থেকে নিচে):")
        for i in range(len(self.stack) - 1, -1, -1):
            print(f"| {self.stack[i]:^5} |" + (" <-- TOP" if i == len(self.stack) - 1 else ""))
        print("---------")
জটিলতা বিশ্লেষণ: প্রতিটি অপারেশন (push, pop, peek) ধ্রুবক সময় $O(1)$-এ কার্যকর হয় কারণ অ্যারের শেষ প্রান্তে উপাদান সংযোজন ও অপসারণে কোনো শিফটিং লাগে না।
উদাহরণ 6
নিচের উপাদানগুলোকে একটি শূন্য বাইনারি সার্চ ট্রিতে (BST) একে একে প্রবেশ করাও: 45, 23, 67, 12, 34, 56, 89, 28। (a) গঠিত BST-এর চিত্র অঙ্কন করো। (b) Pre-order, In-order ও Post-order ট্রাভার্সাল লেখো। (c) সেরা ও সবচেয়ে খারাপ পরিস্থিতিতে অনুসন্ধানের সময় জটিলতা কত?
ধাপে ধাপে সমাধান / উত্তর:
(a) ধাপে ধাপে BST গঠন:
  1. 45 প্রবেশ → রুট নোড।
  2. 23 প্রবেশ → $23 < 45$ → 45-এর বাম চাইল্ড।
  3. 67 প্রবেশ → $67 > 45$ → 45-এর ডান চাইল্ড।
  4. 12 প্রবেশ → $12 < 45, 12 < 23$ → 23-এর বাম চাইল্ড।
  5. 34 প্রবেশ → $34 < 45, 34 > 23$ → 23-এর ডান চাইল্ড।
  6. 56 প্রবেশ → $56 > 45, 56 < 67$ → 67-এর বাম চাইল্ড।
  7. 89 প্রবেশ → $89 > 45, 89 > 67$ → 67-এর ডান চাইল্ড।
  8. 28 প্রবেশ → $28 < 45, 28 > 23, 28 < 34$ → 34-এর বাম চাইল্ড।
গঠিত BST-এর চিত্র:
        45
       /  \
     23    67
    /  \   /  \
   12  34 56  89
       /
      28
(b) ট্রাভার্সাল ফলাফল:
  • Pre-order (রুট, বাম, ডান): 45, 23, 12, 34, 28, 67, 56, 89
  • In-order (বাম, রুট, ডান): 12, 23, 28, 34, 45, 56, 67, 89 (লক্ষ করো: মানগুলো সর্টেড ঊর্ধ্বক্রমে আছে!)
  • Post-order (বাম, ডান, রুট): 12, 28, 34, 23, 56, 89, 67, 45
(c) অনুসন্ধানের সময় জটিলতা:
  • সেরা ক্ষেত্র: $O(1)$ যখন কাঙ্ক্ষিত কি রুট নোডেই পাওয়া যায়।
  • গড় ক্ষেত্র: $O(\log_2 n)$ যখন ট্রি ভারসাম্যপূর্ণ থাকে।
  • সবচেয়ে খারাপ ক্ষেত্র: $O(n)$ যখন নোডগুলো ক্রমানুসারে এসে ট্রিটি একদিকে বেঁকে গিয়ে লিঙ্কড লিস্টে পরিণত হয় (Skewed Tree)।

সাধারণ ভুলত্রুটি ও সতর্কতা (Common Traps)

সাধারণ ভুল ধারণা

লিনিয়ার কিউ-এর 'rear == MAX - 1' অবস্থাকে সম্পূর্ণ পূর্ণ ভেবে ভুল করা (False Overflow)।

সঠিক পদ্ধতি ও সমাধান

বৃত্তাকার কিউ (Circular Queue) ব্যবহার করে '(rear + 1) % MAX' নিয়মে শূন্য স্থানগুলোকে পুনরায় কাজে লাগাতে হবে।

সাধারণ ভুল ধারণা

pop() বা peek() করার পূর্বে স্ট্যাক ফাঁকা কি না তা যাচাই না করা।

সঠিক পদ্ধতি ও সমাধান

প্রতিটি pop অপারেশনের আগে 'if is_empty():' শর্ত দিয়ে আন্ডারফ্লো সুরক্ষা নিশ্চিত করতে হবে।

সাধারণ ভুল ধারণা

পোস্টফিক্স মূল্যায়নে অপারেন্ডের ক্রম উল্টে ফেলা।

সঠিক পদ্ধতি ও সমাধান

স্পষ্টভাবে 'op2 = pop()', 'op1 = pop()' লিখে 'op1 - op2' বা 'op1 / op2' হিসাব করতে হবে।

সাধারণ ভুল ধারণা

অবিন্যস্ত (Unsorted) তালিকায় বাইনারি সার্চ প্রয়োগ করা।

সঠিক পদ্ধতি ও সমাধান

বাইনারি সার্চের আগে ডেটা সর্টেড আছে কি না নিশ্চিত হও, অন্যথায় লিনিয়ার সার্চ ব্যবহার করো।

সাধারণ ভুল ধারণা

বাইনারি সার্চে মধ্যবিন্দু গণনায় 'low = mid' লিখে ইনফিনিট লুপ তৈরি করা।

সঠিক পদ্ধতি ও সমাধান

সঠিকভাবে 'low = mid + 1' এবং 'high = mid - 1' আপডেট করতে হবে।

চিত্রগত ব্যাখ্যা ও মডেল

ডেটা স্ট্রাকচার : লিনিয়ার ও নন-লিনিয়ার আর্কিটেকচার WBCHSE দ্বাদশ শ্রেণি কম্পিউটার সায়েন্স (অধ্যায় ২) — স্ট্যাক, কিউ, লিঙ্কড লিস্ট ও ট্রি ১ম স্তর: লিনিয়ার অ্যারে ও লিঙ্কড লিস্ট ধারাবাহিক বনাম নোড-ভিত্তিক মেমরি • 1D ও 2D অ্যারে: Row-Major ও Column-Major মেমরি অ্যাড্রেস • একক লিঙ্কড লিস্ট (SLL): Data ও Next পয়েন্টার সংযোগ • দ্বৈত লিঙ্কড লিস্ট (DLL): Prev ও Next দ্বিমুখী ট্রাভার্সাল • ইনসার্শন ও ডিলিশন: পয়েন্টার ম্যানিপুলেশনে O(1) দক্ষতা SLL: [Data|Next] -> [Data|Next] -> NULL | DLL: NULL <- [Prev|Data|Next] <-> [Data] -> ২য় স্তর: স্ট্যাক ডেটা কাঠামো (LIFO) লাস্ট-ইন ফার্স্ট-আউট ও এক্সপ্রেশন মূল্যায়ন • শীর্ষ নির্দেশক: Top পয়েন্টার, Push ও Pop অপারেশন • সীমারেখা: ওভারফ্লো (Overflow) ও আন্ডারফ্লো (Underflow) • ইনফিক্স থেকে পোস্টফিক্স রূপান্তর (Shunting-Yard) • ফাংশন কল স্ট্যাক, রিকার্শন ও বন্ধনী সমতা যাচাই PUSH: top += 1; S[top]=item | POP: item=S[top]; top -= 1 | LIFO DISCIPLINE ৩য় স্তর: কিউ ডেটা কাঠামো (FIFO) ফার্স্ট-ইন ফার্স্ট-আউট ও চক্রাকার গঠন • দুই প্রান্তিক পয়েন্টার: Front (ডিলিশন) ও Rear (ইনসার্শন) • লিনিয়ার কিউ সীমাবদ্ধতা বনাম বৃত্তাকার কিউ: (Rear+1)%N • ডাবল-এন্ডেড কিউ (Deque) ও প্রায়োরিটি কিউ (Priority Queue) • পাইথনে deque vs লিস্ট pop(0): O(1) বনাম O(n) গতি ENQUEUE: rear=(rear+1)%N | DEQUEUE: front=(front+1)%N | FULL: (rear+1)%N == front ৪র্থ স্তর: নন-লিনিয়ার ট্রি ও BST আর্কিটেকচার হায়ারারকিক্যাল ম্যাপিং ও বাইনারি সার্চ ট্রি • রুট (Root), প্যারেন্ট, চাইল্ড, সাব-ট্রি ও লিফ (Leaf) নোড • ট্রাভার্সাল: Pre-order (DLR), In-order (LDR), Post-order (LRD) • BST বৈশিষ্ট্য: বাম সাবট্রি < মূল নোড < ডান সাবট্রি • সার্চ ও ইনসার্শন জটিলতা: গড় ক্ষেত্রে O(log n) IN-ORDER(BST) = SORTED KEYS | SEARCH(x): if x < root: Left else: Right | O(h) ডেটা স্ট্রাকচার ইঞ্জিন: মেমরি সংগঠন • সময় জটিলতা • অ্যালগরিদমিক অপ্টিমাইজেশন LIFO (STACK) • FIFO (QUEUE) • NODE POINTERS • HIERARCHICAL TREES • O(1) & O(LOG N)

অধ্যায় সারসংক্ষেপ ও গুরুত্বপূর্ণ বিষয়

মূল বিষয় 1
ডেটা স্ট্রাকচার হলো মেমরিতে ডেটা সুবিন্যস্ত ও দক্ষতার সাথে পরিচালনার গাণিতিক ও প্রযুক্তিগত মডেল।
মূল বিষয় 2
লিনিয়ার ডেটা স্ট্রাকচারে (অ্যারে, স্ট্যাক, কিউ, লিঙ্কড লিস্ট) উপাদানগুলো একমুখী ধারাবাহিক ক্রমে সাজানো থাকে।
মূল বিষয় 3
নন-লিনিয়ার ডেটা স্ট্রাকচারে (ট্রি, গ্রাফ) উপাদানগুলো বহু-স্তরীয় বা হায়ারারকিক্যাল জালিকায় যুক্ত থাকে।
মূল বিষয় 4
বাইনারি সার্চের জন্য ডেটা সর্টেড থাকা বাধ্যতামূলক এবং এটি O(log2 n) সময়ে দ্রুত অনুসন্ধান সম্পন্ন করে।
মূল বিষয় 5
স্ট্যাক কঠোরভাবে Last-In, First-Out (LIFO) নীতি মানে এবং সমস্ত কাজ একক 'top' পয়েন্টারে সম্পন্ন হয়।
মূল বিষয় 6
কিউ কঠোরভাবে First-In, First-Out (FIFO) নীতি মানে; Rear-এ ইনসার্শন এবং Front-এ ডিলিশন ঘটে।
মূল বিষয় 7
বৃত্তাকার কিউ মডিউলো পাটিগণিত (ptr + 1) % MAX প্রয়োগ করে লিনিয়ার কিউ-এর ফলস ওভারফ্লো সংকট সমাধান করে।
মূল বিষয় 8
লিঙ্কড লিস্ট নোডভিত্তিক ডায়নামিক মেমরি ব্যবহার করে, যার ফলে প্রারম্ভে O(1) সময়ে ইনসার্শন ও ডিলিশন সম্ভব হয়।
মূল বিষয় 9
বাইনারি সার্চ ট্রিতে (BST) বাম সাব-ট্রির মান রুটের চেয়ে ছোট এবং ডান সাব-ট্রির মান রুটের চেয়ে বড় হয়।
মূল বিষয় 10
যেকোনো বাইনারি সার্চ ট্রির In-order ট্রাভার্সাল (বাম -> রুট -> ডান) উপাদানগুলোকে সর্বদা সর্টেড ঊর্ধ্বক্রমে প্রদর্শন করে।

স্ব-মূল্যায়ন অনুশীলন (Check Your Understanding)

মূল ধারণাগত স্পষ্টতা যাচাই করার জন্য অনুশীলন প্রশ্ন। উত্তর দেখার আগে নিজে সমাধান করার চেষ্টা করো।

1
অ্যাবস্ট্রাক্ট ডেটা টাইপ (ADT) এবং ডেটা স্ট্রাকচারের মধ্যে মূল পার্থক্য কী?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: ADT হলো একটি তাত্ত্বিক রূপরেখা যা ডেটার ওপর কী কী কাজ করা যাবে তা সংজ্ঞায়িত করে কিন্তু বাস্তবায়নের পদ্ধতি প্রকাশ করে না (যেমন স্ট্যাক ADT পুশ ও পপ অপারেশন নির্দিষ্ট করে)। আর ডেটা স্ট্রাকচার হলো কোনো নির্দিষ্ট প্রোগ্রামিং ভাষায় মেমরি ব্যবহার করে তার বাস্তব প্রয়োগ।
ইন্টারফেস স্পেসিফিকেশন এবং বাস্তব মেমরি ইমপ্লিমেন্টেশনের পার্থক্য মনে করো।
2
একটি 2D অ্যারে B[1..10][1..20] রো-মেজর অর্ডারে 1000 বেস অ্যাড্রেসে সংরক্ষিত আছে। প্রতিটি উপাদানের আকার 2 বাইট হলে B[4][7]-এর মেমরি অ্যাড্রেস কত?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: Address(B[4][7]) = 1000 + 2 * [20 * (4 - 1) + (7 - 1)] = 1000 + 2 * [20 * 3 + 6] = 1000 + 2 * [60 + 6] = 1000 + 2 * 66 = 1000 + 132 = 1132।
রো-মেজর সূত্র: Address = B + W * [C * (i - LBR) + (j - LBC)]। এখানে C = 20, LBR = 1, LBC = 1।
3
ইনফিক্স এক্সপ্রেশন (A + B * C) / (D - E)-কে পোস্টফিক্স নোটেশনে রূপান্তর করো।
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: (A + B * C) হবে A B C * +; (D - E) হবে D E -; এবার দুটিকে / দিয়ে যুক্ত করলে হবে: A B C * + D E - /।
বন্ধনীর ভেতরে গুণের কাজ আগে করো, তারপর যোগ; সবশেষে ভাগের অপারেটর আসবে।
4
পাইথনের সাধারণ লিস্টে কিউ তৈরির ক্ষেত্রে 'lst.pop(0)' কেন অদক্ষ বলে বিবেচিত হয়?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: পাইথন লিস্ট একটি ধারাবাহিক অ্যারে। 'lst.pop(0)' দিয়ে প্রথম উপাদান সরালে বাকি (n - 1) টি উপাদানকে মেমরিতে এক ঘর বামে সরাতে হয়, ফলে এটি O(n) লিনিয়ার সময় অপচয় করে। তাই O(1) গতি পেতে 'collections.deque' ব্যবহার করা উচিত।
প্রথম উপাদান মুছে ফেলার পর মেমরির বাকি উপাদানগুলোর কী ঘটে তা ভাবো।
5
একটি বাইনারি ট্রির Post-order ট্রাভার্সাল D, E, B, F, C, A এবং In-order ট্রাভার্সাল D, B, E, A, F, C হলে রুট নোড ও তার বাম চাইল্ড কোনটি?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: পোস্ট-অর্ডারের শেষ উপাদান 'A' হলো রুট নোড। ইন-অর্ডারে 'A'-এর বামে আছে {D, B, E}, যা বাম সাব-ট্রি। পোস্ট-অর্ডারে {D, B, E}-এর মধ্যে সবার শেষে আছে 'B', সুতরাং 'B' হলো রুটের প্রত্যক্ষ বাম চাইল্ড।
পোস্ট-অর্ডারে রুট সর্বদা সবার শেষে থাকে। ইন-অর্ডারে এই রুট নোডটি বাম ও ডান সাব-ট্রিকে বিভক্ত করে।
অধ্যায় পড়া শেষ হয়েছে?
অনুশীলন শুরু করো

অনলাইন মক টেস্ট দিয়ে প্রস্তুতি যাচাই করো

পশ্চিমবঙ্গ মধ্যশিক্ষা পর্ষদ (WBBSE) পাঠ্যক্রম অনুযায়ী বহু বিকল্পীয় প্রশ্ন (MCQ) সমাধান করো। তাৎক্ষণিক ফলাফল, সঠিক ব্যাখ্যা এবং নিজের স্কোর জেনে নাও।

STAY UPDATED

Get the Latest Updates

New test series, syllabus updates, exam notifications and more.

Syllabus
Updates
Exam
Alerts
Study
Resources