به گروهی از ریاضیدانها برخورد کردهاید که خواننده-ترانهسرا هم هستند. آنها برای هر یک از اعداد مورد علاقهشان یک ترانه نوشتهاند و همانطور که میتوانید تصور کنید، اعداد مورد علاقهی زیادی دارند (مثل ۰ یا ۷۳ یا ۶۱۷۴).
کنجکاو هستید ترانهی عدد مورد علاقهی خودتان را بشنوید، اما با این همه ترانه که باید یکییکی بررسی کنید، پیدا کردن ترانهی درست ممکن است مدتی طول بکشد. خوشبختانه، آنها ترانههایشان را در یک فهرست پخش مرتبشده بر اساس عنوان سازمان دادهاند؛ عنوان هم همان عددی است که ترانه دربارهی آن است.
متوجه میشوید که میتوانید از یک الگوریتم «جستوجوی دودویی» استفاده کنید تا با دانستن عنوان، ترانه را بهسرعت پیدا کنید.
وظیفهی شما پیادهسازی یک الگوریتم جستوجوی دودویی است.
الگوریتم جستوجوی دودویی عنصری را در یک فهرست پیدا میکند و برای این کار فهرست را بارها به دو نیم میکند و فقط نیمی را نگه میدارد که عنصر مورد نظر ما در آن قرار دارد. این روش به ما اجازه میدهد مکانهای ممکن عنصرمان را بهسرعت محدود کنیم، تا آن را پیدا کنیم یا همهی مکانهای ممکن را از میان برداریم.
جستوجوی دودویی فقط زمانی کار میکند که فهرست مرتب شده باشد.
الگوریتم چنین است:
بیایید یک مثال ببینیم:
فرض کنید میخواهیم عدد ۲۳ را در فهرست مرتبشدهی زیر پیدا کنیم: [4, 8, 12, 16, 23, 28, 32].
[23, 28, 32] باقی میماند.[23].Rust از پیش در کتابخانهی استاندارد خود یک تابع جستوجوی دودویی دارد. برای این تمرین نباید از این تابع استفاده کنید و باید تنها از سایر ابزارهای پایه بهره بگیرید.
آیا تستها را پاس کردید و کد را تمیز نگه داشتید؟ اگر دوست دارید، چند کار دیگر هم میتوانید امتحان کنید.
find شما احتمالاً فقط روی sliceهای عددی کار میکند،
اما سیستم نوع Rust بهقدری انعطافپذیر است که میتوان تابع جستوجویی ساخت که
روی همهی sliceهایی کار کند که میتوان عناصرشان را مرتب کرد.find میتواند نه فقط روی sliceها، بلکه همزمان
روی یک Vec یا یک Array هم کار کند.برای اجرای تستهای امتیازی، پرچم #[ignore] را بردارید و تستها را با
ویژگی generic اجرا کنید، به این شکل:
$ cargo test --features generic
بعد لطفاً نظرتان را در قالب یک دیدگاه زیر ارسال خود بنویسید. آیا این آزمایش کد را بهتر کرد؟ بدتر؟ چیزی از آن یاد گرفتید؟