আপনি হঠাৎ করেই একদল গণিতবিদের সাক্ষাৎ পেয়ে গেছেন, যাঁরা একইসাথে গায়ক-গীতিকারও। তাঁরা তাঁদের প্রিয় প্রতিটি সংখ্যার জন্য একটি করে গান লিখেছেন, আর আপনি নিশ্চয়ই ভাবতে পারেন, তাঁদের প্রিয় সংখ্যার কোনো শেষ নেই (যেমন 0 বা 73 বা 6174)।
আপনার প্রিয় সংখ্যাটির গানটি শুনতে আপনার কৌতূহল হচ্ছে, কিন্তু এতগুলো গানের ভিড়ে সঠিক গানটি খুঁজে বের করতে বেশ কিছুটা সময় লেগে যেতে পারে। সৌভাগ্যবশত, তাঁরা তাঁদের গানগুলো শিরোনাম অনুযায়ী সাজিয়ে একটি প্লেলিস্ট তৈরি করেছেন। আর সেই শিরোনাম আসলে সেই সংখ্যাটিই, যে সংখ্যা নিয়ে গানটি লেখা।
আপনি বুঝতে পারেন, শিরোনাম জানা থাকলে বাইনারি সার্চ অ্যালগরিদম ব্যবহার করে দ্রুত গানটি খুঁজে বের করা যায়।
আপনার কাজ হলো একটি বাইনারি সার্চ অ্যালগরিদম বাস্তবায়ন করা।
একটি বাইনারি সার্চ অ্যালগরিদম অ্যারেটিকে বারবার অর্ধেক করে ভাগ করে, আর যে অর্ধেকে আমাদের খোঁজা আইটেমটি থাকে কেবল সেই অর্ধেক ধরে রেখে, অ্যারের মধ্যে একটি আইটেম খুঁজে বের করে। এটি আমাদের আইটেমটির সম্ভাব্য অবস্থানগুলো দ্রুত কমিয়ে আনতে সাহায্য করে, যতক্ষণ না আমরা সেটি খুঁজে পাই বা সম্ভাব্য সব অবস্থান বাদ দিয়ে ফেলি।
বাইনারি সার্চ কেবল তখনই কাজ করে যখন অ্যারেটি সাজানো থাকে।
অ্যালগরিদমটি দেখতে এমন:
এখানে একটি উদাহরণ:
ধরা যাক, আমরা নিচের সাজানো অ্যারেতে 23 সংখ্যাটি খুঁজছি: [4, 8, 12, 16, 23, 28, 32].
[23, 28, 32].[23].Rust-এর স্ট্যান্ডার্ড লাইব্রেরিতেই আগে থেকেই একটি binary search function রয়েছে। এই অনুশীলনীর জন্য এই ফাংশনটি ব্যবহার করা উচিত নয়, বরং এর বদলে অন্য সাধারণ উপকরণগুলোই ব্যবহার করুন।
আপনার টেস্টগুলো কি পাস হয়েছে আর কোড কি পরিষ্কার হয়েছে? আপনি চাইলে আরও কিছু জিনিস চেষ্টা করে দেখতে পারেন।
বোনাস টেস্টগুলো চালাতে #[ignore] ফ্ল্যাগটি সরিয়ে নিন এবং generic ফিচার দিয়ে টেস্টগুলো চালান, এভাবে:
$ cargo test --features generic
তারপর অনুগ্রহ করে সাবমিশনের একটি কমেন্টে আপনার মতামত জানান। এই পরীক্ষা-নিরীক্ষা কি কোডকে আরও ভালো করেছে? নাকি খারাপ? এটি থেকে আপনি কি কিছু শিখতে পেরেছেন?
Exercism-এ সাইন আপ করুন, Rust ট্র্যাকের 99টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।