Biorąc pod uwagę tablicę liczb naturalnych , gdzie jest stałą, chcę odpowiedzieć na zapytania o formie: „ile razy pojawia się w tablicy między indeksami i ”?
Tablica powinna być wstępnie przetworzona w czasie liniowym. W szczególności chciałbym wiedzieć, czy nastąpiło ograniczenie zapytania minimalnego zakresu.
Jest to równoważne z RMQ w przypadku, gdy i chcesz zapytać o liczbę jednych w przedziale. Więc można używać go . Nie mogłem odpowiedzieć na własne pytanie z powodu ograniczeń SE.
Odpowiedzi:
Ponieważ jest stałe, możemy przechowywać liczbę każdego elementu w zakresie dla w w czas i przestrzeń. Podstawowa obserwacja polega na tym, że można utworzyć tablicę dwuwymiarową w czasie , a następnie zapytać o zakresy, znajdując różnicę wskaźników w stałym czasie.k 0..m 0≤m<n 0..n O(nk)=O(n) O(nk) i,j
count[pos][elem] = occurences of 'elem' in the indices 0..pos
Przetwarzanie wstępne
Pytanie
(przy założeniu, że i, j są granicami włącznie)
Jeśli tablica jest również aktualizowana podczas całego procesu zapytania, zamiast tablicy można użyć drzewa Fenwick (indeks binarny) . Umożliwia to aktualizację w i zapytanie w .k O(logn) O(logn)
count
Przepraszamy za wszelkie problemy z tą odpowiedzią, to moja pierwsza.
źródło