Izmeri čas izvajanja funkcije NajdiVsoto2
za s = 12345 in za tabele oblike a = [0, 1, 2, ..., n - 1] za n = 100, 200, 300, 400, 500. Izmerjene čase vpiši v spodnjo tabelo in jih shrani.
Nato primerjaj čas izvajanja funkcij NajdiVsoto
in NajdiVsoto2
.
Do še boljše rešitve pa pridemo z naslednjim razmislekom. Spomnimo se, da nam naloga, ki jo rešujemo, zagotavlja, da bo tabela a
urejena naraščajoče. (Doslej se na ta podatek nismo opirali – pravzaprav obe dosedanji rešitvi, NajdiVsoto
in NajdiVsoto2
, delujeta tudi za neurejene tabele.) Recimo, da smo pregledali nek konkreten par elementov tabele a
in izračunali vsoto a[i] + a[j]
. Če se izkaže, da je ta vsota prevelika (torej večja od s
), lahko razmišljamo takole: če bi namesto elementa a[j]
uporabili enega od elementov za njim (torej a[j + 1]
, a[j + 2]
itd.), bo ta prevelika vsota še večja, saj so vsi ti kasnejši elementi večji od a[j]
. Torej z nobenim od tistih j
, ki jih pri trenutem i
še nismo pregledali, ne bomo dobili iskane vsote; zato lahko nad trenutnim i
kar takoj obupamo in se posvetimo naslednjemu. Tako smo dobili:
Ta izboljšava sicer ne škoduje, res pa je, da v najslabšem primeru tudi ne koristi – lahko se na primer zgodi, da dobimo tako velik s
, da pogoj a[i] + a[j] > s
sploh nikoli ni izpolnjen, zato do predčasne prekinitve notranje zanke nikoli ne pridemo. Vseeno pa je ta rešitev dobra osnova za naslednjo izboljšavo (ki pa bo koristna).