Necesito escribir un RandomQueue que permita anexos y eliminación aleatoria en tiempo constante (O (1)).
Mi primer pensamiento fue respaldarlo con algún tipo de Array (elegí una ArrayList), ya que las matrices tienen acceso constante a través de un índice.
Sin embargo, al revisar la documentación, me di cuenta de que las adiciones de ArrayLists se consideran tiempo constante amortizado, ya que una adición puede requerir una reasignación de la matriz subyacente, que es O (n).
¿Son el tiempo constante amortizado y el tiempo constante efectivamente iguales, o necesito mirar alguna estructura que no requiera una reasignación completa en cada adición?
Estoy preguntando esto porque, aparte de las estructuras basadas en matrices (que, hasta donde yo sé, siempre tendrán adiciones de tiempo constante amortizado), no puedo pensar en nada que cumpla con los requisitos:
- Cualquier cosa basada en un árbol tendrá, en el mejor de los casos, O (log n)
- Una lista vinculada podría tener adiciones de O (1) (si se mantiene una referencia a la cola), pero una eliminación aleatoria debería ser, en el mejor de los casos, O (n).
Aquí está la pregunta completa; en caso de que haya visto algunos detalles importantes:
Diseñar e implementar un RandomQueue. Esta es una implementación de la interfaz de cola en la que la operación remove () elimina un elemento que se elige de manera uniforme al azar entre todos los elementos actualmente en la cola. (Piense en un RandomQueue como una bolsa en la que podemos agregar elementos o alcanzar y eliminar ciegamente algún elemento aleatorio). Las operaciones add (x) y remove () en un RandomQueue deben ejecutarse en tiempo constante por operación.
1/a
posibilidad de una operación O (n)), pero crecer en un factor constante a > 1
es O (1) amortizado para la suma: tenemos la (1/a)^n
posibilidad de una O (n) operación, pero esa probabilidad se aproxima a cero para grande n
.