Necesito saber: ¿Cuál es la complejidad temporal de HashMap.containsKey() en java?¿Cuál es la complejidad de tiempo de HashMap.containsKey() en java?
Respuesta
Desde el API doc of
HashMap:
Esta aplicación proporciona un rendimiento constante en el tiempo para los operaciones básicas (obtener y poner), suponiendo que la función hash dispersa los elementos correctamente entre los depósitos.
Desde containsKey()
es sólo un get()
que tira a la basura el valor recuperado, es O (1) (suponiendo que la función hash funciona correctamente, de nuevo).
esto es lo que pensé antes. Pero no es correcto Echa un vistazo a la respuesta de Jigar Joshi. Su respuesta es correcta para 'Hashtable' que no permite valores nulos. – AlexR
@AlexR: Creo que estás malinterpretando por completo el código en la respuesta de Jigar. No tiene absolutamente nada que ver con valores nulos, y el bucle for solo recorre la lista de entradas enlazadas en un único contenedor, que es O (1) si, como dije dos veces en mi respuesta, la función hash hace su trabajo. –
Si consigo elegir las claves que ya están en el mapa, es O (n). –
Es O(1)
en general, sin embargo, en el peor caso es O(n)
public boolean containsKey(Object key) {
352 return getEntry(key) != null;
353 }
354
355 /**
356 * Returns the entry associated with the specified key in the
357 * HashMap. Returns null if the HashMap contains no mapping
358 * for the key.
359 */
360 final Entry<K,V> getEntry(Object key) {
361 int hash = (key == null) ? 0 : hash(key.hashCode());
362 for (Entry<K,V> e = table[indexFor(hash, table.length)];
363 e != null;
364 e = e.next) {
365 Object k;
366 if (e.hash == hash &&
367 ((k = e.key) == key || (key != null && key.equals(k))))
368 return e;
369 }
370 return null;
371 }
Generalmente O (1), pero si estamos usando una mala función hashCode, necesitamos agregar varios elementos a un cubo para que pueda ser O (n) en el peor de los casos.
La complejidad del tiempo de containsKey
ha cambiado en JDK 1.8-, como otros han dicho que es O(1)
en casos ideales. Sin embargo, en caso de colisiones en el que el keys
son Comparable
, contenedores de almacenamiento de elementos chocan no son lineales más después de que superen un umbral llamado TREEIFY_THRESHOLD
, que es igual a 8,
/**
* The bin count threshold for using a tree rather than list for a
* bin. Bins are converted to trees when adding an element to a
* bin with at least this many nodes. The value must be greater
* than 2 and should be at least 8 to mesh with assumptions in
* tree removal about conversion back to plain bins upon
* shrinkage.
*/
static final int TREEIFY_THRESHOLD = 8;
En otras palabras, se utilizará TreeNodes
(similar a los de TreeMap
) para almacenar contenedores (es decir, una estructura de árbol rojo-negro) y esto nos deja con una complejidad O(lgn)
en caso de colisiones.
Lo mismo se aplica para get(key)
en donde ambos métodos llaman getNode
internamente
Nota: n aquí es el tamaño de la bin
y no HashMap
- 1. ¿Cuál es la complejidad de tiempo de LinkedList.getLast() en Java?
- 2. ¿Cuál es la complejidad del tiempo de cruce de árboles?
- 3. ¿Cuál es la complejidad de tiempo de .NET list.sort()
- 4. ¿Cuál es la complejidad de tiempo de HTML DOM búsquedas
- 5. ¿Cuál es la complejidad de tiempo de una llamada a size() en LinkedList en Java?
- 6. ¿Cuál es la complejidad de tiempo del método java.util.Collections.sort()?
- 7. Complejidad del tiempo del conjunto en Java
- 8. ¿Cuál es la complejidad temporal de la iteración TreeSet?
- 9. ¿Cuál es la complejidad de OrderedDictionary?
- 10. Complejidad del tiempo para java ArrayList
- 11. ¿Cuál es la complejidad de tiempo de la función de conteo en clojure?
- 12. Java HashMap.containsKey() no llamar iguales()
- 13. ¿Cuál es la complejidad del tiempo de ejecución de una instrucción switch?
- 14. Complejidad de tiempo
- 15. ¿Cuál es la complejidad del tiempo de ejecución de las funciones de la lista de python?
- 16. ¿Cuál es la complejidad del tiempo para hacer estallar elementos de la lista en Python?
- 17. ¿Cuál es la complejidad de concatenación de cuerdas balanceadas?
- 18. Cuál es la complejidad de tiempo de eliminar un nodo en un árbol binario
- 19. ¿Cuál es la complejidad de tiempo de las operaciones ordenadas en TreeSet?
- 20. Complejidad del tiempo de la tabla hash
- 21. Cola de prioridad eliminar tiempo de complejidad
- 22. ¿Cuál es la complejidad de la función de registro?
- 23. ¿Cuál es la complejidad del tiempo de indexación, inserción y eliminación de estructuras de datos comunes?
- 24. ¿Cuál es la complejidad de set_intersection en C++?
- 25. ¿Cuál es la complejidad del tiempo de iteración a través de un estándar :: set/std :: map?
- 26. ¿Cuál es la complejidad de la expresión regular?
- 27. ¿Cuál es la complejidad de estos métodos de diccionario?
- 28. Complejidad del tiempo de la potencia()
- 29. ¿Por qué Java no incluye la complejidad de tiempo/espacio de cada función en el javadoc?
- 30. TreeMap - Complejidad del tiempo de búsqueda
@OlegSklyar Esta pregunta me ha ayudado porque tenía que poner en práctica un HashMap yo mismo. – trinity420
@ trinity420 ¿Esto justifica no leer la documentación de la API cuando tienes una pregunta sobre la API? –