EDIT:
Po tym myśleć somemore, łatwym O (n) algorytm czas jest to możliwe, bez potrzeby RMQ lub drzewa (patrz poprzednia część mojej odpowiedzi poniżej).
Biorąc tablicę A [1 ... n] i szerokość okna W, należy znaleźć minimum A [i, ... i + W], biorąc pod uwagę, i.
W tym celu wykonaj następujące czynności.
Podziel A [1 ... n] na sąsiednie bloki o rozmiarze W-1. B1, B2, ... B (W-1).
Dla każdego bloku B należy zachować jeszcze dwa bloki o nazwach BStart i BEnd.
BStart [i] = minimum B 1, B [2], ..., B [i].
BEnd [i] = minimum B [W-1], B [W-2], ..., B [W-1].
Można to zrobić w czasie O (W) dla każdego bloku, a więc O (n) całkowitego czasu.
Teraz podana wartość i, tablica podrzędna A [i ... i + W] będzie obejmowała dwa kolejne bloki, na przykład B1 i B2.
Znajdź minimum od i do końca bloku B1 i rozpocznij blok B2 do i + w, używając odpowiednio B1End i B2Start.
To jest czas O (1), więc całkowite O (n).
kolistego tablicy C [1 .... n] Wszystko, co trzeba zrobić, to uruchomić powyżej na
A [2n .... 1], który jest w zasadzie dwie kopie C łączone razem tj [1 ... n] = C [1 ... n] oraz [n + 1 ... 2 n] = C [1 ... n]
Poprzednie writeup.
Ok. Zakładając, że tym razem dobrze zrozumiałem twoje pytanie ...
Jest to możliwe w czasie O (n) i O (n).
W rzeczywistości istnieje możliwość zmiany rozmiaru okna na dowolną liczbę, która ma być różna dla różnych elementów i nadal działa!
Otrzymano tablicę A [1 ...n], może być wstępnie przetworzony w przestrzeni O (n) i O (n), aby odpowiedzieć na pytania w formularzu: What is the position of a minimum element in the sub-array A[i...j]?
w stała czas!
Nazywa się to problemem o numerze Range Minimum Query.
Teoretycznie można to zrobić w czasie O (n).
Wystarczy użyć drzewa, aby uzyskać czas O (nlogW), gdzie W jest wielkością okna i prawdopodobnie będzie działało znacznie lepiej niż RMQ, w praktyce, ponieważ oczekuję, że ukryte stałe mogą pogorszyć RMQ.
Możesz użyć drzewa w następujący sposób.
Zacznij od tyłu i wstaw elementy W. Znajdź minimum i wciśnij na stos. Teraz usuń pierwszy element i wstaw (W + 1) th element. Znajdź minimum, naciśnij stos.
Kontynuuj w ten sposób. Całkowity czas przetwarzania będzie wynosił O (nlogW).
Na końcu masz stos minimów, które możesz po prostu odpaść, gdy będziesz teraz chodził po tablicy drugi raz, tym razem we właściwej kolejności, szukając 0,95 * celu.
Ponadto, twoje pytanie nie jest całkiem jasne, mówisz, że jest to bufor cykliczny, ale wydaje się, że nie robisz operacji modulus z długością. I tak jak zakodowany, twój algorytm to O (n), nie O (n^2), ponieważ rozmiar twojego okna jest stały.
nie pewny ja underst i twój algorytm jest właściwy ... jak to działa? czy dane twojej tablicy od 0 do N czy od 0 do 2N? (z twojego kodu wygląda na to, że musi być 2N) –
Czy to praca domowa? Jeśli tak, powinieneś rozważyć odpowiednie oznaczenie. –
Opis problemu i kod nie wydają mi się opisywać tego samego. – Svante