Kahendotsing: erinevus redaktsioonide vahel

Eemaldatud sisu Lisatud sisu
Resümee puudub
Litvand (arutelu | kaastöö)
Resümee puudub
9. rida:
Olgu järjendi <code>J</code> mõne vahemiku esimese, keskmise ja viimase elemendi [[nullipõhine indekseerimine|nullipõhised indeksid]] vastavalt <code>e</code>, <code>k</code> ja <code>v</code> ning otsitav väärtus <code>o</code>. Kahendotsingust võib olla lihtsam aru saada [[rekursioon|rekursiivsel]] kujul, kus alamvahemikust saab korduvalt algne vahemik:
 
funktsioon kahend_otsingkahendotsing(o, J, e, v):
Kui e > v:
J ei sisalda o
15. rida:
k = alumine_täisosa((e + v) / 2)
Kui o < J[k]:
tagasta kahend_otsingkahendotsing(o, J, e, k - 1)
Kui o > J[k]:
tagasta kahend_otsingkahendotsing(o, J, k + 1, v)
tagasta k
 
(Reaalarvu [[Täis- ja murdosa|alumine täisosa]] on suurim täisarv, mis ei ole sellest reaalarvust suurem.) Algsest vahemikust <code>[e, v]</code> saab sõltuvalt väärtustest <code>o</code> ja <code>J[k]</code> kas <code>[e, k-1]</code> või <code>[k+1, v]</code>. Kui järjendi <code>J</code> elementide arv on <code>n</code>, siis tervest järjendist väärtuse otsimiseks kutsume funktsiooni vahemikuga <code>[0, n-1]</code>:
 
<code>kahend_otsingkahendotsing(o, J, 0, n-1)</code>. <ref name=":0" />
 
Tuleb märkida, et rekursiivne versioon kahendotsingust võib kasutada <math>O(\log n)</math> mälu, mitte optimaalse konstantse mälu hulga, kui funktsiooni [[pinumälu]] ei vabastata enne rekursiivset väljakutset (''tail call optimization''). Selle tõttu võib olla efektiivsem iteratiivne versioon: <ref name=":0" />
 
funktsioon kahend_otsingkahendotsing(o, J):
e = 0
v = n - 1
34. rida:
k = alumine_täisosa((e + v) / 2)
Kui o < J[ek]:
v = k - 1
Muidu kui J[k] < o: