EDIT:
Después de pensarlo somemore, un algoritmo fácil a la hora de O (n) es posible, sin necesidad de RMQ o árbol (véase la parte anterior de mi respuesta a continuación).
Dada una matriz A [1 ... n] y un ancho de ventana W, necesita encontrar el mínimo A [i, ... i + W], dado i.
Para esto, haz lo siguiente.
Dividir A [1 ... n] en bloques contiguos de tamaño W-1. B1, B2, ... B (W-1).
Para cada bloque B, mantenga dos bloques más llamados BStart y BEnd.
BSinicio [i] = mínimo de B 1, B [2], ..., B [i].
BEnd [i] = mínimo de B [W-1], B [W-2], ..., B [W-i].
Esto se puede hacer en tiempo O (W) para cada bloque y, por lo tanto, O (n) tiempo total.
Ahora dado un i, la sub-matriz A [i ... i + W] abarcará dos bloques consecutivos, digamos B1 y B2.
Encuentra el mínimo de i al final del bloque B1, y comienza del bloque B2 a i + w usando B1End y B2Start respectivamente.
Esto es O (1) tiempo, tan total O (n).
Para un conjunto circular C [1 .... n], todo lo que necesita hacer es ejecutar lo anterior en
A [1 .... 2n], que es básicamente dos copias de C concatenan juntos, es decir, A [1 ... n] = C [1 ... n] y A [n + 1 ... 2n] = C [1 ... n]
writeup Anterior.
Ok. Suponiendo que haya entendido su pregunta correctamente esta vez ...
Es posible en el tiempo O (n) y en el espacio O (n).
De hecho, es posible cambiar el tamaño de su ventana a cualquier número que desee, tenerlo diferente para diferentes elementos y seguir funcionando!
Dado un conjunto A [1 ...n], puede preprocesarse en O (n) tiempo y O (n) espacio para responder consultas de la forma: What is the position of a minimum element in the sub-array A[i...j]?
en constante tiempo!
Esto se conoce como el problema Range Minimum Query.
De manera teórica, es posible hacerlo en el tiempo O (n).
El solo uso de un árbol le dará O (nlogW) tiempo, donde W es el tamaño de la ventana y probablemente funcionará mucho mejor que RMQ, en la práctica, ya que supongo que las constantes ocultas empeorarán la RMQ.
Puede usar un árbol de la siguiente manera.
Comience hacia atrás e inserte elementos W. Encuentra el mínimo y presiona sobre una pila. Ahora borre el primer elemento e inserte (W + 1) el elemento th. Encuentra el mínimo, empuja en la pila.
Continúe de esta manera. El tiempo total de procesamiento será O (nlogW).
Al final tiene una pila de mínimos, que puede seguir apareciendo mientras camina por la matriz una segunda vez, esta vez en el orden correcto, buscando 0.95 * objetivo.
Además, su pregunta no es muy clara, usted dice que es un búfer circular, pero parece que no está haciendo una operación de módulo con la longitud. Y como está codificado, su algoritmo es O (n), no O (n^2) ya que el tamaño de su ventana es una constante.
no estoy seguro que underst y su algoritmo correcto ... ¿Cómo funciona esto? ¿Son los datos de su matriz de 0 a N o de 0 a 2N? (De tu código parece que tiene que ser 2N) –
¿Es esta tarea? Si es así, debería considerar etiquetarlo en consecuencia. –
La descripción del problema y el código no parecen describirme lo mismo. – Svante