ബൈനറി തിരയൽ

കമ്പ്യൂട്ടർ ശാസ്ത്രത്തിലെ ഒരു അടിസ്ഥാന അൽഗോരിതം ആണ് ദ്വയാംശത്തിരച്ചിൽ അഥവാ **ബൈനറി തിരയൽ** (Binary search) . കൂടുംക്രമത്തിലോ കുറയും ക്രമത്തിലോ സംഖ്യകളടുക്കി വച്ച ഒരു അടുക്കിൽ (അറേയിൽ) ഒരു നിശ്ചിതസംഖ്യ തിരയാനുള്ള ഒരു അൽഗോരിതം ആണ് ഇത്. ഇംഗ്ലീഷിൽ ഇതിനെ ബൈനറി സെർച്ച് (Binary Search) എന്ന് വിളിക്കുന്നു. 

ഇടത്തുനിന്ന് വലത്തോട്ട് നീങ്ങുമ്പോൾ സംഖ്യകൾ വലുതായി വരുന്ന ഒരു അടുക്കിൽ ഒരു നിശ്ചിതസംഖ്യ x  തിരയേണമെങ്കിൽ, ബൈനറി തിരയൽ പ്രകാരം അടുക്കിന്റെ നടുക്കുള്ള സംഖ്യ midഉമായി xനെ താരതമ്യം ചെയ്യുക. x = mid ആണെങ്കിൽ (ചോദ്യത്തിന്റെ ഉത്തരം ലഭിച്ച കാരണം) തിരച്ചിൽ അവിടെ തീരുന്നു. x  ആണെങ്കിൽ അടുക്കിന്റെ ആദ്യപകുതിയിലേ x ഉണ്ടാവുകയുള്ളൂ. അതിനാൽ xനു വേണ്ടി അടുക്കിന്റെ ആദ്യപകുതിയിൽ ബൈനറി തിരയൽ നടത്തുക. അല്ലെങ്കിൽ അടുക്കിന്റെ രണ്ടാം പകുതിയിൽ xനു വേണ്ടി ബൈനറി തിരയൽ നടത്തുക. ഇങ്ങനെ ഇനി പകുതികൾ ആയി വിഭജിയ്ക്കാൻ പറ്റാത്ത ഒരു അവസ്ഥ എത്തിയിട്ടും അടുക്കിൽ x എന്ന സംഖ്യ കൺറ്റുകിട്ടിയില്ല എങ്കിൽ x അടുക്കിൽ ഇല്ല എന്ന് തീരുമാനിക്കാം. ഓരോ തവണയും അപ്പോഴുള്ള അംഗങ്ങളുടെ പകുതി എണ്ണം തെരച്ചിലിൽ നിന്ന് ഒഴിവായി പോകുന്നതുകൊണ്ട് തെരച്ചിൽ വളരെ കാര്യക്ഷമം ആണ്. തിരച്ചിലിന്റെ സമയ സങ്കീർണ്ണത (Time complexity)ലോഗരിതമിക് ആണെന്ന് പറയുന്നു.

n അംഗങ്ങളുള്ള ഒരടുക്കിൽ ഈ അൽഗോരിതം O(\log n) താരതമ്യങ്ങൾ നടത്തുന്നു. അതിനാൽ അൽഗോരിതത്തിന്റെ സമയ സങ്കീർണ്ണത O(\log n) ആണ്. ഉപയോഗിയ്ക്കുന്ന സ്ഥലത്തിന്റെ വലിപ്പം ഒരു സ്ഥിരസംഖ്യയാണ്. അതുകൊണ്ട് അതിന്റെ സ്ഥല സങ്കീർണ്ണത (Space complexity) O(1) ആണ്.

## അൽഗൊരിതം
ക്രമീകരിയ്ക്കപ്പെട്ടിട്ടുള്ള ഒരു അടുക്കിൽ മാത്രമേ ഈ അൽഗോരിതം ഓടിയ്ക്കാനാവൂ. കണ്ടുപിടിയ്ക്കാനുള്ള വിലയെ ഈ അടുക്കിലെ നടുവിലെ അംഗത്തിന്റെ വിലയുമായി ഒത്തു നോക്കുന്നു. അവ ഒന്നാണെങ്കിൽ തിരയൽ സാർത്ഥകമായി, അവിടെവച്ച് അവസാനിക്കുന്നു. ഇല്ലെങ്കിൽ കണ്ടുപിടിയ്ക്കാനുള്ള അംഗത്തിന്റെ വില നടുവിലെ അംഗത്തിന്റെ വിലയെക്കാൾ ചെറുതാണോ എന്ന് നോക്കുന്നു. ചെറുതാണെങ്കിൽ അത് അടുക്കിന്റെ രണ്ടാമത്തെ പകുതിയിൽ ഉണ്ടാകില്ല എന്ന് ഉറപ്പാണല്ലോ. അഥവാ കണ്ടു പിടിയ്ക്കാനുള്ള അംഗത്തിന്റെ വില നടുവിലെ അംഗത്തിന്റെ വിലയെക്കാൾ വലുതാണെങ്കിൽ അത് അടുക്കിന്റെ ആദ്യ പകുതിയിൽ ഉണ്ടാകില്ല എന്നും ഉറപ്പാണ്. എന്തായാലും അടുത്ത ഘട്ടത്തിൽ ഇവയിൽ ഏതെങ്കിലും ഒരു പകുതി ഉപേക്ഷിയ്ക്കാം. മറ്റേ പകുതി (കുട്ടി അടുക്ക്) എടുത്തു വീണ്ടും മുകളിൽ പറഞ്ഞ നിർദ്ദേശങ്ങൾ പിന്തുടരുക. ഒരു ഘട്ടത്തിൽ തെരയുന്ന അംഗം ഏതെങ്കിലും കുട്ടി അടുക്കിന്റെ നടുവിൽ കണ്ടെത്തപ്പെടും. അപ്പോൾ തിരയൽ അവസാനിപ്പിയ്ക്കാം. അതല്ലെങ്കിൽ കുട്ടി അടുക്കിന്റെ വലിപ്പം 1 ആകുകയും അതിനെ ഇനി രണ്ടായി പകുക്കാൻ സാധിക്കുകയില്ല എന്ന നിലയിൽ എത്തിപ്പെടാം. ഇങ്ങനെ വന്നാൽ തെരയപ്പെടുന്ന വില അടുക്കിലില്ല എന്നർത്ഥം.

ഈ അൽഗോരിതത്തിന്റെ പടികൾ താഴെ കൊടുത്തിരിയിക്കുന്നു.

കൂടുംക്രമത്തിൽ അടുക്കിയിരിക്കുന്ന n അംഗങ്ങളുള്ള A എന്ന ഒരടുക്ക് സങ്കല്പിക്കുക. Aയിലെ അംഗങ്ങൾ A_0, A_1, \dots A_{n-1} എന്നിവ ആണെന്ന് കരുതുക. ഇവ കൂടുംക്രമത്തിൽ ആയതുകൊണ്ട് നിശ്ചയമായും A_0 \le A_1 \le \dots \le A_{n-1} ആയിരിയ്ക്കും. 

പ്രശ്നവാചകം: t എന്ന സംഖ്യ Aയിലെ അംഗമാണോ എന്ന് നിർണ്ണയിക്കുക. 

താഴെ കൊടുത്തിരിയ്ക്കുന്ന നിർദ്ദേശങ്ങൾ പടിപടിയായി പിന്തുടർന്നാൽ t എന്ന സംഖ്യ Aയിലെ അംഗമാണോ എന്നും ആണെങ്കിൽ അതിന്റെ സ്ഥാനാങ്കം (Index) എത്രയെന്നും കണ്ടുപിടിക്കാനാവും.

# *<math>L</math>*നു 0 എന്നും *<math>R</math>*നു n - 1 എന്നും വില കൊടുക്കുക.
#  L > R ആണെങ്കിൽ നമ്മുടെ തിരച്ചിൽ ഫലപ്രദമായില്ല. **തിരച്ചിൽ നിറുത്തുക**.
# *<math>M</math>*നു (നടുവിലെ അംഗത്തിന്റെ സ്ഥാനാങ്കം)  \left \lfloor \frac{L+R}{2} \right \rfloor എന്ന വില കൊടുക്കുക.                                                  (**കുറിപ്പ്**: M എന്ന പ്രതീകം, ഇപ്പോൾ പ്രസക്തമായ അടുക്കിലെ നടുവിലത്തെ അംഗത്തിന്റെ സ്ഥാനാങ്കത്തെ കുറിക്കുന്നു. \lfloor x \rfloor എന്ന പ്രതീകം, x നെക്കാൾ ചെറിയ ഏറ്റവും വലിയ എണ്ണൽസംഖ്യയെ കുറിക്കുന്നു.) 
# A_M  ആണെങ്കിൽ, *<math>L</math>*ന് M+1 എന്ന വില കൊടുത്തു സ്റ്റെപ് 2 ലേയ്ക്ക് പോകുക.
# A_M > t ആണെങ്കിൽ, *<math>R</math>*ന് M - 1 എന്ന വില കൊടുത്തു സ്റ്റെപ് 2 ലേയ്ക്ക് പോകുക.
#  A_M = t ആണെങ്കിൽ, തിരയൽ ഫലപ്രദമായി. tയുടെ സ്ഥാനാങ്കമായി M **തിരിച്ചു കൊടുത്ത് നിറുത്തുക.**

## ഉദാഹരണം
ബൈനറി തിരയലിന്റെ ഒരു ഉദാഹരണം താഴെ കൊടുത്തിരിയ്ക്കുന്നു.  

## സമയ സങ്കീർണ്ണത

ഈ അൽഗോരിതത്തിന്റെ കാര്യക്ഷമത പരിശോധിയ്ക്കാനായി ഇതിനെ ഒരു ട്രീയോട് ഉപമിയ്ക്കാം. മധ്യത്തിൽ ഉള്ള വില ആയിരിയ്ക്കും ട്രീയുടെ മൂലം. ഈ വിലയേക്കാൾ കുറഞ്ഞ അംഗങ്ങൾ ഉള്ള അടുക്കിന്റെ  പകുതി ഈ ട്രീയുടെ ഇടത്തെ സബ്-ട്രീയും മറ്റേ പകുതി വലത്തേ സബ്-ട്രീയും ആയി കണക്കാക്കാം. തുടർന്ന് അടുത്ത നിലയിൽ ഉള്ള സബ്-ട്രീകളിലേയ്ക്ക് പോകുമ്പോൾ ഓരോ പകുതിയിലെയും മദ്ധ്യ വില ആ സബ്-ട്രീയുടെ മൂലം ആയിരിയ്ക്കും. ഇങ്ങനെ കിട്ടുന്ന ഒരു ട്രീയെ ബൈനറി സെർച്ച് ട്രീ എന്ന് വിളിയ്ക്കുന്നു. ഉദാഹരണത്തിന് മുകളിൽ കാണിച്ചിട്ടുള്ള അടുക്കിനെ  വലതുവശത്തു കാണുന്ന ഒരു ബൈനറി സെർച്ച് ട്രീ ആയി ചിത്രീകരിയ്ക്കാം. ഇനി നമ്മുടെ തിരയൽ എന്ന പ്രവൃത്തിയെ ട്രീയുടെ മൂലം മുതൽ ഉള്ള ഒരു നടത്തം ആയി കാണാം. ആദ്യം മൂലത്തിലുള്ള വിലയുമായി നമ്മുടെ തിരയുന്ന വിലയെ താരതമ്യപ്പെടുത്തുന്നു. അവ തമ്മിൽ തുല്യമാണെങ്കിൽ നമ്മുടെ തിരയൽ ഫലപ്രദമായി, ഇനി തിരയൽ അവസാനിപ്പിയ്ക്കാം. തുല്യമല്ലെങ്കിൽ പിന്നെ നമ്മൾ തിരയുന്ന വില മൂലത്തിലുള്ള വിലയേക്കാൾ കൂടുതൽ ആണോ എന്ന് നോക്കുക, അങ്ങനെ ആണെങ്കിൽ വലത്തേ സബ്-ട്രീയിലേക്കു പോകുക. അല്ലെങ്കിൽ ഇടത്തെ സബ്-ട്രീയിലേയ്ക്കും. ഇങ്ങനെ നോക്കുമ്പോൾ ഏതൊരു വിലയെ കണ്ടു പിടിയ്ക്കാനും ഏറ്റവും കൂടുതൽ നമ്മൾ ട്രീയുടെ അഗ്രം വരെ മാത്രമേ പോകേണ്ടതുള്ളൂ. അതായത് നമ്മൾ നടത്തേണ്ട പരമാവധി താരതമ്യങ്ങളുടെ എണ്ണം എന്ന് പറയുന്നത് ഈ ട്രീയുടെ ഉയരം എത്രയാണോ അതാണ്. n അംഗങ്ങളുള്ള ഒരു ബൈനറി സെർച്ച് ട്രീയുടെ ഉയരം \lfloor \log_2 (n) + 1 \rfloor ആണ്.. അതുകൊണ്ട് \log_2 ആണ് ബൈനറി തിരയലിന്റെ സമയ സങ്കീർണ്ണത എന്നു പറയാം.

## ഇതും കൂടി കാണുക

* തിരയൽ
* ക്രമീകരണം
* സമയ സങ്കീർണ്ണത
* ട്രീ
* ബൈനറി ട്രീ
* അടുക്ക്

## അവലംബങ്ങൾ

വർഗ്ഗം:തിയററ്റിക്കൽ കമ്പ്യൂട്ടർ സയൻസ്‎
വർഗ്ഗം:കമ്പ്യൂട്ടർ ശാസ്ത്രം‎
വർഗ്ഗം:കമ്പ്യൂട്ടിങ്ങ്‌
വർഗ്ഗം:അൽഗൊരിതങ്ങൾ