Binary Search
Binary search क्या है?
मान लीजिए आप dictionary में कोई शब्द ढूँढते हैं। आप शुरू से हर पन्ना नहीं पढ़ते — आप बीच के पास खोलते हैं, देखते हैं कि आपका शब्द पहले है या बाद में, और छलाँग लगाते हैं। Binary search किसी sorted array पर ठीक यही करता है, और यह हर element एक-एक करके जाँचने से नाटकीय रूप से तेज़ है।
एक नियम: array पहले sorted होना चाहिए। यही binary search को हर कदम आधा data सुरक्षित रूप से हटाने देता है।
आधा करने का विचार
तीन markers रखें: low, high, और उनके बीच mid। Target की बीच वाले से तुलना करें:
- अगर बराबर mid — मिल गया।
- अगर छोटा — उत्तर बाएँ आधे में होगा, तो
highनीचे करें। - अगर बड़ा — दाएँ आधे में होगा, तो
lowऊपर करें।
हर तुलना बचे का आधा हटाती है। यही पूरी तरकीब है।
Iterative program
#include <stdio.h>
int binarySearch(int a[], int n, int key) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] == key) return mid; // mil gaya
else if (a[mid] < key) low = mid + 1; // daayein jaayein
else high = mid - 1; // baayein jaayein
}
return -1; // nahi mila
}
int main() {
int a[] = {10, 20, 30, 40, 50};
int pos = binarySearch(a, 5, 40);
if (pos != -1) printf("Found at index %d\n", pos);
else printf("Not found\n");
return 0;
}Found at index 3
Dry run
{10, 20, 30, 40, 50} में 40 ढूँढना:
| कदम | low | high | mid | a[mid] | क्रिया |
|---|---|---|---|---|---|
| 1 | 0 | 4 | 2 | 30 | 30 < 40 → दाएँ |
| 2 | 3 | 4 | 3 | 40 | 3 पर मिला |
चार के बजाय सिर्फ़ दो comparisons — और array बड़ा होते ही अंतर विशाल हो जाता है।
Recursive program
int binarySearch(int a[], int low, int high, int key) {
if (low > high) return -1; // base case
int mid = low + (high - low) / 2;
if (a[mid] == key) return mid;
if (a[mid] < key) return binarySearch(a, mid + 1, high, key);
else return binarySearch(a, low, mid - 1, key);
}वही logic, loop के बजाय चुने आधे पर खुद को call करके व्यक्त।
यह इतना तेज़ क्यों है
| Array size | Linear search (worst) | Binary search (worst) |
|---|---|---|
| 100 | 100 | 7 |
| 1,000 | 1,000 | 10 |
| 1,000,000 | 1,000,000 | 20 |
चूँकि हर कदम data आधा करता है, binary search O(log n) में चलता है — दस लाख items को सिर्फ़ लगभग बीस जाँच चाहिए।
आम गलतियाँ
- Unsorted array पर चलाना — परिणाम निरर्थक होता है।
(low + high) / 2इस्तेमाल करना, जो overflow कर सकता है;low + (high - low) / 2पसंद करें।- गलत loop condition — यह
low <= highहोनी चाहिए,<नहीं। mid + 1/mid - 1से mid के आगे बढ़ना भूलना, जिससे infinite loop होता है।
ऐसी value ढूँढें जो array में नहीं है (जैसे 25) और पुष्टि करें कि यह −1 लौटाता है। फिर एक counter जोड़ें जो बताए कितनी comparisons लगीं, और सरल linear search से तुलना करें।
सारांश
- Binary search sorted array में हर कदम आधा करके value ढूँढता है।
- बीच से तुलना करें; वह आधा रखें जिसमें target हो सकता है।
- Overflow टालने को बीच के लिए
low + (high - low) / 2इस्तेमाल करें। - Iterative और recursive versions समान परिणाम देते हैं।
- यह O(log n) में चलता है — बड़े data पर linear search से कहीं तेज़।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में binary search क्या है?
Binary search के लिए array sorted क्यों होना चाहिए?
Binary search की time complexity क्या है?
Iterative और recursive binary search में क्या अंतर है?
low तथा high को तब तक update करता है जब तक वे पार न हों, constant अतिरिक्त space में। Recursive version चुने आधे पर खुद को call करता है; यह सुंदर है पर हर call के लिए stack space लेता है। परिणाम समान हैं।Binary search बीच वाला element कैसे ढूँढता है?
low + (high - low) / 2 के रूप में गिनता है। (low + high) / 2 के बजाय ऐसे लिखना low और high के बहुत बड़े होने पर संभावित overflow टालता है, फिर भी बीच की स्थिति पर पहुँचता है।