جستجوی دودویی

جستجوی دودویی: الگوریتم O(log n) روی داده مرتب، پیاده‌سازی تکراری و بازگشتی و مقایسه با جستجوی خطی

جستجوی دودویی چیست؟

جستجوی دودویی (Binary Search) یکی از قدرتمندترین الگوریتم‌ها: روی داده مرتب، در هر مرحله نیمی از فضای جستجو را حذف می‌کند — مثل بازی حدس عدد!

شهود: بازی حدس عدد

عددی بین ۱ تا ۱۰۰ انتخاب شده و شما حدس می‌زنید؛ فقط پاسخ «بزرگ‌تر» یا «کوچک‌تر» می‌گیرید. بهترین استراتژی: هر بار وسط را حدس بزنید! با این روش، حداکثر ۷ حدس برای ۱۰۰ عدد کافی است (log₂ 100 ≈ 7).

الگوریتم

  1. low = 0 و high = آخرین اندیس
  2. mid = وسط بازه را محاسبه کن
  3. اگر عنصر mid = هدف ← پیدا شد!
  4. اگر عنصر mid < هدف ← برو نیمه راست (low = mid + 1)
  5. اگر عنصر mid > هدف ← برو نیمه چپ (high = mid − 1)
  6. تکرار تا low > high (پیدا نشد)

شرط حیاتی: داده باید مرتب باشد!

جستجوی دودویی روی داده نامرتب جواب غلط می‌دهد! اگر داده مرتب نیست، یا اول مرتب کنید (O(n log n)) یا از جستجوی خطی استفاده کنید.

پیچیدگی

معیارخطیدودویی
بهترینO(1)O(1)
بدترینO(n)O(log n) ✓
پیش‌نیازهیچداده مرتب
قدم برای ۱ میلیون۱٬۰۰۰٬۰۰۰~۲۰ ✓

نسخه بازگشتی

همان منطق با فراخوانی خود تابع روی نیمه مناسب — الگوی تقسیم و حل (مبحث آینده).

کاربردهای واقعی

نکته: خطای رایج محاسبه mid: در زبان‌هایی با int محدود، (low + high) // 2 می‌تواند سرریز کند؛ راه امن: low + (high - low) // 2 — در پایتون مشکلی نیست چون اعداد بی‌نهایت‌اند.

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل ساختار داده و الگوریتم است.

ابزارهای مرتبط