20100531

Pequena sutileza em busca binária

Em The Practice of Programming à p. 31, algo me parece digno de nota.
Na implementação de lookup,
1. mid = (low + high) / 2
mas pensei que o correto seria
2. mid = (high - low) / 2

A sutileza está no fato de que em 2 calcula-se o deslocamento relativo à uma porção do array do elemento do meio mid, enquanto em 1 calcula-se a sua posição absoluta.

Se temos um array de 10 elementos com posições[0..9] e estamos a procurar na porção [5..9] o deslocamento de mid relativo à porção em questão é
mid = (9-5) / 2 = 2.
Relativamente ao array todo, mid tem índice
mid = (9+5) / 2 = 7.
Claramente, 7 é o elemento 2 da porção [5..9].

A forma correta para 2 seria então
mid = mid + (high - low)/2
De modo que a sugerida no livro é mais sucinta.

Nenhum comentário:

Postar um comentário