Estoy usando una cola de prioridad como programador con un requerimiento adicional. Necesito poder cancelar artículos programados. Esto equivale a eliminar un elemento del medio de la cola de prioridad.Eliminar un elemento del medio de std :: heap
No puedo usar std::priority_queue
ya que el acceso a cualquier elemento que no sea superior está protegido.
Estoy tratando de usar las funciones de montón de algorithm
. Pero todavía me falta la pieza que necesito. Cuando elimino un elemento I de la mitad del montón, quiero que se reconstruya de manera eficiente. C++ proporciona estas funciones de montón:
std::make_heap
O (3n)std::push_heap
O (lg (n))std::pop_heap
O (2 lg (n))
Quiero una nueva función como std::repair_heap
con un gran O < 3n. Le proporcionaría la ubicación del agujero donde solía residir el elemento cancelado y ajustaría correctamente el montón.
Parece ser un gran descuido el no proporcionar una función std::repair_heap
. ¿Me estoy perdiendo algo obvio?
¿Hay una biblioteca que proporcione un stl-obediente std::repair_heap
?
¿Existe una mejor estructura de datos para modelar un programador?
NOTA:
no estoy usando un std::map
por varias razones.
- Un montón tiene una carga de memoria constante.
- Un montón tiene una localidad de memoria caché impresionante.
Corrígeme si me equivoco, pero creo que tienes que llamar a 'std :: make_heap' para esto, ya que tendrás que mover elementos de todas formas. –
Solo puedo usar 'std :: make_heap'. Pero parece que debería haber una alternativa más rápida. Sospecho que 'repair_heap' podría escribirse como _O (lg (n)) _, como push y pop. Mi razonamiento es 'repair_heap' que está saliendo del centro del montón en lugar de la cabeza. –
Escribí algo así como 'repair_heap' para un problema de programación similar (no en C++) y se puede hacer. Más tarde me encontré con el mismo problema que con 'std :: priority_queue' y, finalmente, decidí que la eliminación era tan infrecuente en comparación con la inserción (posiblemente no sea cierta para ti) que acabo de copiar el montón mientras quitaba el elemento. Mi objetivo en ese caso era crear el menor código nuevo/no probado posible. –