पाठ 24 / 42
Binary Search
Search space आधा करके sorted range में O(log n) में target खोजें, और off-by-one गलतियों से बचें।
हर चरण में आधा हटाएँ
Sorted array पर, लक्ष्य की मध्य तत्व से तुलना करें। यदि लक्ष्य बड़ा है, तो पूरा left आधा (mid सहित) अप्रासंगिक — left को उससे आगे ले जाएँ। अन्यथा right आधा हटाएँ। हर चरण search स्थान आधा: O(log n)।
Iterative टेम्पलेट
अन्य भाषाओं में overflow से बचने को left <= right और mid = left + (right-left)//2 उपयोग करें।
def binary_search(arr, target):
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = lo + (hi - lo) // 2
if arr[mid] == target:
return mid
if arr[mid] < target:
lo = mid + 1 # target in right half
else:
hi = mid - 1 # target in left half
return -1
Output:
binary_search([10,20,30,40,50,60,70,80], 60) -> 5
Dry run: 60 खोजें
[10 20 30 40 50 60 70 80]
- चरण 1: lo=0 hi=7 mid=3 → arr[3]=40 < 60 → lo=4
- चरण 2: lo=4 hi=7 mid=5 → arr[5]=60 → इंडेक्स 5 पर मिला
त्वरित जाँच: Binary search के लिए डेटा होना चाहिए...
- Hash map में संग्रहीत
- अभाज्य लंबाई का
- Sorted (या predicate पर monotonic)
- केवल धनात्मक संख्याएँ
Answer
Sorted (या predicate पर monotonic) — आधा हटाना तभी काम करता है जब एक ओर लक्ष्य न होने की गारंटी हो — इसके लिए क्रम चाहिए।