Szukam struktury danych, która utrzymywałaby tablicę liczb całkowitych o rozmiarze , i pozwalała na następujące operacje w czasie .
- , który zwiększa .
- , co zmniejsza .
- , która zwraca liczbę indeksów takich, że .
Obiecujesz, że każde połączenie do zmniejszenia można dopasować do poprzedniego połączenia, aby zwiększyć przy tych samych parametrach . Aplikacja, o której myślę, to algorytm linii prostej do obliczania w czasie obszaru zjednoczenia n danych prostokątów prostoliniowych.
Drzewo quad miałoby rozmiar , więc nie jest to rozwiązanie. Drzewa Fenwick lub Interval mają odpowiedni smak, ale nie widzę, jak je rozszerzyć, aby wspierały powyższe operacje.
ds.data-structures
cg.comp-geom
Christoph Dürr
źródło
źródło
Odpowiedzi:
Użyj drzewa segmentów - rekurencyjnej partycji zakresu na mniejsze zakresy. Każdy przedział operacji aktualizacji można podzielić na zakresów w tej partycji rekurencyjnej. Dla każdego zakresu przechowuj:[ a , b ] O ( log n ) [ x , y ][1,n] [a,b] O(logn) [x,y]
Następnie, jeśli jest rekurencyjnie podzielony na i , mamy dzięki czemu możemy aktualizować każdą wartość w stałym czasie, gdy inne dane dla zakres się zmienia. Na każde zapytanie wsparcia można odpowiedzieć, patrząc na .[ x , z ] [ z + 1 , w ] u ( x , y ) = { 0, jeśli c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) w przeciwnym razie u ( x , y ) u ( 1[x,y] [x,z] [z+1,w]
Aby wykonać operację zwiększenia , podziel na zakresy , zwiększ dla każdego z tych zakresów i użyj powyższego wzoru, aby ponownie obliczyć dla każdego z tych zakresów i każdego z ich przodków. Operacja zmniejszania jest taka sama z dekrementacją zamiast inkrementem.[ a , b ] O ( log n ) c ( x , y ) u ( x , y )(a,b) [a,b] O(logn) c(x,y) u(x,y)
źródło
Możesz obsłużyć i w i w czasie . spadek O ( √increase decrease obsługujeO(1)O(n−−√logn) support O(1) Kluczową ideą jest podzielenie tabeli na grupy o rozmiarze . Następnie każda operacja modyfikująca ( lub ) działa na co najwyżej grupach i tylko tych na końcu zakresu ( i , w twoim sformułowaniu) weź czas.zwiększyćspadekO( √Θ(n−−√) increase decrease abω(logn)O(n−−√) a b ω(logn)
źródło