Nu aveti permisiuni pentru a descarca fisierul grader_test2.in
Diferente pentru blog/cautare-binara intre reviziile #41 si #42
Nu exista diferente intre titluri.
Diferente intre continut:
*Optimizari premature* Am vazut tot felul de variante, de exemplu unii testeaza daca a[mid] e egal cu x si scurt circuiteaza cautarea. Aceasta optimizare nu ajuta in cazul general, doar complica codul. Alta varianta e ca poti reduce ceva mai mult problema folosind hi = mid - 1 sau lo = mid + 1. Ai un pas logic in plus la care trebuie sa fi atent. Cazurile la una din marginile sirului pot deveni mai dificile. Sau putem avea probleme de genul hi devine mai mic decat lo.
Am vazut multe cautari binare "blindate" ca să evite bug-urile de mai sus. Problema e că lumea le blindează cu cod duplicat si error prone, repetand conditii.
*Variante* Exista versiuni diferite cum ar fi gasirea primei sau ultimei aparitii a lui x in sirul sortat, gasirea predecesorului sau succesorului valorii x in sir.
Aceasta varianta de implementare este eleganta insa mie nu imi place foarte tare. Dezavantajul principal este lizibilitatea codului.
Am vazut multe cautari binare "blindate" ca să evite bug-urile de mai sus. Problema e că lumea le blindează cu cod duplicat si error prone, repetand conditii.
*Cum implementezi corect, clar si flexibil o cautare binara* Folosim un *invariant* in bucla cautarii binare, adica o asertiune care e adevarata de fiecare data cand intram in bucla. Pentru cazul nostru acest invariant e ca lo indica spre un element care e mai mic ca x sau spre -1 si hi indica spre un element mai mare sau egal cu x sau in A.length. Pe scurt <tex>A[lo] < x \le A[hi] </tex> (consideram <tex>A[-1] = -\infty</tex> si <tex>A[A.length] = +\infty</tex>)