РЕДАКТИРОВАТЬ:
Подумав об этом, возможен простой алгоритм O (n) времени, без необходимости RMQ или дерева (см. Предыдущую часть моего ответа ниже).
Учитывая массив A [1 ... n] и ширину окна W, вам нужно найти минимум A [i, ... i + W], учитывая i.
Для этого вы делаетеследующее.
Разделить A [1 ... n] на смежные блоки размера W-1.B1, B2, ... B (W-1).
Для каждого блока B сохраните еще два блока, называемых BStart и BEnd.
BStart [i] = минимум B 1 , B [2], ..., B [i].
BEnd [i] = минимум B [W-1], B [W-2], ..., B [Wi].
Это может быть сделано за O (W) время для каждого блока, и, таким образом, O (n) всего времени.
Теперь с учетом i, подмассива[I ... i + W] будет охватывать два последовательных блока, скажем, B1 и B2.
Найти минимум от i до конца блока B1 и начать от блока B2 до i + w, используя B1End иB2Start соответственно.
Это время O (1), поэтому всего O (n).
Для кругового массива C [1 .... n] все, что вам нужно сделать, этозапустите приведенное выше для
A [1 .... 2n], который в основном состоит из двух копий C, соединенных вместе, то есть A [1 ... n] = C [1 ... n] и A [n + 1 ... 2n] = C [1 ... n]
Предыдущая запись.
ОК.Предполагая, что я правильно понял ваш вопрос в этот раз ...
Это возможно в O (n) времени и O (n) пространстве.
На самом деле можно изменить ваше окноразмер к любому числу, которое вам нравится, иметь разные для разных элементов и все еще работать!
Учитывая массив A [1 ... n], он может быть предварительно обработан за O (n) времени и O (n) пробел для ответа на запросы вида: What is the position of a minimum element in the sub-array A[i...j]?
в константа время!
Это называется Минимальный диапазон запросов Проблема.
Так что теоретически это можно сделать за O (n) раз.
Простое использование дерева даст вам время O (nlogW), где W - размер окна и, вероятно, на практике будет работать намного лучше, чем RMQ, так как я ожидаю, что скрытые константы могут ухудшить RMQ.
Вы можете использовать дерево следующим образом.
Начать задом наперед и вставить элементы W.Найдите минимум и нажмите на стек.Теперь удалите первый элемент и вставьте (W + 1) -й элемент.Найдите минимум, нажмите на стек.
Продолжайте в том же духе.Общее время обработки будет O (nlogW).
В конце у вас будет стек минимумов, который вы можете просто отбрасывать, пока вы во второй раз обходите массив, на этот раз в правильном порядке,поиск цели 0,95 *.
Кроме того, ваш вопрос не совсем ясен, вы говорите, что это кольцевой буфер, но вы, похоже, не выполняете операцию модуля с длиной.И как закодировано, ваш алгоритм O (n), а не O (n ^ 2), поскольку размер вашего окна является константой.