¿Puedo diseñar una estructura de datos tipo pila que haga popMin () en tiempo O (1)?

Si puede dejar que pop () / push () sea más lento que O (1), puede tener un O (1) popMin. Por ejemplo, puede mantener una pila auxiliar ordenada y agregar un solo bit “reventado” a cada elemento de almacenamiento. popMin elimina el elemento de la pila auxiliar que tiene un puntero al elemento normal de la pila, lo marca como “reventado”. Eso es O (1). El estallido normal necesita hacer estallar elementos hasta que encuentre uno que no esté marcado como reventado (y tal vez pueda argumentar que eso es tiempo constante amortizado, pero no creo que realmente lo sea).

O … puede usar una lista doblemente vinculada para organizar su pila y mantener una pila auxiliar con punteros en la pila “real”. popMin puede desvincular el elemento en la pila “real” que aparece. O (1), y el pop normal se mantendría O (1) … excepto que tiene que actualizar la pila auxiliar. Sin embargo, puede usar la misma técnica, hacer que la pila auxiliar también sea una lista doblemente vinculada.

Empujar sigue siendo costoso porque necesitas llevarlo al lugar correcto en la pila auxiliar …

Sin embargo, espero no haber hecho tu tarea.

Sí, con una implementación de pila de lista doblemente vinculada junto con una pila auxiliar ordenada.

Para implementar popMin, solo debe hacer estallar el elemento superior en la pila auxiliar ordenada. Con ese elemento en la mano, simplemente volvería a cablear sus enlaces anterior / siguiente para que desaparezca de la pila original, por ejemplo:

minItem.prev.next = minItem.next;
minItem.next.prev = minItem.prev;

Realmente hago algo similar en la producción a gran escala: aquí hay un sistema de almacenamiento en caché en memoria O (1) que construí para el nodo que utiliza un enfoque similar:

noambenami / in-memoriam

Depende de lo que quieras exactamente.

Puedes usar un montón o algo así, pero esto no será una pila, así que supongo que eso no es bueno para ti.

Pero puede tener una pila modificada, que tiene otro campo que apunta (por dirección de memoria, índice, etc.) al objeto mínimo. Si lo implementa correctamente, puede tener O (1) para pop_min, con solo una pequeña penalización de memoria.

More Interesting

¿Qué calcula este algoritmo? ¿Cuál es su funcionamiento básico? ¿Cuántas veces se ejecuta la operación básica? ¿Cuál es la clase de eficiencia de este algoritmo?

Para verificar que la lista vinculada es circular, ¿cuál será la condición del bucle? Conozco un proceso adicional como tomar dos punteros. Por favor sugiérame

Cómo aprender estructuras de datos y algoritmos de manera efectiva para que pueda ser mejor en la programación competitiva a nivel principiante

Supongamos que tenemos una matriz 8 * 8. Cada celda tiene 0 o 1. Se le dará una ubicación y deberá encontrar todas las que se encuentran en la misma isla. ¿Los puntos se encuentran en la misma isla si un punto está en alguna de las celdas adyacentes?

¿Cuál es el algoritmo de aprendizaje de Quora para su suministro de noticias?

¿Por qué usamos el árbol de búsqueda binario?

¿Está roto el algoritmo de clasificación de Java y Python?

Cómo comenzar a aprender algoritmos y estructuras de datos desde cero

¿Hay algo en el universo que no sea algorítmico?

¿Cuáles son los 30 algoritmos más importantes que debe conocer para la programación competitiva?

¿Cuál es el inverso matemático de 2 ^ N?

¿Cuántas estructuras de datos y algoritmos necesita el desarrollador web?

¿Se utilizan las señales sociales en los algoritmos de clasificación de motores de búsqueda?

¿Qué algoritmos de minería de datos puedo usar para maximizar las ganancias de una compañía de tarjetas de regalo que almacena ventas, pedidos y datos de clientes en una base de datos relacional?

En Codeforces Round # 308 (Div. 2), ¿cómo descubrieron todos la cantidad de dígitos de un número usando un algoritmo eficiente de toma de tiempo? ¿Alguien puede explicarlo?