¿Cuál es la complejidad de tiempo en el peor de los casos para la eliminación en una cola?

He escrito un tutorial completo sobre Colas que cubren diferentes implementaciones usando Array, Listas vinculadas y Arreglo de redimensionamiento.

Para resumir, para matrices y listas vinculadas:

Tiempo → Con la Lista enlazada, las operaciones ( poner en cola, poner en cola y vacío ) toman tiempo constante; O (1) , pero todavía no es tan eficiente debido a la declaración del objeto y al manejo de enlaces. Mientras que con las matrices, acceder a las matrices es mucho más rápido; Se necesita O (1) .

Memoria → Listas vinculadas requiere más memoria debido al tamaño de los objetos de nodo (consulte la figura a continuación). Mientras que con las matrices requiere menos espacio de memoria.

Supongo que en el caso de la matriz, debe pasar el tamaño de la matriz al constructor. En muchas situaciones, no podemos saber qué tan grande es, y esto viola la idea de la pila y la cola, que dice que debería poder crecer y reducirse en cualquier tamaño.

Para cambiar el tamaño de la matriz:

Tiempo → El peor de los casos es O (N) para insertar y eliminar, porque es posible que necesitemos cambiar el tamaño de la matriz. El caso amortizado y el mejor caso es O (1) para ambas operaciones. El caso promedio toma un tiempo constante para insertar (al final) y eliminar el último elemento.


Compromisos: Lista enlazada vs matriz de cambio de tamaño

No voy a incluir la matriz con tamaño fijo en la comparación, como ya se mencionó que viola la idea tanto para las pilas como para las colas.

Lista vinculada → Garantiza que cada operación llevará un tiempo constante en el peor de los casos. Pero utiliza tiempo y espacio extra para lidiar con la creación de objetos y enlaces.

Matrices redimensionadas → Cada operación requiere O (1) tiempo amortizado y se necesita menos espacio.

La conclusión es: si desea asegurarse de que cada operación llevará un tiempo constante, utilice la lista vinculada.

Sin embargo, si solo le importa la cantidad de tiempo total, use la matriz de cambio de tamaño, porque aunque puede ser más lenta cuando hay operaciones de cambio de tamaño, pero el tiempo total será menor, porque las operaciones individuales son rápidas.

¡Espero eso ayude!

A2A!

Las colas pueden implementarse como un tipo de datos separado, o pueden considerarse un caso especial de una cola de doble extremo (de-cola) y no implementarse por separado. Por ejemplo, empujando y haciendo estallar una matriz desde ambos extremos, para que uno pueda usar las funciones de empujar y cambiar para poner en cola y quitar una lista (o, a la inversa, puede usar unshift y pop ), aunque en algunos casos estas operaciones No son eficientes.

La complejidad de tiempo para la inserción es O (1) [matemática] O (1) [/ matemática] mientras que la eliminación es O (n) [matemática] O (n) [/ matemática] (en el peor de los casos) para una sola operación. Los costos amortizados para ambos son O (1) [matemática] O (1) [/ matemática] ya que tener que eliminar n [matemática] n [/ matemática] elementos de la cola todavía toma O (n) [matemática] O (n ) [/ math] tiempo.

Lo anterior supone que su implementación es una pila llamada In para insertar nuevos elementos y una pila llamada Out de la que recuperaremos elementos para su eliminación. Como solo agregamos nuevos elementos a In, solo necesitamos un solo push () para la inserción. Esto da el costo de tiempo anterior. Para las eliminaciones, si Out está vacío, haga estallar () todo desde In y empuje () hacia Out. Luego pop () el elemento superior para devolver. Esto es O (n) [matemáticas] O (n) [/ matemáticas]. Si Out no está vacío, solo pop () su elemento superior. Esto da el peor de los casos O (n) [matemática] O (n) [/ matemática] pero amortiza O (1) [matemática] O (1) [/ matemática].