বাইনারি সার্চ (Binary Search)
ধরুন আপনাকে ১ থেকে ১০০ এর মধ্যে একটি সংখ্যা অনুমান করতে বা গেস (guess) করতে বলা হয়েছে। ১ থেকে শুরু করে ওপরের দিকে একটি একটি করে না গিয়ে, আপনি হয়তো সরাসরি ৫০ অনুমান করলেন। সংখ্যাটি যদি বেশি বড় হয়ে যায়? তাহলে এখন আপনার ভাবনার বিষয় শুধু ১–৪৯। এরপর ২৫ অনুমান করুন। এবার কি সংখ্যাটি খুব ছোট হয়ে গেল? তাহলে আপনার নতুন রেঞ্জ হলো ২৬–৪৯। আপনার প্রতিটি অনুমান আপনার অপশনগুলোকে ঠিক অর্ধেক করে দেয়।
সংক্ষেপে এটিই হলো বাইনারি সার্চ (binary search)। প্রতিটি আইটেমকে একটি একটি করে চেক করার পরিবর্তে, আপনি সবসময় যা অবশিষ্ট থাকে তার মাঝখানের আইটেমটি চেক করবেন — এবং যে অর্ধেকাংশে আপনার উত্তরটি থাকার কোনো সম্ভাবনা নেই সেটিকে পুরোপুরি বাতিল করে দেবেন।
তবে এর একটি শর্ত আছে: লিস্টটিকে অবশ্যই সাজানো বা সর্টেড (sorted) হতে হবে। সাজানো না থাকলে আপনি বুঝতেই পারবেন না যে কোন অর্ধেকটিকে আপনি বাতিল করবেন।
এটি এত দ্রুতগতির কেন
প্রতিবার তুলনা বা কম্পারিজন করার পর, বাকি থাকা উপাদানগুলোর ঠিক অর্ধেক বাতিল হয়ে যায়। মাত্র ১০ বার তুলনা করার পরই, ১,০২৪টি উপাদানের একটি লিস্ট ছোট হয়ে মাত্র ১টিতে নেমে আসে। আর ৩০ বার তুলনা করার পর, আপনি এক বিলিয়ন বা একশ কোটি উপাদানের মধ্যে খোঁজা বা সার্চ করার কাজ শেষ করে ফেলতে পারেন। এটিই হলো \(O(\log n)\) এর মূল শক্তি।
ইটারেটিভ টেমপ্লেট (The iterative template)
দুটি পয়েন্টার (pointers) রাখুন: lo (বাম সীমানা) এবং hi (ডান সীমানা)। প্রতিটি ধাপে, mid = lo + (hi - lo) / 2 গণনা করুন — ইনটিজার ওভারফ্লো (integer overflow) এড়াতে সর্বদা এই নিয়মটিই বা সূত্রটিই ব্যবহার করবেন। যদি আপনার arr[mid] লক্ষ্য বা টার্গেটের সমান হয়, তবে আপনার কাজ শেষ। যদি এটি খুব ছোট হয়, তবে lo = mid + 1 এ সরে আসুন। আর যদি এটি খুব বড় হয়, তবে hi = mid - 1 এ সরে আসুন। যতক্ষণ lo <= hi থাকে, ততক্ষণ লুপটি বা চক্রটি চলতে দিন।
প্রথম বা শেষ উপস্থিতি খুঁজে বের করা (Finding first or last occurrence)
লিস্টে যখন একই উপাদানের ডুপ্লিকেট (duplicates) থাকে, তখন প্রথমবার মিল পেলেই থেমে যাবেন না। সবচেয়ে বামের (leftmost) উপস্থিতি খুঁজে পেতে: যখন arr[mid] == target হবে, তখন ইনডেক্সটি মনে রাখুন বা রেকর্ড করুন এবং hi = mid - 1 করে বাম দিকে খুঁজতে থাকুন। আর সবচেয়ে ডানের (rightmost) জন্য, রেকর্ড করুন এবং lo = mid + 1 করে ডান দিকে যান। এটিই মূলত সি++ (C++) এর lower_bound এবং upper_bound এর পেছনের মূল কাজ করার পদ্ধতি বা প্যাটার্ন।
বাইনারি সার্চ (Binary Search)
Complexity
ছোট কুইজ
পড়া চালিয়ে যান