Autor Tema: Busquedas eficientes en java ¿mejor TreeSet, ArrayList o arrays?  (Leído 11946 veces)

edward9104

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Buen día compañeros lo que sucede es que en un archivo tengo varios (por no decir que son muchos) registros y tengo que guardarlos en una estructura de datos y realizar unas búsquedas que sean eficientes, en otras palabras que no se demoren, al principio se me ocurrió utilizar hashmap ya que cuesta O(1) pero el problema es que como son <clave,valor> la clave solo puede ser un dato y la búsqueda debe ser con varios datos del registro.

Ej: nombre, id, edad, apellido, peso, fechaNacimiento --->(registro)

La aplicación debe ser capaz de buscar a la persona ya sea por el nombre, todas aquellas que sean menores a una edad X o que pesen mayor a un peso Y, el caso es que no sé qué estructura implementar para realizar este tipo de búsquedas y que sean rápidas.

Espero sus colaboraciones y sus puntos de vista, de antemano gracias.
« Última modificación: 20 de Septiembre 2014, 18:33 por Alex Rodríguez »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Busquedas eficientes en java
« Respuesta #1 en: 24 de Enero 2013, 08:58 »
Buenas edward a mí se me ocurren varias alternativas:

a) Usar la clase Treeset y apoyarte en el método contains(Object o)

b) Usar la clase Arraylist y apoyarte en el método contains(Object o)

c) Usar vectores y apoyarte en la clase Arrays donde dispones del método sort para realizar ordenaciones. Luego podrías implementar un método de búsqueda propio o usar el método binarySearch para realizar búsquedas.

Para mí la clave de que la búsqueda sea rápida está en que tengas la estructura de datos ordenada en base al criterio de búsqueda. Lo que yo haría sería:

- En primer lugar crear la clase RegistroDatos donde cada registro tiene los atributos nombre, id, edad, apellido, peso, fechaNacimiento

- Definir tres comparadores para poder crear tres clases TreeSet con diferentes criterios de ordenación (por nombre, por edad y por peso)

- Importar los datos a una estructura de datos

- Crear tres estructuras de datos TreeSet donde ordenes los datos (pej. datosPorNombre, datosPorEdad y datosPorPeso) usando el constructor

TreeSet(Comparator<? super E> comparator)
          Constructs a new, empty tree set, sorted according to the specified comparator.


Ten en cuenta que vas a tener los datos repetidos en tres estructuras distintas ¿Para qué tener ese coste en espacio o almacenamiento? Pues precisamente para hacer las búsquedas muy rápidas.

- Según la búsqueda que se quiera usar, emplear el método contains aplicado a la estructura de datos correspondiente

En cuestión de búsquedas tener O(1) es prácticamente imposible, si fuera así no sería una búsqueda sino una localización directa, el asunto es tener un coste razonable.

Si lo intentas y pegas el código te comento cómo lo veo, saludos

edward9104

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Busquedas eficientes en java
« Respuesta #2 en: 25 de Enero 2013, 16:14 »
Muchas gracias Ogramar voy a tomar en cuenta tus concejos y voy a experimentar usando varias estructuras con el objeto de hacerlas más rápidas a la hora de buscar y cualquier cosa voy subiendo el código para que me le des el visto bueno

edward9104

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Busquedas eficientes en java
« Respuesta #3 en: 20 de Febrero 2013, 21:51 »
Intente utilizar tu idea pero no conocia algunas cosas y me fui por esta planteación https://www.dropbox.com/s/0nvqg7by0k8dona/diagrama.jpg pero me resulto mas lenta de lo que esperaba, entonces despues de mi derrota recurro a ustedes para que me heche una mano, tengo entendido utilizar las TreeSet que pueden ser rapidos pero como creo varios compareTo en la misma clase? para guardalos con diferentes criterios y como se usa o donde puedo encontrar mas informacion de
TreeSet(Comparator<? super E> comparator)
          Constructs a new, empty tree set, sorted according to the specified comparator.


De antemano muchas gracias por su ayuda!

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Busquedas eficientes en java
« Respuesta #4 en: 21 de Febrero 2013, 10:49 »
Siguiendo con lo que te había propuesto los pasos a dar serían los siguientes:

Primero, crea tres clases (o las que te hagan falta) que implementen la interface comparator tal y como se explica en:

https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=599:interface-comparator-del-paquete-javautil-api-de-java-ejercicios-y-ejemplos-resueltos-cu00915c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

Ponle el nombre que tú veas conveniente (yo voy a suponer que se llaman comparadorCriterio1, comparadorCriterio2 y comparadorCriterio3)

Fíjate que no tienes que crear tres compareTo en la misma clase, sino tres clases distintas.

Segundo, crea tres treeset para contener los datos, cada uno creado con una instrucción del tipo:

SortedSet<TipoDelObjeto> nombreObjeto = new TreeSet<TipoDelObjeto>(new comparadorCriterio1());

Harías igual para criterio 2 y criterio 3.

Ahora ya tendrías 3 treeset ordenados con distintos criterios.

Según la búsqueda que se quiera usar, emplear el método contains aplicado a la estructura de datos (treeset) correspondiente.

Te aconsejo que primero hagas una prueba sencilla, un programa pequeño de prueba, antes de generar un programa complejo. Sería un programa donde simplementes tengas los tres treeset y muestres por pantalla cómo introduciendole los mismos datos te los ordena de distinta manera. Como te dije en el mensaje anterior si vas poniendo el código intento echarle un vistazo y comentarte algo.

Tienes más información sobre TreeSet aquí: https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=610:interfaces-set-y-sortedset-del-api-java-clases-hashset-y-treeset-ejemplo-diferencias-cu00921c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

Saludos!

edward9104

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Busquedas eficientes en java
« Respuesta #5 en: 22 de Febrero 2013, 22:12 »
Buen dia, después de mucho testear el programa y tratar de entender de porque es lento, di como resultado que es culpa del String de retorno, este String retorna una la información de unos aproximados 4000 registros los cuales tienen atributos como año, país, población, código, etc, y usando un array bidimensional (matriz) guardando en ella esos mismos datos esl tiempo del proceso es mucho más rápido que con el String, alguien me podría decir porq pasa esto?

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Busquedas eficientes en java
« Respuesta #6 en: 23 de Febrero 2013, 08:30 »
Hola si no pones algo de código o lo explicas mejor no acabo de entender a qué te refieres. Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".