Cómo exprimir nanosegundos fuera de un bucle de java

Los mejores trucos son los trucos más simples. Así que sigue leyendo para ser introducido a un simple truco que ha sido alrededor de las edades - un truco que puede cortar la mitad de tiempo que va desde un bucle de programa Java.

Imagínese buscando a través de una larga lista de nombres. Ficha 1 tiene algo de código para ilustrar la idea.

Ficha 1: Búsqueda de un nombre

clase java.util.Scanner pública java.io.File-importación java.io.IOException-importación importación principal {static Scanner diskFile-static int MAX_SIZE = String nombre 100-estático [] = new String [MAX_SIZE] vacío -públicos estática main (String [] args) throws IOException {diskFile = new Scanner (new File ("nombres.txt")) - int numberOfNames = fillTheArray () - searchfor ("Burd", numberOfNames) -} static int fillTheArray () {int i = 0, mientras (diskFile.hasNext () yo lt; MAX_SIZE) {nombre [i ++] = diskFile.next () -} volver i-} static void searchfor (String whatToSearchFor, int numberOfNames) {int i = 0-mientras yo lt; numberOfNames   !nombrar [i] .equals (whatToSearchFor)) { i ++ -}si yo lt; numberOfNames) { System.out.println ("Se ha encontrado en la posición" + i) -} Else { System.out.println ("No encontrado") -}}}

El código del Listado 1 tiene una serie de nombres. El número de entradas de la matriz es numberOfNames. El código en negrita en la parte inferior de la lista comprueba repetidamente para una entrada que contiene los mismos caracteres que whatToSearchFor (en este ejemplo, el nombre "Burd").

El bucle también comprueba varias veces para asegurarse de que yo es menos que numberOfNames. Sin este control, ejecución de su programa puede venirse abajo con un Excepción de puntero nulo o un ArrayIndexOutOfBoundsException. He aquí por qué:

  • Imagínese que el nombres.txt archivo contiene tres nombres: "Rizado", "Larry", y "Moe". entonces nombrar [0] es "Rizado", nombrar [1] es "Larry", y nombrar [2] es "Moe". No hay nombrar [3] valor. (Ser más preciso, nombrar [3] es nulo.)

    El valor de numberOfNames es 3. Sin la yo lt; numberOfNames comprobar, el programa comprueba !nombrar [3] .equals (whatToSearchFor). Pero nombrar [3] es nulo así que la carrera del programa explota con el Excepción de puntero nulo.

  • Imagine que el archivo nombres.txt contiene 100 nombres, y que MAX_SIZE es 100. Entonces, cada entrada en el nombre matriz contiene una cadena honesto a la bondad. Las entradas en el nombre matriz son nombrar [0], nombrar [1], y así sucesivamente, todo el camino hasta nombre [99]. No hay nombrar [100] de entrada.

    Sin el yo lt; numberOfNames comprobar, el programa comprueba !Nombre [100] .equals (whatToSearchFor). Pero nombrar [100] no existe, por lo que la carrera del programa muerde el polvo con el ArrayIndexOutOfBoundsException.

De una forma u, que al parecer tiene que comprobar dos cosas cada vez a través del bucle: Usted tiene que comprobar si yo lt; numberOfNames y luego comprobar si !nombrar [i] .equals (whatToSearchFor).

Así que la gran pregunta es, ¿Puedes hacerlo mejor? ¿Se puede marcar sólo una condición en lugar de dos? Y la respuesta (como si no lo ha adivinado) es "Sí, se puede." Este truco particular, no reduce el tiempo de ejecución del programa a pasos agigantados, pero es un truco lindo, sin embargo. Aquí está la idea:

Nunca leído en tantos nombres que no tenga al menos una entrada matriz vacía. Luego, después de la última entrada de la matriz honesto a la bondad, agrega uno interés social más concretamente, el nombre que tiene la intención de buscar. Con este nombre extra al final de la matriz, usted no tiene que mantener el control yo lt; numberOfNames. Ahora la otra condición, !Nombre [100] .equals (whatToSearchFor), debe convertirse en falsa antes de te quedas sin entradas de matriz.

Ficha 2 contiene algo de código para ilustrar esta idea. (Las diferencias entre Ficha 2 y Listado 1 están marcados en negrita en el Listado 2.)

Ficha 2: Un poco mejor búsqueda de rutina

clase java.util.Scanner pública java.io.File-importación java.io.IOException-importación importación principal {static Scanner diskFile-static int MAX_SIZE = String nombre 100-estático [] = new String [MAX_SIZE] vacío -públicos estática main (String [] args) throws IOException {diskFile = new Scanner (new File ("nombres.txt")) - int numberOfNames = fillTheArray () - searchfor ("Burd", numberOfNames) -} static int fillTheArray () {int i = 0, mientras (diskFile.hasNext () yo lt; MAX_SIZE - 1) {Nombre [i ++] = diskFile.next () -} volver i-} static void searchfor (String whatToSearchFor, int numberOfNames) {nombrar [] = numberOfNames whatToSearchFor-int i = 0-while (!nombrar [i] .equals (whatToSearchFor)) {I ++ -} if (i lt; numberOfNames) {System.out.println ("encontrado en la posición" + i) -} else {System.out.println ("No encontrado") -}}}

En el Listado 2, el valor MAX_SIZE - 1 asegura que la matriz tiene al menos una entrada vacía. La declaración

nombrar [numberOfNames] = whatToSearchFor-

coloca el nombre que tiene la intención de buscar después de la última entrada de la matriz honesto a la bondad. Y la condición !nombrar [i] .equals (whatToSearchFor) comprueba las entradas de la matriz hasta que encuentra un nombre de la nombres.txt archivo, o el nombre que ha colocado artificialmente después de la última entrada.

Así que ese es el truco. Mediante la adición de una entrada extra al final de la lista, se pasa de comprobar dos condiciones repetidamente

mientras yo lt; numberOfNames ! nombre [i] .equals (whatToSearchFor))

de comprobar una sola condición en varias ocasiones:

while (! nombre de [i] .equals (whatToSearchFor))

He aquí un hecho interesante sobre el truco descrito en este artículo: No es necesario un programa de Java para poder utilizar este truco. De hecho, usted ni siquiera necesita una computadora! El truco se aplica a todo tipo de situaciones que involucran la búsqueda - Búsqueda hecho por computadoras, la búsqueda realizada por robots, e incluso búsquedas realizadas por los seres humanos.

Imagine tener una larga línea de cajas, y diciéndole a su asistente para encontrar un pomelo en cualquiera de los primeros cien cajas. (Mañana, alguien más va a empezar a buscar desde el cuadro de 101o en adelante.) Usted puede tener sus asistentes cuentan las cajas en su búsqueda, pero ¿quién quiere hacer un seguimiento de los recuentos de la caja en su búsqueda? Si ya sabes dónde está el cuadro 101a es, poner un marcador en esa caja y dígale a su asistente para buscar hasta el marcador. Mejor aún, poner una falsificación, pomelo plástico en la caja 101a y simplemente dígale a su asistente para encontrar un pomelo.

El mismo tipo de razonamiento funciona en situaciones menos artificiales. Una receta de lasaña requiere 50 minutos en el horno. Usted podría comenzar a calentar la lasaña a las 5:53 pm y mirar el reloj cada minuto más o menos. Cuando por fin has contado de 50 minutos, se toma la lasaña del horno.

Pero contando minutos es molesto. Mientras usted mira hacia atrás en el reloj, es posible que se pierda parte de su anuncio de televisión favorito. En vez de hacer todo esto contando, poner un marcador al final del proceso por el establecimiento de su reloj de cocina para que suene en 50 minutos.

¿Lo ves? No se trata sólo de Java. Es de sentido común.




» » » » Cómo exprimir nanosegundos fuera de un bucle de java