Anda di halaman 1dari 2

Busca Binaria

Array Ordenado—> Procurar um numero x


Pergunta se ta e qual posição;

Vai no meio e despreza uma parte… divide na metade… reduziu o espaço de busca por 2

Busca(array, S(indicestart), E(indiceend)) por um valor val


n = E - S +1
if (E<S) return -1;

mid = S+E/2 // S + (E-S)/2


if array[mid]==val return mid;
if array[mid] <val busca(array, m+1, E, val)
if array[mid] > val busca(array, S, m-1, val)

BUSCA([1,2],1,1,3)
BUSCA([1,2],2,1,3)—>E<S

RECURSÃO = Função—> BASE—>CHAMADAS RECURSIVAS

-Resolução de forma interativa


S(START) e E(END)

Busca(array, N)
S=0
E=N-1
while(S<=E){
mid = (S+E)/2
if array[mid] == val return mid;
if array[mid] < val S=m+1;
if array[mid] > val S= m-1;
return -1;
}
Complexidade: (Dividiu por 2… compara divide por 2… compara recursivamente)= log n
— AJUSTE (Variacoes):
Elementos repetidos?
O que eu quer repetido?
Ex: array =[1,2,3,5,5,6,7,8,9]
QUERO O 5
(mid = 5)
while(S<(=)E){
mid = (S+E)/2;
x=arrayi[mid];
if (x==val)
inclui o 5 no end porque ele pode ou não ser o primeiro 5 (quero o primeiro 5)
E=m;
else if(x<val)
S=m+1
else //x>val
E=m-1
}
Problema!
Se eu tiver S=E —> mid =E=S —> tira o igual do while
sai do while quando S = E e ainda tem que fazer a checagem se esse é o valor que esta
procurando
depois do while:
if(array[S] == val) return S;
return -1;

no python(//=divisao inteira)

Pra achar o ultimo 5 que a parece tem que fazer mid=(S+E +1)/2 porque ele tende ao
primeiro quando ha apenas dois números no intervalo da recursão

(S+E+1)/2 Em vez de (S+E)/2 para que, quando se tem dois elementos apenas, não ficar
repetindo ad eternum.
S= mid ——> S=mid+1 para não ficar parado EX: (0+1)/2—> 0
(0 + 1 +1) /2 =1

PAO A METRO ——> INTERVALO DE BUSCA (0, IDEAL]

ideal = M1+M2+… Mk/N

OGRO
dea008fb2b84f41b79c01b2d9cdbff1dc84da620

Anda mungkin juga menyukai