2012-09-27 22 views
10

(Hay algunas preguntas acerca de matrices dispersas en tiempo eficiente pero estoy en busca de eficiencia de la memoria.)memoria eficientes en Java

necesito el equivalente de un List<T> o Map<Integer,T> cuales

  1. Puede crecer a demanda simplemente configurando una clave más grande que cualquiera que se haya encontrado anteriormente. (Puede suponer que las claves no son negativas.)
  2. Tiene una memoria tan eficiente como ArrayList<T> en el caso de que la mayoría de los índices no sean null, es decir, cuando los datos reales no son muy escasos.
  3. Cuando los índices son escasos, consume espacio proporcional a la cantidad de índices que no son null.
  4. Utiliza menos memoria que HashMap<Integer,T> (ya que esto autocaptura las claves y probablemente no aprovecha el tipo de tecla escalar).
  5. Puede obtener o establecer un elemento en el tiempo de registro (N) amortizado donde N es el número de entradas: no necesita ser tiempo lineal, la búsqueda binaria sería aceptable.
  6. Implementado en una biblioteca Java de código abierto no viral (preferiblemente en Maven Central).

¿Alguien conoce esta clase de utilidad?

Hubiera esperado que Commons Collections tuviera una, pero no parecía.

Me encontré con org.apache.commons.math.util.OpenIntToFieldHashMap que parece casi correcto, excepto el tipo de valor es un FieldElement que parece gratuito; Solo quiero T extends Object. Parece que sería fácil editar su código fuente para que sea más genérico, aunque prefiero usar una dependencia binaria si hay una disponible.

Respuesta

6

Lo intentaría con las colecciones trove, hay TIntObjectMap que pueden funcionar para sus propósitos.

+0

Eso se ve bien. Intenté adaptar 'OpenIntToFieldHashMap' a un tipo de valor genérico, que parece haber funcionado con ~ 10min de trabajo, pero solo funciona marginalmente mejor que' TIntObjectMap'. –

1

He guardado mi caso de prueba como jglick/inthashmap. Los resultados:

HashMap size: 1017504 
TIntObjectMap size: 853216 
IntHashMap size: 846984 
OpenIntObjectHashMap size: 760472 
+1

¿Dónde encuentro IntHashMap? – oleh

+0

@oleh probablemente apache commons (?) – Karussell

+1

Lo siento, 'IntHashMap' fue mi adaptación de' OpenIntToFieldHashMap' de Commons Math. Como era apenas mejor que 'TIntObjectMap', desestimé este enfoque. –

4

Me gustaría ver la implementación de SparseArray de Android en busca de inspiración. Puede ver la fuente descargando el código fuente de AOSP aquí http://source.android.com/source/downloading.html

+0

https://code.google.com/p/android-source-browsing/source/browse/core/java/android/util/SparseArray.java?spec=svn.platform--frameworks--base.58aff7debfdab8ca99dd6bfcfa0c7bebdf2d303b&repo=platform --frameworks - base & r = 58aff7debfdab8ca99dd6bfcfa0c7bebdf2d303b parece apropiado - el tiempo de ejecución amortizado no está documentado, pero de la inspección supongo que es logarítmico y está en ASL 2.0, lo cual está bien. Lamentablemente, no está en Central que yo conozca, y quisiera que se desacople de cosas no relacionadas, como la compatibilidad con Android Bluetooth, que está en la misma raíz de origen. –

+1

Aquí hay una versión independiente que utiliza todo el código necesario desde Android https://github.com/frostwire/frostwire-jlibtorrent/blob/b4b3f9a90d7a1dade864d7e3eaa88b616f200a9a/src/com/frostwire/jlibtorrent/SparseArray.java – Gubatron

1

Le sugiero que use OpenIntObjectHashMap de la biblioteca Colt. Link

+0

Gracias por la punta . De hecho, tiene un consumo de espacio moderado pero significativamente menor que las alternativas. He incluido esto en mi caso de prueba revisado. –