Si su operación de búsqueda es relativamente infrecuente (y su montón bastante pequeño), simplemente haría una búsqueda lineal. Si es relativamente frecuente, o el montón es enorme, considere rastrear la membresía de heap (para hacer su prueba de "búsqueda") con una estructura de datos separada o una bandera de objeto. La alegría de la indexación externa es poder colocar su objeto en tantos contenedores como desee.
Si con 'Buscar' quiere decir 'buscar y modificar' (me parece que a menudo necesito eliminar cosas de las colas de prioridad independientemente de la típica inserción/del-min), aquí hay tres enfoques que he usado:
Dada una alta tasa de inserción/del-min (100k/s continuo) y una baja tasa de búsqueda-eliminación (digamos 1/s) en un conjunto de trabajo bastante pequeño (500-1000) Hice una búsqueda lineal para el elemento y luego lo eliminó del árbol de la manera estándar.
Teniendo en cuenta una alta tasa de inserción/del-min más bastante frecuentes de búsqueda y eliminación, simplemente marqué los objetos eliminados como "poco interesantes" después de encontrarlos indirectamente. La real libre se difirió hasta que el objeto fue quitado de la cola como de costumbre.
Dado un pequeño std :: priority_queue (que no tiene métodos de acceso fuera de insert/del-min) de solo algunos elementos y eliminaciones bastante infrecuentes, acabo de copiar toda la cola a un std :: vector temporal y copié la parte modificada/deseada vuelve a la cola. Entonces lloré para dormir.
"en promedio haré más insertos que borrados" - ¿eso es realmente lo que quiso decir? Si ese es el caso, eventualmente agotarás la memoria, ¿no? – paxdiablo
la cola de prioridad es para un algoritmo de búsqueda de ruta. Cuando alcanzo mi objetivo, puedo eliminar los restos de la cola de prioridad sin ningún tipo de reequilibrio. – Harry
@paxdiablo - al revés es simplemente imposible ... no todos los programas son de larga duración – tobyodavies