2010-02-23 16 views
10

estoy ocupado preparación para el examen de MCTS 70-536, de acuerdo con el libro de examen (Microsoft Press - .NET Framework - Fundación de desarrollo de aplicaciones a ritmo personal Kit de formación 2ª edición), este ejemplo de código:ArrayList BinarySearch

ArrayList al = new ArrayList(); 
al.AddRange(new string[] { "Hello", "world", "this", "is", "a", "test" }); 
Console.WriteLine(al.BinarySearch("this")); 

Envía el valor '2' a la consola porque el elemento 'this' está en el índice 2. Estoy de acuerdo en que es la salida que obtengo cuando ejecuto ese código.

Sin embargo, si corro

Console.WriteLine(al.BinarySearch("world")); 

que se puede esperar para obtener el valor 1 en la consola desde el 'mundo' sería en el índice 1, sin embargo consigo el valor -7?

¿Alguien podría explicar cómo funciona esto?

Gracias

Respuesta

11

La matriz está realizando la búsqueda binaria en la que no está ordenada. Este es un requisito para que BinarySearch funcione.

Al no estar ordenado, confunde el algoritmo de búsqueda y hace pensar que "mundo" debería estar en el 7mo lugar, pero no está en el conjunto: el resultado es -7.

+0

Gracias que me ha dado mejores resultados. Estoy bastante sorprendido por el error en el libro. Suena un poco extraño tener un .BinarySearch (s) y un .IndexOf (s) método haciendo lo mismo. –

3

toman directamente de documentación de MSDN de ArrayList.BinarySearch (http://msdn.microsoft.com/en-us/library/5tzt7yz3%28VS.85%29.aspx)

El parámetro de valor y cada elemento de la ArrayList debe implementar la interfaz IComparable , que se utiliza para las comparaciones. Los elementos del ArrayList ya deben estar ordenados en incrementando el valor según el orden de clasificación definido por la implementación de IComparable ; de lo contrario, el resultado podría ser incorrecto.

0

Desde el documentation:

El índice basado en cero del valor en el ordenados ArrayList, si no se encuentra el valor; de otro modo, un número negativo, que es el complemento bit a bit del índice de el siguiente elemento que es mayor que valor o, si no hay más grande elemento, el complemento bit a bit de Conde.

Observe palabra.

1

Pregunta ya respondida, pero agregada como referencia.

El BinarySearch encontrará elementos utilizando un algoritmo ordenado. En su ejemplo, el orden predeterminado es alfabético, por lo que "mundo" debería ser el último, por lo tanto el número 7.

Verá un supercargador del BinarySearch que acepta un objeto IComparer. Para no suministrar esto, se obtiene el tipo predeterminado de alfabético.

Pero si implementó el método "reverseSort" como sugiere el libro, entonces necesitaría pasar la función BinarySearch al objeto "reverseSort".

Me gusta esto;

Console.WriteLine(al.BinarySearch(al, new reverseSort())); 

También al igual que yo que era bastante interesante si se implementa la clase "reverseSort" y hacer un Console.WriteLine en la que los valores dan comparado, los resultados no fueron lo que cabe esperar. Pasé un rato tratando de averiguar qué era el algoritmo.