Vì là hằng số, chúng ta có thể lưu trữ số lượng của từng phần tử trong phạm vi trong trong trong thời gian và không gian. Quan sát chính là bạn có thể tạo một mảng hai chiều trong thời gian , sau đó phạm vi truy vấn bằng cách tìm sự khác biệt trong các chỉ số trong thời gian không đổi.0 .. m 0 ≤ m < n 0 .. n O ( n k ) = O ( n ) O ( n k ) i , jk0..m0≤m<n0..nO(nk)=O(n)count[pos][elem] = occurences of 'elem' in the indices 0..pos
O(nk)i,j
Sơ chế
initialise count[pos][elem] to 0 for all elem, pos
for pos=0 to n
for num=0 to k
count[pos][num] = (0 if pos==0 else count[pos-1][num])
count[pos][arr[pos]] ++
Truy vấn
(giả sử i, j là cả hai giới hạn bao gồm)
if i == 0
return count[j][m]
else
return count[j][m] - count[i-1][m]
Nếu mảng cũng được cập nhật trong suốt quá trình truy vấn, bạn có thể sử dụng cây Fenwick (chỉ mục nhị phân) thay cho mảng. Điều này cho phép bạn cập nhật trong và truy vấn trong .O ( log n ) O ( log n )kcount
O(logn)O(logn)
Xin lỗi cho bất kỳ vấn đề với câu trả lời này, đó là lần đầu tiên của tôi.