Pagini recente » Diferente pentru problema/perfect2 intre reviziile 24 si 23 | Diferente pentru problema/quadratum intre reviziile 1 si 18 | Cautarea ta binara e gresita | Diferente pentru blog/cautare-binara intre reviziile 20 si 21 | Diferente pentru blog/cautare-binara intre reviziile 19 si 20
Nu exista diferente intre titluri.
Diferente intre continut:
int search(int[] A, int x) {
int hi = A.length, lo = -1, mid;
while (hi - lo > 1) {
mid = (lo + hi) / 2;
if (A[mid] < x)
low = mid;
else
hi = mid;
mid = (lo + hi) / 2;
if (A[mid] < x)
low = mid;
else
hi = mid;
}
if (hi == A.length || A[hi] != x)
return -1;
}
==
* conditia de la linia 3 e hi - lo > 1. Invariantul ales face ca hi si lo sa fie tot timpul distincte. La fiecare pas distanta intre hi si lo se injumatateste, iar cand hi si lo ajung consecutive ca pozitii in sir putem lua o decizie.
* la linia x stim ca A[mid] < x si astfel putem micsora spatiu de cautare si pastra invariantul, dandu-i lui lo valoarea mid
* linia 2: setam pe hi si lo inafara sirului, astfel invariantul e indeplinit si nu trebuie sa tratam cazuri speciale.
* linia 3: conditia de continuare a buclei e hi - lo > 1. Invariantul ales face ca hi si lo sa fie tot timpul distincte. La fiecare pas distanta intre hi si lo se injumatateste, iar cand hi si lo ajung consecutive ca pozitii in sir putem lua o decizie.
* linia 4: mid va fi tot timpul intre lo si hi.
* linia x: stim ca A[mid] < x si astfel facand atribuirea lo = mid micsoram spatiu de cautare si pastra invariantul
* la linia y stim ca A[mid] >= x si putem face atribuirea hi = mid.
* la linia z vedem daca x e in sir
** in caz afirmativ putem sa returnam indexul hi
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.