পাঠ ০২ · ৫৭-এর মধ্যে · মডিউল ১
Home / Courses / Design and Analysis of Algorithms / সিউডোকোড

সিউডোকোড কনভেনশন ও অ্যালগরিদম লেখা

Pseudocode conventions and writing algorithms
৭ মিনিট পড়া সহজ · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • সিউডোকোড লেখার মৌলিক কনভেনশন — ইনডেন্টেশন, অ্যাসাইনমেন্ট, লুপ, শর্ত
  • 0-ইনডেক্সিং বনাম 1-ইনডেক্সিং কনভেনশনের পার্থক্য এবং কেন তা গুরুত্বপূর্ণ
  • একটি সিউডোকোড অ্যালগরিদমকে হুবহু Python কোডে অনুবাদ করার প্রক্রিয়া
  • কেন সিউডোকোড ভাষা-নিরপেক্ষ রাখা অ্যালগরিদম ডিজাইন ও অ্যানালাইসিসের জন্য গুরুত্বপূর্ণ

১ · সিউডোকোড কেন প্রয়োজন

L01-এ আমরা দেখেছি — অ্যালগরিদম হলো ধারণা, আর বাস্তবায়ন (implementation) হলো সেই ধারণাকে একটি নির্দিষ্ট প্রোগ্রামিং ভাষায় প্রকাশ করা। কিন্তু একটি ধারণা কাগজে-কলমে বা আলোচনায় স্পষ্টভাবে প্রকাশ করতে হলে কোনো না কোনো নোটেশন দরকার। এখানেই সিউডোকোডPseudocodeঅ্যালগরিদম প্রকাশ করার একটি আধা-আনুষ্ঠানিক, ভাষা-নিরপেক্ষ নোটেশন — কোনো একটি নির্দিষ্ট প্রোগ্রামিং ভাষার কম্পাইলার/ইন্টারপ্রেটারে চালানোর উদ্দেশ্যে লেখা হয় না। কাজে আসে।

সিউডোকোডের লক্ষ্য হলো অ্যালগরিদমের লজিক যতটা সম্ভব স্পষ্টভাবে প্রকাশ করা, আর ভাষা-নির্দিষ্ট খুঁটিনাটি (ভ্যারিয়েবল টাইপ ডিক্লেয়ারেশন, মেমরি ম্যানেজমেন্ট, ইম্পোর্ট স্টেটমেন্ট, সিনট্যাক্স এরর) বাদ দেওয়া — যাতে পাঠক (বা লেখক নিজে) সরাসরি সঠিকতা ও জটিলতা বিশ্লেষণে মনোযোগ দিতে পারেন, যা এই কোর্সের মূল বিষয়। একটি ভালো সিউডোকোড যেকোনো প্রোগ্রামার — ভাষা নির্বিশেষে — পড়ে বুঝতে ও বাস্তবায়ন করতে পারবেন।

২ · মৌলিক কনভেনশন

কোনো একক "সরকারি" সিউডোকোড স্ট্যান্ডার্ড নেই, কিন্তু বেশিরভাগ টেক্সটবুক ও এই কোর্স নিচের কনভেনশনগুলো অনুসরণ করে:

ইনডেন্টেশন = ব্লক
Python-এর মতোই — কোনো begin/end বা ব্রেস { } ছাড়াই, ইনডেন্টেশনের স্তর দিয়েই কোন স্টেটমেন্টগুলো কোন লুপ/শর্তের ভেতরে তা বোঝানো হয়।
অ্যাসাইনমেন্ট (←)
একটি মান কোনো ভ্যারিয়েবলে সংরক্ষণ করাকে ← চিহ্ন দিয়ে দেখানো হয় (Python-এর =-এর সমতুল্য), যাতে গাণিতিক সমতা (=) এর সাথে গুলিয়ে না যায়।
লুপ — for / while
for i ← a to b একটি নির্দিষ্ট সংখ্যক পুনরাবৃত্তির জন্য; while কোনো শর্ত সত্য থাকা পর্যন্ত পুনরাবৃত্তির জন্য — ঠিক Python-এর মতোই দুটো ভিন্ন ব্যবহারক্ষেত্র।
শর্ত — if / else
if condition, else — বুলিয়ান শর্তের ভিত্তিতে ভিন্ন পথে যাওয়া, প্রায় সব ভাষাতেই একই গঠন।
কমেন্ট
// ... দিয়ে ব্যাখ্যা যোগ করা হয় — কোডের অংশ নয়, শুধু পাঠকের জন্য।
return
ফাংশনের ফলাফল ফেরত দেওয়ার জন্য — যেকোনো ভাষাতেই সরাসরি অনুবাদযোগ্য।
সমস্যা / ধারণা (algorithmic idea) সিউডোকোড ভাষা-নিরপেক্ষ, আধা-আনুষ্ঠানিক বাস্তবায়ন (Python / C++ / Java ...)
একই সিউডোকোড একাধিক ভাষায় বাস্তবায়িত হতে পারে — লজিক অপরিবর্তিত থাকে, শুধু সিনট্যাক্স বদলায়।

৩ · ইনডেক্সিং কনভেনশন — 0-ইনডেক্সিং বনাম 1-ইনডেক্সিং

একটি অ্যারের এলিমেন্টগুলোর নম্বরিং কোথা থেকে শুরু হবে তা নিয়ে দুটো ভিন্ন কনভেনশন প্রচলিত আছে। এই কোর্স — Python-এর সাথে সঙ্গতি রেখে — সবসময় 0-ইনডেক্সিং ব্যবহার করবে:

$$ \text{এই কোর্স / Python:} \quad A[0],\ A[1],\ A[2],\ \ldots,\ A[n-1] \quad (n \text{টি এলিমেন্ট}) $$

কিন্তু Cormen-Leiserson-Rivest-Stein-এর বিখ্যাত টেক্সটবুক Introduction to Algorithms (CLRS) সহ বেশ কিছু ক্লাসিক টেক্সটবুক 1-ইনডেক্সিং ব্যবহার করে:

$$ \text{CLRS-স্টাইল:} \quad A[1],\ A[2],\ A[3],\ \ldots,\ A[n] \quad (n \text{টি এলিমেন্ট}) $$

অন্য উৎস থেকে সিউডোকোড অনুবাদ করার সময়

যদি কোনো টেক্সটবুক 1-ইনডেক্সিং ব্যবহার করে সিউডোকোড লেখে এবং আপনি সেটি Python-এ (0-ইনডেক্সিং) বাস্তবায়ন করেন, তাহলে সাধারণত প্রতিটি ইনডেক্স থেকে ১ বিয়োগ করতে হয় — যেমন CLRS-এর for i ← 1 to n (যা A[1] থেকে A[n] পর্যন্ত সব এলিমেন্ট কভার করে) Python-এ হয়ে যায় for i in range(0, n) (যা A[0] থেকে A[n-1] পর্যন্ত সব এলিমেন্ট কভার করে) — মোট এলিমেন্ট সংখ্যা একই ($n$), শুধু শুরুর বিন্দু ভিন্ন। এই কোর্সের সব সিউডোকোড ইতিমধ্যে 0-ইনডেক্সিং-এ লেখা থাকবে, তাই এই রূপান্তর নিজে করতে হবে না — কিন্তু বাইরের কোনো রিসোর্স পড়ার সময় এই পার্থক্যটি মনে রাখা জরুরি।

৪ · একটি সম্পূর্ণ উদাহরণ — সিউডোকোড থেকে Python

নিচে একটি সাধারণ অ্যালগরিদমের সিউডোকোড দেওয়া হলো — একটি অ্যারের সর্বোচ্চ মান খুঁজে বের করা (0-ইনডেক্সিং-এ লেখা)। এটি শুধু ব্যাখ্যামূলক টেক্সট — সরাসরি চালানো যায় না:

সিউডোকোড · ব্যাখ্যামূলক, চালানো যায় না
FIND-MAX(A)
  max ← A[0]
  for i ← 1 to length(A) - 1
      if A[i] > max
          max ← A[i]
  return max

লক্ষ্য করুন — লুপটি ইনডেক্স 1 থেকে শুরু হয়েছে, 0 থেকে নয়, কারণ A[0] ইতিমধ্যে প্রাথমিক অনুমান হিসেবে max-এ বসানো হয়েছে; বাকি এলিমেন্টগুলোর (A[1] থেকে A[n-1] পর্যন্ত) সাথে তুলনা করাই যথেষ্ট। এবার এটিকে হুবহু Python-এ অনুবাদ করে একটি সত্যিকারের ইনপুটে চালিয়ে দেখা যাক:

Python
def find_max(A):
    max_val = A[0]
    for i in range(1, len(A)):
        if A[i] > max_val:
            max_val = A[i]
    return max_val

arr = [3, 41, 7, 19, 25, 8]
print("ইনপুট অ্যারে:", arr)
print("সর্বোচ্চ মান:", find_max(arr))
print("পাইথনের max() ফাংশনের সাথে মিলছে:", find_max(arr) == max(arr))

    
অনুবাদটি প্রায় হুবহু, লাইন-বাই-লাইন — সিউডোকোডের max ← A[0] হয়ে গেছে max_val = A[0] (Python-এ max নামটি বিল্ট-ইন ফাংশনের সাথে সংঘর্ষ এড়াতে max_val ব্যবহার করা হয়েছে — এটি একটি বাস্তবায়ন-স্তরের বিস্তারিত বিষয়, অ্যালগরিদমের লজিকের অংশ নয়), for i ← 1 to length(A) - 1 হয়ে গেছে for i in range(1, len(A)) (Python-এর range(a, b) ইতিমধ্যে b বাদ দিয়ে থামে, তাই সিউডোকোডের to length(A) - 1-কে আলাদা করে - 1 লেখার দরকার হয়নি)। আউটপুটে দেখা যাবে find_max সঠিকভাবে 41 ফেরত দিচ্ছে এবং Python-এর নিজস্ব max()-এর সাথে মিলছে।

৫ · পসিউডোকোড → Python ম্যাপিং

নিচে এই কোর্সে বারবার ব্যবহৃত হবে এমন কয়েকটি সিউডোকোড নির্মাণ ও তাদের Python সমতুল্য একসাথে দেখানো হলো:

সিউডোকোড: x ← 5
Python: x = 5
সিউডোকোড: for i ← a to b
Python: for i in range(a, b + 1)
সিউডোকোড: while condition
Python: while condition:
সিউডোকোড: if p then ... else ...
Python: if p: ... else: ...
মূল কথা · Key takeaway

সিউডোকোড শেখা মানে একটি নতুন প্রোগ্রামিং ভাষা শেখা নয় — এটি একটি যোগাযোগের নোটেশন, যা অ্যালগরিদমের লজিককে যেকোনো নির্দিষ্ট ভাষার সিনট্যাক্স থেকে আলাদা করে রাখে। এই কোর্সের বাকি সব পাঠে সিউডোকোড ব্যবহৃত হবে অ্যালগরিদম বর্ণনার জন্য, এবং প্রতিটি ক্ষেত্রে একটি সত্যিকারের চলমান Python অনুবাদও থাকবে — যেন তত্ত্ব ও বাস্তবায়ন সবসময় হাতে-হাতে যাচাই করা যায়।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ কেন সিউডোকোডে ভ্যারিয়েবলের টাইপ ডিক্লেয়ারেশন (যেমন int, string) সাধারণত লেখা হয় না, অথচ অনেক বাস্তব প্রোগ্রামিং ভাষায় (যেমন C++) তা বাধ্যতামূলক?

সিউডোকোডের লক্ষ্য অ্যালগরিদমের লজিক প্রকাশ করা — একটি ভ্যারিয়েবল কোন টাইপের হবে তা একটি বাস্তবায়ন-স্তরের সিদ্ধান্ত, অ্যালগরিদমের সঠিকতা বা জটিলতার সাথে সরাসরি সম্পর্কিত নয় (যদিও RAM মডেলে অপারেন্ডের আকার নিয়ে একটি সূক্ষ্ম ব্যতিক্রম আছে, যা M1/L04-এ আলোচনা করা হবে)। টাইপ ডিক্লেয়ারেশন বাদ দিলে সিউডোকোড সংক্ষিপ্ত ও ভাষা-নিরপেক্ষ থাকে।

প্র ০২ একটি টেক্সটবুক 1-ইনডেক্সিং ব্যবহার করে for i ← 1 to n লিখেছে যা পুরো অ্যারে A[1..n] কভার করে। Python-এ (0-ইনডেক্সিং) এটি বাস্তবায়ন করলে লুপের বাউন্ডে কী পরিবর্তন লাগবে?

পুরো অ্যারে (মোট nটি এলিমেন্ট) কভার করতে Python-এ লিখতে হবে for i in range(0, n) — যা A[0] থেকে A[n-1] পর্যন্ত ঠিক nটি এলিমেন্টই কভার করে। মূল কথা: এলিমেন্টের সংখ্যা একই থাকে, শুধু ইনডেক্সের শুরুর বিন্দু ১ থেকে ০-তে সরে যায়।

প্র ০৩ উপরের find_max কোডে লুপ range(1, len(A)) দিয়ে শুরু হয়েছে, range(0, len(A)) দিয়ে নয় কেন? দ্বিতীয়টি ব্যবহার করলে কি ফলাফল ভুল হতো?

না, ফলাফল ভুল হতো না — range(0, len(A)) ব্যবহার করলেও সঠিক সর্বোচ্চ মানই পাওয়া যেত, কারণ A[0]-কে নিজের সাথে তুলনা করলে (A[0] > max_val যেখানে max_val ইতিমধ্যে A[0]) শর্তটি সবসময় মিথ্যা হবে, তাই max_val পরিবর্তন হবে না। কিন্তু range(1, len(A)) ব্যবহার করলে এই অপ্রয়োজনীয় (redundant) একটি তুলনা এড়ানো যায় — সামান্য হলেও এটি একটি ইচ্ছাকৃত, দক্ষতা-সচেতন সিদ্ধান্ত।

অনুশীলন

  1. চিন্তা করুন: find_max-এর প্যাটার্ন অনুসরণ করে একটি অ্যারের সর্বনিম্ন মান খুঁজে বের করার সিউডোকোড লিখুন। কোন একটি অংশ বদলাতে হবে?

    শুধু তুলনার দিক উল্টাতে হবে — FIND-MIN(A)-এ min ← A[0] দিয়ে শুরু করে, লুপের ভেতরে A[i], min-এর চেয়ে ছোট হলে min ← A[i] করতে হবে (অর্থাৎ তুলনার চিহ্নটি "বড়" থেকে "ছোট"-এ বদলাতে হবে) — বাকি পুরো গঠন (ইনডেক্সিং, লুপ বাউন্ড) অপরিবর্তিত থাকে।

  2. পরীক্ষা করুন: উপরের কোড সেলে arr-এ ঋণাত্মক সংখ্যাসহ একটি নতুন অ্যারে বসিয়ে (যেমন arr = [-5, -1, -20, -3]) Run চাপুন — find_max কি সঠিক আউটপুট দেয়?

    হ্যাঁ — find_max([-5, -1, -20, -3]) সঠিকভাবে -1 ফেরত দেবে (ঋণাত্মক সংখ্যার মধ্যে সবচেয়ে বড়টি), এবং find_max(arr) == max(arr) লাইনটি True প্রিন্ট করবে। অ্যালগরিদমের লজিক সংখ্যার চিহ্ন (ধনাত্মক/ঋণাত্মক) নিয়ে কোনো অনুমান করে না — এটিই একটি সঠিক অ্যালগরিদমের বৈশিষ্ট্য (L01-এর "সব বৈধ ইনপুটে সঠিক" এই সংজ্ঞা মনে করুন)।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ অ্যাসিম্পটোটিক অ্যানালাইসিস, রিকারেন্স, ডিভাইড অ্যান্ড কনকার, গ্রিডি, DP, গ্রাফ অ্যালগরিদম, ব্যাকট্র্যাকিং, স্ট্রিং অ্যালগরিদম, অ্যামর্টাইজড অ্যানালাইসিস, NP-কমপ্লিটনেস ও অ্যাপ্রক্সিমেশন — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
  • Data Structures & Algorithms কোর্স সহোদর কোর্স অ্যালগরিদমগুলো কীভাবে কাজ করে ও ইমপ্লিমেন্ট করতে হয় তার ভিত্তি সেই কোর্সেই তৈরি হয়েছে — এই কোর্স সঠিকতা প্রমাণ ও অ্যানালাইসিসে গভীরে যায়।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation, Engineering Economics, Full-Stack Web Frameworks, Mobile App Development, Ethics in Computing & AI Safety, Software Testing & Quality Assurance ও Design and Analysis of Algorithms — সব এক জায়গায়।
আগের পাঠ
অ্যালগরিদম কী এবং কেন ডিজাইন ও অ্যানালাইসিস গুরুত্বপূর্ণ