¿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 [matemática] O (1) [/ matemática]?

Usando una combinación de una tabla hash ([matemática] O (1) [/ matemática] inserción y eliminación en promedio) y una matriz ([matemática] O (1) [/ matemática] acceso aleatorio).

Inserción: Agregue x al final de su matriz. Hash x => longitud (matriz) -1

Eliminación: esto es más complicado. Obtenga el valor de x del hash, que se estableció en su índice en la matriz. Cambie el valor en ese índice en la matriz con el último. Eliminar el último elemento en la matriz. Eliminar x del hash.

Aleatorio: la matriz le indicará su longitud, n. Elija un int [math] [0, n) [/ math] aleatorio y acceda al elemento de matriz correspondiente.

Todas las operaciones mencionadas (agregar a la matriz, poner hash, obtener hash, intercambiar matrices, eliminar matriz al final, eliminar de hash, longitud de la matriz, acceso a la matriz) son, en promedio, de tiempo constante.

Sin embargo, recuerde que las colisiones de hash son [matemáticas] O (n) [/ matemáticas] en el peor de los casos.

Con la ayuda de la tabla Hash y la lista enlazada doblemente , podemos realizar las tres operaciones en tiempo O (1), pero la complejidad del peor caso dependerá de la función hash subyacente.

Inserción: inserte en una lista doblemente vinculada y almacene la dirección en una tabla hash. O (1)

Eliminación: obtenga la dirección del nodo de la lista doblemente vinculada de la tabla hash y elimínela de la lista doblemente vinculada. O (1)

Selección: Al usar la tabla hash, la selección se puede hacer en O (1), generando un número aleatorio de [0 … hash.size ()].

La ventaja de una lista doblemente vinculada sobre una matriz (tamaño fijo) es que no tenemos que preocuparnos por el tamaño.

Estructura de datos con tabla hash H y una matriz A. Las claves de tabla hash son los elementos en la estructura de datos, y los valores son sus índices en la matriz.

  1. insert (value) : agrega el valor a la matriz y deja que sea su índice en A. Establece H [valor] = i.
  2. eliminar (valor) : vamos a reemplazar la celda que contiene el valor en A con el último elemento en A. dejemos que ‘l’ sea el último elemento en la matriz A en el índice k. permítame ser H [valor], el índice en la matriz del valor que se eliminará. Establezca A [i] = l, H [l] = i, disminuya el tamaño de la matriz en uno y elimine el valor de H.
  3. contiene (valor): devuelve H.contains (valor)
  4. getRandomElement (): let r = random (tamaño actual de A). devuelve A [r].

Fuente: http://stackoverflow.com/questio