E10: Busca binária

E10.1  Considere a seguinte implementação da busca binária. Diga o que a função faz.

int buscaBinaria (int x, int n, int v[]) {
   int e, m, d;
   e = 0; d = n-1;
   while (e <= d) {
      // invariante: v[e-1] < x < v[d+1]
      m = (e + d)/2;
      if (v[m] == x) return m;
      if (v[m] < x) e = m + 1;
      else d = m - 1;
   }
   return -1;
}                                                                  

Execute buscaBinaria passo-a-passo com n = 14, com x = 9, e com v[i] = i para cada i.

E10.1a  Escreva uma versão da função buscaBinaria que tenha o seguinte invariante: no início de cada iteração,  v[e-1] < x < v[d].

E10.2  Suponha que o vetor v tem 511 elementos e que x não está no vetor.  Quantas vezes, exatamente, a função buscaBinaria comparará x com um elemento do vetor?  [Lembre-se da tarefa C (piso de logaritmo).]

Suponha que o vetor v tem 50000 elementos e que x não está no vetor.  Quantas vezes, aproximadamente, a função buscaBinaria comparará x com um elemento do vetor?

E10.3  [Tem relação distante com busca binária.]  A seguinte função recursiva pretende encontrar o valor de um elemento máximo de v[e..d], supondo ed.  (É claro que não estamos supondo que o vetor está ordenado.)

int max (int e, int d, int v[]) {
   if (e == d) return v[d];
   else {
      int m, x, y;
      m = (e + d)/2;
      x = max (e, m, v);
      y = max (m+1, d, v);
      if (x >= y) return x;
      else return y;
   }
}

A função está correta? Ela é mais rápida que a versão iterativa trivial? Quantas vezes a função chama a si mesma?  Suponha que e e d valem 0 e 6 respectivamente e mostre a sequência de chamadas de max, devidamente indentada.

E10.4  Suponha que v[0..n-1] é um vetor de strings em ordem lexicográfica. Escreva uma função que receba uma string x e devolva um índice m tal que a string x é igual à string v[m].

E10.5  Suponha que cada elemento do vetor v[0..n-1] é uma struct com dois campos: o nome de um aluno e o número do aluno. Suponha que o vetor está em ordem crescente de números. Escreva uma função de busca binária que receba o número de um aluno e devolva o seu nome.

E10.6  Como fazer uma busca binária numa lista encadeada?