Dados dos std::set
s, uno puede simplemente iterar a través de ambos conjuntos simultáneamente y comparar los elementos, lo que resulta en una complejidad lineal. Esto no funciona para std::unordered_set
s, porque los elementos se pueden almacenar en cualquier orden. Entonces, ¿qué tan caro es a == b
para std::unordered_set
?¿Qué tan caro es comparar dos conjuntos desordenados para la igualdad?
Respuesta
Complejidad de operator==
y operator!=
:
complejidad lineal en el caso promedio. N en el peor de los casos, donde N es el tamaño del contenedor.
Más detalles en el §23.2.5 estándar, punto 11:
Para unordered_set
y unordered_map
, la complejidad de operator==
(es decir, el número de llamadas para el operador ==
de la value_type
, al predicado devuelto por key_equal()
, y a la hasher devuelto por hash_function()
) es proporcional a N
en el caso promedio y a N en el peor caso, donde N
es a.size()
.
El peor caso es O (n²).
Pero los conjuntos desordenados en realidad están ordenados por hash. Por lo tanto, es posible comparar los valores hash (si esto falla, los conjuntos no pueden ser iguales) y luego verificar que los mismos valores hash (lineales) tengan los mismos valores (O (n²) para diferentes valores con el mismo hash).
En el mejor de los casos esto es O (n).
Normalmente la complejidad tiende a O (n) si la función hash es "buena" (diferentes objetos -> siempre diferente hash) y a O (n²) si la función hash es "mala" (todo siempre tiene el mismo valor hash)
"la función hash es buena (diferentes objetos -> hash siempre diferente)" -> diferentes hashes pueden ser verdaderos incluso para un terrible algoritmo hash (por ejemplo, cadenas hash de hasta 128 caracteres devolviendo un valor hash de 8 * 128 bits clonado desde la cadena), pero modifique eso en el número de cubos y el resultado es feo. Cuando no hay un conocimiento especial de las entradas que facilite la prevención de colisiones, una buena modificación de la función hash generalmente tiene colisiones en la proporción de cubetas usadas y no utilizadas ... lo que todavía da como resultado promedios de O (n). –
@TonyDelroy: ¡Gracias por señalar esto! Un "buen hash" no solo debe devolver "valores diferentes", sino también un "bien distribuido" respeto a los cubos (el espacio hash debe ser uniforme y primordial respecto a los cubos, solo para minimizar el efecto que mencionas) –
- 1. ¿Qué tan caro es Thread.getStackTrace()?
- 2. Smalltalk - Comparar dos cadenas para la igualdad
- 3. ¿Qué tan caro es .getClass() en Java?
- 4. ¿Qué tan caro es recargableData de UITableView?
- 5. ¿Qué tan "caro" es Oracle Enterprise Manager?
- 6. ¿Qué tan caro es lanzar un objeto?
- 7. Proceso para comparar dos conjuntos de datos
- 8. ¿Por qué DateTime.Now DateTime.UtcNow tan lento/caro?
- 9. ¿Qué tan caro es el estado de bloqueo?
- 10. ¿Qué tan caro es leer las propiedades del archivo? .NET
- 11. ¿Cuál es la forma más rápida de comparar dos matrices para la igualdad?
- 12. ¿Es una buena idea comparar double.MaxValue para la igualdad?
- 13. comparar dos lista <string> por la igualdad
- 14. comparar la igualdad de char [] en C
- 15. Igualdad entre dos enumerables
- 16. Octave/MATLAB: ¿Cómo comparar las estructuras para la igualdad?
- 17. Comparación de dos matrices numpy para la igualdad, elemento-sabio
- 18. Data.Foldable para contenedores desordenados
- 19. ¿Cómo comparar dos elementos del mismo tipo genérico sin restricciones para la igualdad?
- 20. ¿Manera fácil de comparar ArrayLists para la igualdad usando JUnit?
- 21. ¿Cómo funciona Ruby's Array? comparar elementos para la igualdad?
- 22. ¿Por qué estos conjuntos desordenados de C++ STL no se consideran iguales?
- 23. comparar arrays para la igualdad, el orden de los elementos
- 24. ¿Se pueden comparar objetos por dirección para la igualdad?
- 25. ¿Qué tan 'caro' es ejecutar jstack en una JVM en ejecución?
- 26. ¿Qué tan caro es realizar una operación de lanzamiento Vs i ++?
- 27. javascript/dom - ¿Qué tan caro es crear vs reorganizar nodos dom?
- 28. ¿Qué tan caro es el volcado de hilos de Java (Solr)?
- 29. Python: ¿Qué tan caro es crear una pequeña lista muchas veces?
- 30. ¿Qué tan caro es el tiempo de llamada (NULL) en el bucle del servidor?
¿Tiene una forma eficiente de verificar la membresía establecida (por ejemplo, están respaldados por hashtables)? – Thilo
En palabras claras, sencillas, fáciles de comprender y comprender del Estándar C++: "Dos contenedores no ordenados' a' y 'b' se comparan igual si' a.size() == b.size() 'y, para cada grupo de clave equivalente '[Ea1, Ea2)' obtenido de 'a.equal_range (Ea1)', existe un grupo de clave equivalente '[Eb1, Eb2)' obtenido de 'b.equal_range (Ea1)', tal que ' distancia (Ea1, Ea2) == distancia (Eb1, Eb2) 'y' is_permutation (Ea1, Ea2, Eb1) 'devuelve' true'. Para 'unordered_set' ... la complejidad de' operator == '... es proporcional a 'N' en el caso promedio y a' N^2' en el peor de los casos, donde 'N' es' a.size() '." –