Autor Tema: Eficiencia en estructuras  (Leído 1821 veces)

Desconectado svoboda

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 453
    • Ver Perfil
Eficiencia en estructuras
« en: Octubre 08, 2009, 08:36:55 am »
Hola a todos, os pongo en antecedentes antes de hacer la pregunta porque no tengo muy claro como enfocarla.

Estoy realizando ejercicios relacionados con la algoritmia, es decir, resolver problemas mediante métodos como:
- Programación dinámica.
- Ramificación y poda.
- Algoritmos voraces.
- Backtracking.
...

Los métodos, que hace cada uno de ellos y como implementarlos, lo tengo claro. El problema lo encuentro a la hora de definir almacenes para la técnica de programación dinámica.

¿Existe algún documento o similar que te de ciertas pautas a seguir para la creación de almacenes? o al menos, ¿existe alguna comparativa de eficiencia entre HashTable, HashMap y HashSet? Estoy trabajando con Java de ahí las estructuras nombradas. Esta claro que lo más eficiente, sería una matriz multidimensional ya que se accede directamente a sus posiciones, pero no siempre es lo más fácil de utilizar.

Como se que hay gente en el foro que a participado en concursos de algoritmia espero que alguno pueda arrojar un poco de luz sobre esto. Gracias.

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Re: Eficiencia en estructuras
« Respuesta #1 en: Octubre 08, 2009, 05:55:56 pm »
Hola compañero. Como bien dices, lo mas rapido es una vector multidimensional, y tambien lo mas complicado de codificar en segun que circustancias.

Sobre las funciones Java, no conozco ninguna comparativa entre ellas de rendimiento, pero si que cada una hace cosas diferentes, asi que cuanto mas simple sea su cometido, posiblemente mas rapida será.

-Hashtable / Hashmap : Es una tabla de hash de toda la vida, metes una "llave" (para buscar el valor) y el valor en si. Con la "llave" recuperas el valor.

La diferencia entre ellas es que Hashtable esta synchronized (permite acceso concurrente) y Hashmap no lo esta, no permite acceso concurrente.

Por lo cual, si no usas concurrencia, sera mas efectiva Hashmap

-Hashset : Es un conjunto. Tu ahi metes elementos, y te dice si esta o no dentro el elemento.
Tambien puedes recorrerlo. La funcion es diferente a la de una tabla de hash

Espero sirva de ayuda, si necesitas algo preguntame (aunque del Java estoy un poco desconectado)


Desconectado svoboda

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 453
    • Ver Perfil
Re: Eficiencia en estructuras
« Respuesta #2 en: Octubre 08, 2009, 08:43:07 pm »
Gracias por la respuesta HQH, alguna pregunta más seguro que cae. Además, si no recuerdo mal tu participaste en algún concurso de algoritmia.

De todas si alguien tiene algo más que aportar todas las respuestas son bien recibidas.

Yo casi siempre uso un HashMap, pero por ejemplo un caos reciente es que la estructura:
Código: [Seleccionar]
HashMap<HashMap<String, Integer>, Integer>va mucho más rápida que:
Código: [Seleccionar]
HashMap<String, Integer>debido supongo a las colisiones a la hora de introducir elementos.

La verdad es que la selección de almacenes para mi aún es un tema oscuro. Yo suelo usar un HashMap, salvo cuando el vector multidimensional se ve a la legua, sobre todo porque también ahorras en cuestiones de espacio, muchas veces en la estructura multidimensional malgastas mucho espacio.

Desconectado HQH

  • Administrator
  • Miembro Imprescindible
  • *****
  • Mensajes: 1.856
    • Ver Perfil
Re: Eficiencia en estructuras
« Respuesta #3 en: Octubre 09, 2009, 07:19:04 am »
He participado :P aunque siempre en C :P

Sobre hashmap

Código: [Seleccionar]
HashMap(int initialCapacity)
          Constructs an empty HashMap with the specified initial capacity and the default load factor (0.75).

Si hay colisiones, puedes jugar con el tamaño, haciendolo mayor. Por "movidas matematicas" es recomendable que el tamaño sea un numero primo.
Prueba esos casos si asi te va mejor (con un primo grande).

Un saludo!



Desconectado svoboda

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 453
    • Ver Perfil
Re: Eficiencia en estructuras
« Respuesta #4 en: Octubre 09, 2009, 05:54:02 pm »
No había pensado en lo de variar el tamaño de creación del HashMap, como el va aumentando el tamaño conforme lo necesita. Intentaré probarlo cuando tenga un rato.