Tiền xử lý một mảng để đếm một phần tử trong một lát (giảm xuống RMQ?)


11

Cho một mảng của số tự nhiên , trong đó là hằng số, tôi muốn trả lời trong các truy vấn có dạng: " xuất hiện bao nhiêu lần trong mảng giữa các chỉ số và "?a1,,ankkO(1)mij

Các mảng nên được xử lý trước trong thời gian tuyến tính. Cụ thể tôi muốn biết liệu có giảm bớt Truy vấn Tối thiểu Phạm vi không.


Điều này tương đương với RMQ trong trường hợp và bạn muốn truy vấn số lượng trong một khoảng. Vì vậy, chúng ta có thể sử dụng . Tôi không thể trả lời câu hỏi của riêng mình vì giới hạn của SE.k=1


Bạn có thể giảm sự khác biệt của yếu tố đối với vấn đề của bạn (trong thời gian tuyến tính). Có lẽ nói về một mô hình là theo thứ tự?
Aryabhata

@Aryabhata vấn đề chính xác yếu tố gì? Bây giờ tôi đang đọc bài này: vi.wikipedia.org/wiki/Range_Queries
andy

Điều này dễ dàng hơn nhiều so với RMQ. Gợi ý: Vì k là hằng số, tiền xử lý có thể dành thời gian tỷ lệ thuận với kn và nó vẫn được tính là thời gian tuyến tính.
Tsuyoshi Ito

@Aryabhata: Việc giảm mà tôi nghĩ bạn đang nói đến không hoạt động vì k là một hằng số trong vấn đề này.
Tsuyoshi Ito

Chỉ trong trường hợp, nếu mảng được đưa ra ở đầu và không được cập nhật sau đó, thì RMQ là một mức độ quá mức, như tôi đã đề xuất trong bình luận trước đó.
Tsuyoshi Ito

Câu trả lời:


4

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..m0m<n0..nO(nk)=O(n)count[pos][elem] = occurences of 'elem' in the indices 0..posO(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 )kcountO(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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.