Problema: Necesito obtener un elemento aleatorio para un contenedor y también eliminarlo de ese contenedor. El contenedor no necesita ser ordenado. No me importa la orden.Obtener elemento aleatorio y eliminarlo
- vector puede conseguirme elemento aleatorio en
O(1)
pero eliminarla sólo enO(N)
Lista - elimina elemento en
O(1)
pero sólo se puede conseguir elemento aleatorio enO(N)
Así que se me ocurrió una idea de hacer un vector personalizado que le permita eliminar cualquier elemento por su índice con O(1)+
complejidad. La idea es intercambiar el último elemento y un elemento que desea eliminar y luego pop_back()
. Si necesita eliminar el último elemtent, solo pop_back()
. El orden del vector no será el mismo pero obtienes un método de eliminación rápida.
Como puedo entender deque tengo acceso más lento por índice y peor complejidad de eliminación que mi solución pero no estoy 100% seguro.
Tengo curiosidad de que haya estructuras de datos que tengan acceso aleatorio y eliminación de elementos en O(1)
o O(logN)
por índice o mb por valor?
¿Por qué necesita crear un vector personalizado para esto? ¿Simplemente cambia el elemento hasta el final y quítalo de allí? Esto no necesita ser una clase especial. –
Le he dado una solución si desea mantener el orden de los elementos, esa sería la complejidad O (log N). – CashCow
@NicolBolas Encontró una solución (no estoy seguro de por qué quería una nueva colección para ella) pero me preguntó si había una solución O (1) u O (log N). Sabemos que hay una solución de tiempo constante (como él mismo lo encontró), por lo que la O (log N) solo podría significar una que mantiene el orden. – CashCow