Tổng tiền tố trong mảng 2D có thể thay đổi


8

Giả sử tôi có một mảng M[n][n]số nguyên 2D (trên thực tế, nhị phân là tốt, nhưng tôi nghi ngờ nó có vấn đề). Tôi quan tâm đến các truy vấn lặp lại có dạng: được cung cấp một cặp tọa độ , Tất nhiên, tất cả các giá trị này có thể được tính trong tổng thời gian và sau đó các truy vấn đó sẽ lấy . Tuy nhiên, mảng của tôi có thể thay đổi và mỗi lần tôi thay đổi một giá trị, giải pháp rõ ràng yêu cầu cập nhật .k,l

i=0k1j=0l1M[i][j]?
O(n2)O(1)O(n2)

Chúng ta có thể tạo một cây quad trên M; quá trình tiền xử lý mất và điều này cho phép chúng tôi thực hiện các truy vấn trong và cập nhật trong .O(n2log(n))O(nlog(n))O(log(n))

Câu hỏi của tôi là:

Chúng ta có thể cải thiện đáng kể các truy vấn mà không phải hy sinh quá nhiều vào các bản cập nhật không?

Tôi đặc biệt quan tâm đến việc có được cả tuyến tính hoạt động cập nhật và truy vấn, và đặc biệt là đưa cả hai vào .O(nϵ)

Chỉnh sửa: để biết thêm thông tin, mặc dù tôi nghĩ rằng vấn đề này rất thú vị ngay cả khi không có hạn chế này, tôi hy vọng sẽ thực hiện các truy vấn đại khái và về các cập nhật . Mục tiêu lý tưởng là đưa toàn bộ thời gian chạy xuống khoảng . Do đó, một tình huống trong đó một bản cập nhật mất trong khi một truy vấn mất cũng sẽ rất thú vị đối với tôi.O(n3)O(n2)O(n3+ϵ)O(nlog(n))O(log(n))


1
Với cây 2D Fenwick (còn gọi là cây BIT), bạn có thể nhận được cả cập nhật và truy vấn trong thời gian . Có một trang mô tả nó ở đây: geekforgeek.org/ . Tuyên bố miễn trừ trách nhiệm: Tôi chưa hoàn toàn hiểu cách thức hoạt động của bản thân. O(logn)
j_random_hacker

Câu trả lời:


3

Có một giải pháp tương đối đơn giản trong đó mỗi truy vấn và mỗi bản cập nhật có thể được thực hiện trong thời gian . Cấu trúc dữ liệu sử dụng không gian .O(log2n)O(n2)

Chúng ta sẽ có "độ chi tiết" của cấu trúc dữ liệu, một cho mỗi công suất của 2 sao cho . Cấu trúc dữ liệu cho độ chi tiết lưu trữ các khoản tiềnlgn2m12mn2m

i=k02m(k0+1)2m1j=0l1M[i,j]

cho mỗi . Cấu trúc dữ liệu này cho độ chi tiết có thể được biểu diễn bằng cách sử dụng các cây cân bằng (một cho mỗi giá trị có thể của ) để lưu trữ tổng tiền tố.k0,l2mn/2mk0

Bây giờ để tìm tổng tiền tố cho , chúng ta chia khoảng thành một tập hợp các khoảng có độ dài bằng hai; tối đa khoảng là cần thiết. Đối với mỗi khoảng thời gian dài , chúng tôi tìm kiếm cấu trúc dữ liệu của độ chi tiết . Do đó, các truy vấn có thể được trả lời bằng cách thực hiện tra cứu thành một cây cân bằng, mỗi truy vấn mất thời gian , trong tổng thời gian cho mỗi truy vấn.k,l[0,k1]lgn2m2mO(logn)O(logn)O(log2n)

Cập nhật cũng có thể được thực hiện trong thời gian . Để cập nhật , với mỗi độ chi tiết , bạn cập nhật cây cân bằng thích hợp trong cấu trúc dữ liệu của độ chi tiết . Đây là cập nhật các cây cân bằng ; mỗi lần như vậy mất thời gian , vì vậy tổng thời gian là thời gian .O(log2n)M[i,j]2m2mO(logn)O(logn)O(logn)O(log2n)

Cuối cùng, cấu trúc dữ liệu của độ chi tiết chứa cây, mỗi cây chiếm không gian , vì vậy tổng sử dụng không gian là .2mn/2mO(n)O(n2(1+1/2+1/4+))=O(n2)

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.