একটি পাইথন বাইনারি সার্চ একটি সোর্টেড অ্যারে-এ একটি আইটেমের পজিশন খুঁজে বের করে। এটি একটি তালিকাকে আধা করে ভাগ করে। যদি একটি নির্দিষ্ট মান মিডিল নম্বর থেকে বেশি হয়, তবে সার্চটি তালিকার ডান দিকের ওপর ফোকাস করে। অন্যথায়, সার্চটি তালিকার বাম দিকের ওপর নম্বরটি খুঁজে বের করে।
আপনি একটি লিস্টে একটি আইটেমের পজিশন কীভাবে খুঁজে বের করবেন? বাইনারি সার্চ সেই বিষয়ে আপনার পেছনে আছে। বাইনারি সার্চ ব্যবহার করে, আপনি সহজে একটি সোর্টেড অ্যারেতে একটি এলিমেন্টের পজিশন খুঁজে বের করতে পারেন।
কম্পিউটাররা লিস্ট সার্চ করে একটি নির্দিষ্ট আইটেম খুঁজে বের করতে দক্ষ। কম্পিউটাররা লিস্টে আইটেম খুঁজে বের করতে যে নিয়মগুলো ব্যবহার করে সেগুলোকে সার্চ অ্যালগরিদম বলা হয়। সবচেয়ে জনপ্রিয় পাইথন অ্যালগরিদমের একটি হলো বাইনারি সার্চ।
এই গাইডে, আমরা আলোচনা করব বাইনারি সার্চ কী এবং কীভাবে এটি কাজ করে। আমরা পাইথনে বাইনারি সার্চের একটি উদাহরণের মাধ্যমে যাবো যাতে আপনি আপনার প্রোগ্রামে একটা লিখতে শিখতে পারেন। চলুন শুরু করি!
পাইথন বাইনারি সার্চ কী?
একটি পাইথন বাইনারি সার্চ হলো একটি অ্যালগরিদম যা একটি অর্ডার্ড অ্যারেতে একটি এলিমেন্টের পজিশন খুঁজে বের করে। বাইনারি সার্চ বারবার একটি তালিকাকে দুটি হাফে ভাগ করে। তারপর, একটি সার্চ مقایনা করে যে একটি মান মিডিল মান থেকে বেশি কিনা কম।
বাইনারি সার্চ পারফর্ম করার দুটি উপায় রয়েছে। দুটি পদ্ধতিই পয়েন্টার সেট করে যেগুলো একটি অ্যারেতে একটি নির্দিষ্ট পয়েন্টে হাইএস্ট এবং লোয়েস্ট পজিশন ট্র্যাক করতে ব্যবহৃত হয়।
প্রথম পদ্ধতিটি হলো ইটেরেটিভ মেথড। এই পদ্ধতিতে, স্টেটমেন্টের একটি সেট রিপিট করা হয় একটি অ্যারেতে একটি এলিমেন্টের পজিশন নির্ধারণ করতে। পাইথনে, আমরা এই উদ্দেশ্যে একটি while লুপ ব্যবহার করি।
দ্বিতীয় পদ্ধতিটি হলো রিকার্সিভ মেথড। এটি হলো যেখানে আপনি একটি ফাংশন লিখেন যা বারবার নিজেকে কল করে যতক্ষণ না একটি লিস্টে একটি এলিমেন্ট পাওয়া যায়। রিকার্সিভ মেথড ডিভাইড এন্ড কনকর অ্যাপ্রোচ ব্যবহার করে যা আমরা আগে আলোচনা করেছি এবং সার্চ করার প্রক্রিয়া রিপিট করে যতক্ষণ না একটি এলিমেন্ট পাওয়া যায়।
বাইনারি সার্চ ট্রি পাইথন: ধাপে ধাপে
ডিভাইড এন্ড কনকর এবং রিকার্সিভ নিয়ে সারিবার কথা বলার কারণে, বাইনারি সার্চ কীভাবে কাজ করে সেটি টracula.track রাখা সহজে হারিয়ে যেতে পারে। সেটাই কারণ, আমরা সরাসরি একটি উদাহরণে যাবো কীভাবে বাইনারি সার্চ কাজ করে। নিচের তালিকাটি বিবেচনা করুন:
| 7 | 9 | 14 | 22 | 34 |
আমরা আমাদের লিস্টে "22" নম্বরটি খুঁজে বের করব।
শুরুতে, আমরা আমাদের লিস্টে দুটি পয়েন্টার সেট করব। একটি পয়েন্টার লিস্টে হাইএস্ট ভ্যালু রিফ্লেক্ট করবে, এবং অন্য পয়েন্টার লোয়েস্ট ভ্যালু রিফ্লেক্ট করবে:
| Low | High | |||
| 7 | 9 | 14 | 22 | 34 |
আমাদের পরবর্তী ধাপ হলো অ্যারেতে মিডিল এলিমেন্ট খুঁজে বের করা, যা ১৪। যদি এই মানটি সেটির সমান হয় যেটি আমরা খুঁজছি, তবে এই মানটি ফেরত দেওয়া উচিত।
এই কেসে, ১৪ ২২-এর সমান নয়। তাই, আমাদের প্রোগ্রামকে একটি তুলনা করতে হবে।
আমরা সার্চ করা নম্বরটি বর্তমান মিডিল এলিমেন্টের ডান পাশের এলিমেন্টের মিডিল এলিমেন্টের সাথে তুলনা করব। আমরা এটা শুধু করব যদি সার্চ করা নম্বরটি মিডিল নম্বর থেকে বেশি হয়। অন্যথায়, আমরা বর্তমান মিডিল এলিমেন্টের বাম পাশের মিডিল এলিমেন্টের সাথে তুলনা করব।
নম্বর ২২, ১৪-এর চেয়ে বড়। আমাদের প্রোগ্রাম আমাদের বর্তমান মিডিল এলিমেন্ট (১৪)-এর ডান পাশের মিডিল এলিমেন্টের সাথে ২২ তুলনা করা শুরু করে। এই কেসে, সেটি নম্বর ২২। এটি সার্চ করা নম্বরটির সমান।
| Low | Middle | High | ||
| 7 | 9 | 14 | 22 | 34 |
আমরা আমাদের মিডিল মান পেয়ে গেলাম। আমাদের প্রোগ্রাম এখন সেই নম্বরের ইনডেক্স পজিশন ফেরত দেবে। এই কেসে, ২২-এর ইনডেক্স পজিশন ৩ (মনে রাখবেন, লিস্টগুলো ০ থেকে ইনডেক্সড হয়!)।
পাইথনে বাইনারি সার্চ ইমপ্লিমেন্ট করা
চলুন কিছু পাইথন কোডে হাত ডুবাই। আমরা আগে আলোচনা করা দুটি পদ্ধতি: ইটেরেটিভ এবং রিকার্সিভ মেথড ব্যবহার করে বাইনারি সার্চের পাইথন ইমপ্লিমেন্টেশন অন্বেষণ করব।
পাইথনে ইটেরেটিভ বাইনারি সার্চ
আমরা ইটেরেটিভ মেথড দিয়ে শুরু করব। এখানে আমরা আমাদের লিস্টের প্রতিটি আইটেমের মধ্য দিয়ে লুপ করব। তারপর, আমরা লিস্টে মিডিল মান খুঁজে বের করব। আমরা এটা চলতে থাকব যতক্ষণ না আমরা যে মানটি খুঁজছি সেটি পেয়ে যাই।
বাইনারি সার্চ ফাংশন
আমরা আমাদের বাইনারি সার্চের জন্য একটি পাইথন ফাংশন সংজ্ঞায়িত করি:
def findValue(numbers, number_to_find):
low = 0
high = len(numbers) - 1
while low <= high:
middle = low + (high - low) // 2
if numbers[middle] == number_to_find:
return middle
elif numbers[middle] < number_to_find:
low = middle + 1
else:
high = middle - 1
return -1
আমাদের ফাংশন দুটি প্যারামিটার গ্রহণ করে: যে লিস্টের মধ্য দিয়ে আমরা সার্চ করতে চাই, এবং যে নম্বরটি আমরা আমাদের লিস্টে খুঁজতে চাই।
আমরা তারপর দুটি পাইথন ভেরিয়েবল ঘোষণা করি যা লিস্টে লোয়েস্ট এবং হাইএস্ট ভ্যালুর ডিফল্ট মান সংরক্ষণ করে। low ০ সেট করা হয়েছে, যা লিস্টে স্ট্রাটিং ইনডেক্স মান। high লিস্টের দৈর্ঘ্য মাইনাস এক সেট করা হয়েছে (কারণ লিস্ট ০ থেকে ইনডেক্সড)।
আমাদের পরবর্তী ধাপ ছিল একটি পাইথন while লুপ ঘোষণা করা। এই লুপ চলে যতক্ষণ না লোয়েস্ট এলিমেন্ট ছোট বা সমান হয় হাইএস্ট নম্বরের। এর মানে আমাদের লুপ শুধু তখন চলবে যতক্ষণ না আমাদের নম্বরটি পাওয়া যায়।
তারপর, আমরা মিডিল নম্বর ক্যালকুলেট করি। আমরা হাইএস্ট ভ্যালু থেকে লোয়েস্ট ভ্যালু বিয়োগ করি। তারপর, আমরা ২ দিয়ে ভাগ করার পর মডুলো (বাকি) ক্যালকুলেট করি। তারপর, আমরা মডুলোকে লোয়েস্ট নম্বরের ভ্যালুর সাথে যোগ করি।
যদি আমাদের লিস্টের মিডিল নম্বরটি সেটির সমান হয় যেটি আমরা খুঁজতে চাই, তবে আমরা সেই নম্বরের পজিশন ফেরত দেই।
আমরা আমাদের নতুন "low" নম্বরকে মিডিল পজিশন থেকে এক বেশি সেট করি। এটি ঘটে যদি মিডিল নম্বরটি সেটির চেয়ে কম হয় যেটি আমরা খুঁজছি। এটা আমাদের সার্চকে আমাদের লিস্টের বাম দিকের ওপর নেমে আনয়, যেমন আমরা আগে ভিজ্যুয়াল উদাহরণে করেছি।
অন্যথায়, আমরা আমাদের "high" নম্বরকে মিডিল পজিশন থেকে এক কম সেট করি। এটা আমাদের সার্চকে আমাদের লিস্টের ডান দিকের ওপর নেমে আনয়।
এটি রিপিট হয় যতক্ষণ না low high-এর সমান বা কম হয়। যদি আমাদের মান না পাওয়া যায়, তবে আমরা -1 ফেরত দেই। আমরা এক মিনিটে কেন -1 ফেরত দেয় সেটি আলোচনা করব।
সার্চ এক্সিকিউট করা
নিচের কোড আপনার প্রোগ্রামের নিচে যোগ করুন, findValue ফাংশনের বাইরে:
numbers = [7, 9, 14, 22, 34]
number_to_find = 22
final = findValue(numbers, number_to_find)
if final == -1:
print("This item was not found in the list.")
else:
print("The number " + str(number_to_find) + " was found at index position " + str(final) + ".")
আমরা সার্চ করতে চাই যেসব আইটেমের লিস্ট সেটি ঘোষণা করে শুরু করেছি। তারপর আমরা যে নম্বরটি খুঁজতে চাই সেটি নির্দিষ্ট করেছি, যা ২২।
পরবর্তীতে, আমরা আমাদের findValue() ফাংশন কল করি এবং এর মাধ্যমে লিস্টটি পাস করি।
এখান থেকে আগে -1 আসে। যদি আমাদের ফাংশন দ্বারা ফেরত দেওয়া নম্বর -1 হয়, তবে এর মানে আমাদের আইটেম লিস্টে পাওয়া যায়নি। প্রোগ্রামাররা প্রায়শই এই টাইপের পরিস্থিতিতে -1 ব্যবহার করেন কারণ আমাদের সার্চ ফাংশন একটি নেগেটিভ নম্বর ফেরত দিতে পারে না।
অন্যথায়, আমাদের প্রোগ্রাম একটি মেসেজ প্রিন্ট করে যা আমাদের সেই ভ্যালুর ইনডেক্স পজিশন বলে দেয়।
আমাদের কোড ফেরত দেয়:
The number 22 was found at index position 3.
এখন আমরা জানি নম্বর ২২ ইনডেক্স পজিশন ৩-এ উপস্থিত।
পাইথনে রিকার্সিভ বাইনারি সার্চ
আমরা রিকার্সিভ ব্যবহার করেও বাইনারি সার্চ পারফর্ম করতে পারি। এখানে আমরা একটি ফাংশন সংজ্ঞায়িত করব যা নিজেকে বারবার কল করবে যতক্ষণ না একটি কন্ডিশন — আমাদের নম্বর পাওয়া যাওয়া — মেট হয়।
একটি রিকার্সিভ ফাংশন সংজ্ঞায়িত করা
আগের উদাহরণের মতো, আমরা আমাদের বাইনারি সার্চ পারফর্ম করার একটি ফাংশন লিখতে শুরু করব:
def findValue(numbers, number_to_find, low, high):
if high >= low:
middle = low + (high - low) // 2
if numbers[middle] == number_to_find:
return middle
elif numbers[middle] < number_to_find:
return findValue(numbers, number_to_find, middle + 1, high)
else:
return findValue(numbers, number_to_find, low, middle - 1)
else:
return -1
আমাদের কোড কিছুটা আমাদের আগের উদাহরণের মতো।
আমরা চেক করে শুরু করি হাইএস্ট ভ্যালু লোয়ের চেয়ে büyük বা সমান কিনা। যদি সেটি হয়, তবে আমাদের প্রোগ্রাম -1 ফেরত দেবে। অন্যথায়, এটি বাইনারি সার্চ পারফর্ম করা শুরু করবে।
আমরা আগের উদাহরণের মতো একই পদ্ধতিতে মিডিল নম্বর ক্যালকুলেট করি। প্রথমে, হাইএস্ট থেকে লোয়েস্ট বিয়োগ করি। তারপর, ২ দিয়ে ভাগ করার পর মডুলো (বাকি) ক্যালকুলেট করি। শেষে, লোয়েস্ট নম্বর যোগ করি।
আমরা তারপর একটি if স্টেটমেন্ট লিখেছি যা ডिसাইড করে আমাদের বাইনারি সার্চ কীভাবে প্রসিড করবে:
- যদি মিডিল নম্বরটি সেটির সমান হয় যেটি আমরা খুঁজছি, তবে সেই নম্বরের পজিশন ফেরত দেওয়া হয়।
- যদি মিডিল নম্বরটি সেটির চেয়ে কম হয় যেটি আমরা খুঁজছি, তবে আমাদের findValue() ফাংশন আবার কল করা হয়। এই বার, low-এর মান সেট করা হয় এক একটা বেশি মিডিল ভ্যালুর।
- যদি মিডিল নম্বরটি সেটির চেয়ে বেশি হয় যেটি আমরা খুঁজছি, তবে findValue() ফাংশন কল করা হয়। "high"-এর মান এক কম হবে মিডিল ভ্যালুর।
মেইন প্রোগ্রাম লিখা
আমাদের যা বাকি থাকলো সেটি হলো আমাদের মেইন প্রোগ্রাম লিখা:
numbers = [7, 9, 14, 22, 34]
number_to_find = 22
final = findValue(numbers, number_to_find, 0, len(numbers) - 1)
if final == -1:
print("This item was not found in the list.")
else:
print("The number " + str(number_to_find) + " was found at index position " + str(final) + ".")
আমাদের মেইন প্রোগ্রাম আমাদের আগের উদাহরণের মতোই, বরং এক পার্থক্য রয়েছে। আমরা আমাদের findValue() ফাংশনে দুটি নতুন প্যারামিটার পাস করছি: low এবং high।
আমাদের এটা করতে হচ্ছে কারণ আমাদের অ্যালগরিদম রিকার্সিভ, এবং আমরা সেই মানগুলো আমাদের ফাংশনে অ্যাসাইন করতে পারি না। যদি আমরা ফাংশনে মানগুলো অ্যাসাইন করতাম, তবে সেগুলো প্রতিবার ফাংশন এক্সিকিউট হলে রিসেট হয়ে যেতো, যা আমাদের সার্চ অ্যালগরিদম ভাঙিয়ে দিত।
আমাদের কোড ফেরত দেয়:
The number 22 was found at index position 3.
আমরা আগের উদাহরণের মতো একই রেজাল্ট পেয়েছি। এই উদাহরণে, আমরা ইটেরেটিভ প্রোগ্রামের বদলে একটি রিকার্সিভ প্রোগ্রাম ব্যবহার করেছি আমাদের বাইনারি সার্চ পারফর্ম করতে।
পাইথন বাইনারি সার্চ কখন ব্যবহার করবেন
একটি বাইনারি সার্চ নম্বরের একটি লিস্ট সার্চ করার একটি দক্ষ উপায়। এই সার্চ লিনিয়ার সার্চের চেয়ে বেশি দক্ষ। এর কারণ বাইনারি মেথড আপনার সার্চকে আধা করে দেয় যavana আপনি একটি সোর্টেড লিস্টের মিডিল খুঁজে পান।
এটি নোট করা গুরুত্বপূর্ণ যে একটি লিস্টকে সংখ্যাসূচকভাবে অর্ডার করা থাকা উচিত বাইনারি সার্চ ব্যবহার করার আগে। বাইনারি সার্চ পারফর্ম করার আগে, নিশ্চিত করুন আপনার নম্বরগুলো আরোহী ক্রমে সোর্টেড।
পাইথনে বাইনারি সার্চ কমপ্লেক্সিটি ব্রেকডাউন
বাইনারি সার্চের কমপ্লেক্সিটি কী? ভালো প্রশ্ন।
বাইনারি সার্চ অ্যালগরিদমের বেস্ট কেস কমপ্লেক্সিটি O(1)। এটি ঘটে যখন প্রথম তুলনাটি সেটির সমান হয় যেটি আপনি খুঁজছেন।
বাইনারি সার্চের এভারেজ এবং ওর্স্ট কেস কমপ্লেক্সিটি O(log n)। এর মানে সার্চ কন্ডাক্ট করতে যে সময় লাগে সেটি লগারিদমিকভাবে বেড়ে যায় লিস্টে সার্চ করার জন্য কতগুলো আইটেম রয়েছে সেটার উপর নির্ভর করে।
উপসংহার
বাইনারি সার্চ একটি লিস্টে একটি ভ্যালুর ইনডেক্স পজিশন খুঁজে বের করার একটি দক্ষ উপায়।
প্রতিবার বাইনারি সার্চ রান হলে, সার্চটি লিস্টকে দুটি অংশে ভাগ করবে। সার্চটি লিস্টের সেটি পাশের ওপর ফোকাস করবে যেটি আপনি যে নম্বরটি খুঁজছেন সেটির সবচেয়ে নিকট।
সার্চ প্রতিবার রান হলে, প্রোগ্রামকে সার্চ করতে যে পরিমান নম্বরের মধ্য দিয়ে যেতে হয় সেটি হাফ হয়ে যায়।
পাইথন সম্পর্কে আরও জানতে, আমাদের How to Learn Python গাইড পড়ুন।