RMQ problem można rozszerzyć tak:Korzystanie binarnych indeksowane drzew o przedłużenie RMQ
Zważywszy jest tablicą n
całkowitymi A
.
zapytania (x, y) podane dwie liczby całkowite 1 ≤ x
, y
≤ n
znajdź najmniej A[x], A[x+1], ... A[y]
;
aktualizacji (x, t) podano liczbę całkowitą v
i 1 ≤ x
≤ n
do A[x] = v
. Ten problem można rozwiązać w O(log n)
dla obu operacji przy użyciu segment trees.
Jest to wydajne rozwiązanie na papierze, ale w praktyce drzewa segmentowe wiążą się z dużym obciążeniem, zwłaszcza jeśli są implementowane rekursywnie.
Wiem na pewno, że istnieje sposób rozwiązania problemu w O(log^2 n)
dla jednego (lub obu, nie jestem pewien) operacji, przy użyciu drzew indeksowanych binarnie (można znaleźć więcej zasobów, ale this i this są, IMO, najbardziej zwięzłe i wyczerpujące, odpowiednio). To rozwiązanie dla wartości n
, które pasują do pamięci, jest w praktyce szybsze, ponieważ BIT mają dużo mniej narzutów.
Jednak nie wiem, w jaki sposób struktura BIT jest używana do wykonywania danych operacji. Wiem tylko, jak go użyć do wysłania zapytania na przykład na sumę interwałową. Jak mogę go użyć, aby znaleźć minimum?
Jeśli to pomaga, mam kod napisany przez innych, który robi to, o co proszę, ale nie mogę zrozumieć tego. Oto taki kawałek kodu:
int que(int l, int r) {
int p, q, m = 0;
for(p=r-(r&-r); l<=r; r=p, p-=p&-p) {
q = (p+1 >= l) ? T[r] : (p=r-1) + 1;
if(a[m] < a[q])
m = q;
}
return m;
}
void upd(int x) {
int y, z;
for(y = x; x <= N; x += x & -x)
if(T[x] == y) {
z = que(x-(x&-x) + 1, x-1);
T[x] = (a[z] > a[x]) ? z : x;
}
else
if(a[ T[x] ] < a[ y ])
T[x] = y;
}
W powyższym kodu T
inicjowany jest 0, a
jest podana tablica, N
jego wielkość (robią indeksy od 1 do dowolnego powodu) i upd
nazywa się najpierw dla każdej wartości odczytu. Przed upd
jest wywoływana a[x] = v
jest wykonywana.
Również, p & -p
jest taki sam jak p^(p & (p - 1))
w niektórych źródłach BIT i indeksowanie rozpoczyna się od 1 z elementem zerowym zainicjowanym do nieskończoności.
Czy ktoś może wyjaśnić, jak powyższe działa lub jak mogę rozwiązać dany problem z BIT?
'for (y = x; x <= N; x + = x & -x)' to jest głębokie. BTW czym jest "T []"? BTW2: Nie jestem pewien, czy to powinno być 'dla (y = x; x
wildplasser
@wildplasser - to pierwsze 'for' jest właściwie standardem dla BIT. "T" wydaje się być tam, gdzie faktycznie przechowywane są informacje BIT. Jeśli chodzi o 'N', to jest' n' w moim opisie problemu, będę edytować to w. – IVlad