Các RMQ problem thể được mở rộng như vậy:Sử dụng cây nhị phân lập chỉ mục cho một phần mở rộng RMQ
Do là một mảng số nguyên n
A
.
truy vấn (x, y): cho hai số nguyên 1 ≤ x
, y
≤ n
, tìm ra tối thiểu là A[x], A[x+1], ... A[y]
;
cập nhật (x, v): đưa ra một số nguyên v
và 1 ≤ x
≤ n
làm A[x] = v
.
Sự cố này có thể được giải quyết trong O(log n)
cho cả hai hoạt động sử dụng segment trees.
Đây là giải pháp hiệu quả trên giấy, nhưng trên thực tế, phân khúc cây liên quan đến rất nhiều chi phí, đặc biệt nếu được triển khai đệ quy.
Tôi biết thực tế rằng có một cách để giải quyết vấn đề trong O(log^2 n)
cho một (hoặc cả hai, tôi không chắc) về hoạt động, sử dụng cây được lập chỉ mục nhị phân (có thể tìm thấy nhiều tài nguyên hơn, nhưng this và this là IMO, ngắn gọn và đầy đủ nhất, tương ứng). Giải pháp này, cho các giá trị của n
phù hợp với bộ nhớ, nhanh hơn trong thực tế, vì BIT có chi phí thấp hơn rất nhiều.
Tuy nhiên, tôi không biết cấu trúc BIT được sử dụng như thế nào để thực hiện các thao tác đã cho. Tôi chỉ biết cách sử dụng nó để truy vấn một khoảng thời gian ví dụ. Làm thế nào tôi có thể sử dụng nó để tìm tối thiểu?
Nếu nó giúp, tôi có mã mà người khác đã viết để làm những gì tôi yêu cầu, nhưng tôi không thể hiểu được. Dưới đây là một mảnh như mã:
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;
}
Trong đoạn mã trên, T
được khởi tạo bằng 0, a
là mảng nhất định, N
kích thước của nó (họ làm chỉ mục từ 1 vì lý do gì) và upd
được gọi tại đầu tiên cho mọi giá trị đọc. Trước khi upd
được gọi là a[x] = v
được thực hiện.
Ngoài ra, p & -p
cũng giống như p^(p & (p - 1))
trong một số nguồn BIT và lập chỉ mục bắt đầu từ 1 với phần tử 0 được khởi tạo thành vô hạn.
Bất cứ ai có thể giải thích cách thức hoạt động ở trên hoặc cách tôi có thể giải quyết vấn đề đã nêu với BIT?
'cho (y = x; x <= N; x + = x & -x)' cái này sâu. BTW 'T []' là gì? BTW2: Tôi không chắc chắn nếu điều này nên được 'cho (y = x; x
wildplasser
@wildplasser - rằng 'for' đầu tiên thực sự khá chuẩn đối với BIT. 'T' có vẻ là nơi mà thông tin BIT thực sự được giữ lại. Đối với 'N', đó là' n' trong câu lệnh vấn đề của tôi, tôi sẽ sửa nó trong. – IVlad