¿Qué estructuras de datos admiten la inserción, eliminación y selección de un elemento aleatorio con un límite de complejidad de tiempo O (1) que permite duplicados?

Por “selección de un elemento aleatorio”, ¿quiere decir “verificar si un valor dado está presente en la estructura de datos” o “devolver uno de los valores de la estructura de datos al azar?” Porque esos son requisitos muy diferentes.

Suponiendo que realmente quiere decir lo primero, una tabla hash / mapa hash lo suficientemente grande con una buena función hash proporcionará (¡amortizado!) Inserción, eliminación y recuperación en tiempo constante. Si espera muchos duplicados y necesita la estructura de datos para rastrearlos, una opción sería colocar un recuento de referencia en cada entrada: establezca el recuento en 1 en la inserción inicial, incremente el recuento de una entrada si inserta el mismo valor nuevamente, disminuirlo cuando “elimine”, y solo eliminarlo realmente cuando el recuento llegue a cero. (Si no le importa volver a contar los duplicados, puede verificar primero si el valor está presente y omitir la inserción si lo está).

Si necesita un tiempo constante garantizado , necesita algo con un mapeo 1 a 1 (biyectivo) a todos sus valores posibles. Lo más simple que se me ocurre sería un mapa de bits o una matriz de punteros, con un espacio por valor posible. Para una gran cantidad de valores (como 2 ** 32), en la práctica probablemente desee una matriz dispersa con algún tipo de estructura de árbol para que pueda averiguar rápidamente si una sección completa de la matriz está vacía o no. Esto requiere una sobrecarga de O (log (número máximo de valores)) por operación, pero es una sobrecarga constante sin importar cuántos valores se hayan insertado realmente, por lo que en ese sentido sigue siendo O (1). Puede realizar un recuento como se describió anteriormente para tratar con los duplicados de seguimiento.

La estructura de datos que cumple con estas especificaciones es la tabla hash: https://en.m.wikipedia.org/wiki/

Puede realizar estas operaciones en la tabla hash: buscar, eliminar e insertar con una complejidad temporal de O (1) en el promedio. Pero en el peor de los casos, puede llevarle O (n) cuando usa la misma clave hash para almacenar muchos datos, pero es poco probable que esto suceda.

Si utilizó Python anteriormente, los dicts y OrderedDicts son implementaciones para tablas hash.

Este es un enlace muy útil
http://bigocheatsheet.com/

Lee aquí más
¿Cuál es la complejidad temporal de la tabla hash O (1)?

Y
¿Por qué la complejidad temporal de la tabla hash O (1) / O (n)?

En teoría, un hashmap uno a uno que ha preasignado memoria para todo su rango de valores podría hacer eso. Los duplicados podrían ser un problema, pero si tiene un límite establecido para los duplicados máximos permitidos y luego tiene ranuras preasignadas para ellos en su mapa hash, entonces eso funcionaría bien. No estoy seguro de cómo se produciría la eliminación, pero supongo que si eliminar uno de los valores duplicados hace que también se eliminen todas sus copias, entonces podría tener un solo indicador de invalidación en su implementación para todo el rango de duplicados

More Interesting

¿Qué proyectos usan algoritmos de redes neuronales?

¿Cómo se debe describir y hablar sobre la recursividad cuando se hace pizarra o se programa un par?

Resolví el problema de la Torre de Hanoi de una manera que no requiere conocer el movimiento anterior o siguiente. ¿Se ha hecho esto antes?

Para una computadora, ¿qué tan aleatorio es ser aleatorio?

¿Es posible cuantificar la experiencia laboral?

¿Cómo encontraron los pilotos el camino más corto, cuando volaron a larga distancia en 1950?

¿Cuál es el promotor y algoritmo SEO más importante en 2017?

¿Cuál es el algoritmo euclidiano para encontrar GCD? ¿Es un algoritmo tan bueno en términos de rendimiento y análisis de tiempo de ejecución?

¿Dónde se utilizan los algoritmos criptográficos en nuestras aplicaciones diarias?

¿Cuáles son algunos algoritmos básicos en el aprendizaje automático para que su programa aprenda de otros datos (aprendizaje supervisado)?

Cómo averiguar si existen dos elementos en una matriz ordenada cuya suma es igual a algún número predefinido

¿Cómo debo definir el orden de mi cromosoma en mi algoritmo genético?

Cómo abordar el problema 'Mapa intergaláctico' (IM) en SPOJ usando Max Flow

¿Cuáles son algunas características de los datos de imágenes faciales que se pueden utilizar para alimentar los algoritmos de aprendizaje automático?

Si dos cadenas de longitud desigual se generan por el mismo patrón, ¿cómo se relacionan sus complejidades de Kolmogorov?