Dúvida no método binarySearch

7 respostas
T
import java.util.*;

public class Search
{
	public static void search(List<String> list){
		list.clear();
		list.add("b");
		list.add("a");
		list.add("c");

		System.out.println( Collections.binarySearch(list, "a") );
	}

	public static void main(String args[]){

		search( new LinkedList<String>() );
		//search( new ArrayList<String>() );
		
	}
}

Tanto o ArrayList, como o LinkedList geram como saída 1 (pois o elemento "a" está na segunda posição da lista).

Porém, estava fazendo essa questão aqui:
public static void search(List<String> list){
		list.clear();
		list.add("b");
		list.add("a");
		list.add("c");

		System.out.println( Collections.binarySearch(list, "a") );
	}

A) 0
B) 1
C) 2
D) a
E) b
F) c
G) The result is undefined

A resposta correta é a G, mas eu iria de B. Por que a B não é sempre correta? Existe alguma implementação de List que não coloca seus elementos um atrás do outro?

Obrigado!

7 Respostas

E

List != Set

List deixa os elementos na ordem em que foram inseridos (“ordered”), não arrumados (“sorted”).

Como binarySearch só funciona corretamente se os elementos estiverem arrumados (“sorted”), então a resposta é G.

T

entanglement:
List != Set

List deixa os elementos na ordem em que foram inseridos (“ordered”), não arrumados (“sorted”).

Como binarySearch só funciona corretamente se os elementos estiverem arrumados (“sorted”), então a resposta é G.

Eu entendo isso, mas no caso da sequência b a c sempre o BinarySearch irá funcionar, pois ele vai acabar pegando o elemento do meio primeiramente para testar. Funcionaria pra qualquer caso onde o a estivesse no meio, como por exemplo:

u jjj k hj a r g b t

Mas, pela resposta ser a G, acho que o exame não quer que analisemos dessa maneira…

E

Ah, é que o exame não está preocupado com o funcionamento interno de binarySearch e que tenha calhado que, para aquele conjunto de dados em particular, ele conseguisse encontrar a resposta certa, mesmo violando a condição de funcionamento.
A ideia é que você saiba que binarySearch requer uma sequência ordenada - até porque os detalhes de implementação de um determinado algoritmo pode mudar de uma versão para outra.
Só para ter uma ideia: o algoritmo de ordenação (Collections.sort, Arrays.sort) será modificado na versão 7 do Java, mas propositadamente isso não é mencionado explicitamente no javadoc, até para você evitar depender disso para que seus programas funcionem corretamente.

T

Humm legal. Entendi. Obrigado entanglement :thumbup:

L

entanglement:
Ah, é que o exame não está preocupado com o funcionamento interno de binarySearch e que tenha calhado que, para aquele conjunto de dados em particular, ele conseguisse encontrar a resposta certa, mesmo violando a condição de funcionamento.
A ideia é que você saiba que binarySearch requer uma sequência ordenada - até porque os detalhes de implementação de um determinado algoritmo pode mudar de uma versão para outra.
Só para ter uma ideia: o algoritmo de ordenação (Collections.sort, Arrays.sort) será modificado na versão 7 do Java, mas propositadamente isso não é mencionado explicitamente no javadoc, até para você evitar depender disso para que seus programas funcionem corretamente.

Olá!

Interessante essa informação, você tem um link dizendo com mais detalhes sobre essa mudança do algoritmo de sort no Java 7? Fiquei curioso!

[]s

T

A partir do build 70 (se não me engano) isso foi implementado. (Agora está no build 83).

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124 - “Replace “modified mergesort” in java.util.Arrays.sort with timsort”-

L

thingol:
A partir do build 70 (se não me engano) isso foi implementado. (Agora está no build 83).

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124 - “Replace “modified mergesort” in java.util.Arrays.sort with timsort”-

Show! Muito obrigado!

Criado 17 de fevereiro de 2010
Ultima resposta 17 de fev. de 2010
Respostas 7
Participantes 4