Questão nº 42
Questão de Tecnologia da Informação · FCC TRT20 2024 (nº 42)
Considere o programa Java abaixo.
public class Verificar {
public static int dados(int[] vetor, int inicio, int fim, int chave) {
if (inicio > fim) {
return -1;
}
int meio = (inicio + fim) / 2;
if (vetor[meio] == chave) {
return meio;
}
if (vetor[inicio] <= vetor[meio]) {
if (chave >= vetor[inicio] && chave < vetor[meio]) {
return dados(vetor, inicio, meio - 1, chave);
} else {
return dados(vetor, meio + 1, fim, chave);
}
} else {
if (chave > vetor[meio] && chave <= vetor[fim]) {
return dados(vetor, meio + 1, fim, chave);
} else {
return dados(vetor, inicio, meio - 1, chave);
}
}
}
public static void main(String[] args) {
int[] vetor = {7, 8, 9, 1, 2, 3, 4, 5, 6};
int resultado = dados(vetor, 0, 8, 5);
System.out.println(resultado);
}
}
Ao executar o programa, em condições ideais, será exibido na tela o valor
- A7. (alternativa correta)
- B6.
- C8.
- D3.
- E5.
Resposta comentada
Gabarito Alternativa A
A busca binária é um algoritmo eficiente para encontrar um elemento em uma lista ordenada, dividindo-a repetidamente ao meio. No entanto, quando a lista está rotacionada (ou seja, um segmento inicial foi movido para o final, como {7, 8, 9, 1, 2, 3, 4, 5, 6} que é {1, 2, 3, 4, 5, 6, 7, 8, 9} rotacionado), a busca binária tradicional não funciona. Este algoritmo adaptado primeiro identifica qual metade do array (do segmento atual da busca) está ordenada e, em seguida, verifica se o elemento procurado (chave) está dentro do intervalo dessa metade ordenada. Se sim, a busca continua nessa metade; caso contrário, continua na outra metade, que pode estar rotacionada ou não.
-
(A) Correta: O valor 7 é o índice onde a chave
5é encontrada no arrayvetor = {7, 8, 9, 1, 2, 3, 4, 5, 6}. O algoritmo realiza uma busca binária adaptada para arrays rotacionados.- Chamada 1:
dados(vetor, 0, 8, 5).meio = 4(vetor[4]=2). Comovetor[0](7) é maior quevetor[4](2), a primeira metade ([0...4]) está rotacionada e a segunda metade ([5...8], que é{3, 4, 5, 6}) está ordenada. A chave5está no intervalo(vetor[meio], vetor[fim]](ou seja,(2, 6]), então a busca continua na segunda metade. Nova chamada:dados(vetor, 5, 8, 5). - Chamada 2:
dados(vetor, 5, 8, 5).meio = 6(vetor[6]=4). Comovetor[5](3) é menor quevetor[6](4), a primeira metade ([5...6], que é{3, 4}) está ordenada. A chave5não está no intervalo[vetor[inicio], vetor[meio])(ou seja,[3, 4)), então a busca continua na segunda metade. Nova chamada:dados(vetor, 7, 8, 5). - Chamada 3:
dados(vetor, 7, 8, 5).meio = 7(vetor[7]=5). A chave5é igual avetor[7], então o índice7é retornado.
- Chamada 1:
-
(B) Incorreta: O valor 6 é o índice do elemento
4no array, não da chave5. -
(C) Incorreta: O valor 8 é o índice do elemento
6(o último elemento) no array, não da chave5. -
(D) Incorreta: O valor 3 é o índice do elemento
1no array, não da chave5. -
(E) Incorreta: O valor 5 é a própria chave que está sendo procurada. O programa retorna o índice onde a chave é encontrada, não o valor da chave. Armadilha da banca: Uma confusão comum é retornar o valor da chave em vez do seu índice no array. Se o programa retornasse o valor da chave, a saída seria 5.
Fonte: FCC TRT20 2024 Técnico Judiciário - Área Apoio Especializado - Especialidade Tecnologia da Informação (Caderno Tipo 004). Reproduzida para fins de estudo.