¿Cuál es la mejor estructura y algoritmo de datos para encontrar un valor máximo dentro de un subconjunto de una población de datos que satisfaga alguna condición de rango?

Un árbol de búsqueda binaria con equilibrio automático es una solución simple y eficiente para este problema. Existen varias estructuras de datos específicas que implementan árboles de búsqueda binarios de equilibrio automático. Consulte el artículo de Wikipedia: http://en.wikipedia.org/wiki/Sel…. Cualquiera de ellos debería estar bien.

Específicamente, en cualquier momento tiene aproximadamente 15 * 60 * 500 = 450000 precios actuales. Varios cientos de veces por segundo, quieres
(a) inserte un nuevo precio
(b) elimine un precio anterior que acaba de llegar a los 15 minutos
(c) busque el precio más alto por debajo de algún umbral.
Cada una de estas operaciones lleva tiempo [math] O (\ log (n)) [/ math] en un árbol de tamaño [math] n [/ math]; aquí [math] \ log (n) = 19 [/ math] aproximadamente, por lo que deberían tomar una pequeña fracción de milisegundo.

Para facilitar (b), querrá una manera de identificar eficientemente el precio más antiguo para poder eliminarlo; simplemente mantener todos los precios en un buffer de anillo hace el trabajo. El anillo de búfer y el árbol ocupan espacio [matemático] O (n) [/ matemático], por lo que tal vez decenas de megabytes en total, menos si pones esfuerzo en ese aspecto.

Depende de algunas cosas:

1) Tasa de adición / eliminación de datos.
2) Tasa a la que las consultas son problemas
3) Rango de los datos, que en su caso son los precios de una mercancía. Suponiendo que son de la misma entidad, dudo si cambiaría mucho

Para 1) hay una compensación natural entre mantener una cola y escaneo secuencial o un BST de auto-equilibrio y borrar periódicamente.

Para 2) En caso de una tasa de consulta extremadamente alta, tendría sentido almacenar en caché los resultados sobre cualquier estructura de datos utilizada.

Para 3) Si el rango de datos no es muy grande, se podría mantener una granularidad fija de rangos, por ejemplo en un hashmap (digamos H) donde la clave sería rangos y valores sería el par del precio real y la marca de tiempo. El mejor precio para el comienzo. Ahora, cada vez que se realiza una actualización u, H se actualiza en la posición apropiada si u es mejor (precio más alto y punto de tiempo válido … su restricción de 15 minutos) que el valor establecido anteriormente.

Las consultas son búsquedas constantes con un poco de compromiso en la precisión.