Comparar dos std::vector no ordenados.
Cuál es la mejor manera de comparar dos std::vector
no ordenados?
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2 = {2, 3, 4, 5, 1};
Lo que estoy haciendo actualmente es:
const auto is_similar = v1.size() == v2.size() && std::is_permutation(v1.begin(), v1.end(), v2.begin());
Aquí, dos vectores son similares solo cuando el tamaño de ambos vectores es igual y contienen los mismos elementos.
¿Cuál sería un enfoque mejor para:
- dos pequeños
std::vector
(tamaño inferior a 50 elementos) - dos grandes
std::vector
?
davy.ai
El enfoque que estás utilizando actualmente con
std::is_permutation
es un método razonable para comparar dosstd::vector
s desordenados, y debería funcionar bien tanto para vectores pequeños como grandes. Sin embargo, hay algunas opciones alternativas que podrías considerar dependiendo de tu caso de uso específico y requisitos de rendimiento:Ordenar primero los vectores utilizando
std::sort
, y luego compararlos de esta manera:Este enfoque tiene una complejidad temporal de O(nlogn) debido a la ordenación, pero puede ser más rápido para vectores muy grandes porque
std::is_permutation
tiene una complejidad temporal en el peor de los casos de O(n^2) y puede requerir memoria adicional.Otro enfoque es crear un hash de los vectores y compararlos. Aquí tienes un ejemplo utilizando
boost::hash_combine
:Este enfoque tiene una complejidad temporal de O(n), pero puede haber colisiones si la función hash no es lo suficientemente robusta.
En general, el enfoque que estás utilizando actualmente con
std::is_permutation
es una opción razonable para comparar vectores desordenados, y es posible que no necesites considerar otros enfoques a menos que tengas requisitos de rendimiento o robustez específicos.