Cấu trúc dữ liệu để cập nhật về các khoảng và số truy vấn của số không


13

Tôi đang tìm kiếm một cấu trúc dữ liệu sẽ duy trì một bảng số nguyên có kích thước và cho phép các hoạt động sau trong thời gian .tnO(logn)

  • increase(a,b) , làm tăng .t[a],t[a+1],,t[b]
  • decrease(a,b) , làm giảm .t[a],t[a+1],,t[b]
  • support() , trả về số chỉ số sao cho .Tôit[Tôi]0

Bạn có một lời hứa rằng mọi cuộc gọi giảm có thể được khớp với cuộc gọi trước để tăng với cùng tham số . Ứng dụng tôi có trong đầu là một thuật toán quét để tính toán thời gian diện tích hợp của n hình chữ nhật trực tuyến đã cho.một,bÔi(nđăng nhậpn)

Một cây tứ giác sẽ có kích thước , vì vậy nó không phải là một giải pháp. Cây Fenwick hoặc Interval có hương vị phù hợp, nhưng tôi không thấy cách mở rộng chúng để hỗ trợ các hoạt động ở trên.Θ(n2)


Cây Fenwick sẽ không sử dụng lời hứa rằng "mọi cuộc gọi giảm có thể được khớp với cuộc gọi trước để tăng với cùng tham số a, b", vì vậy có thể có một giải pháp đơn giản hơn bằng cách sử dụng lời hứa đó (nhưng hiện tại nó đã thoát khỏi tôi).
Jeremy

Vì số lượng đầu vào bạn có thể có nhiều nhất là (bạn có thể phát hiện các lần lặp và không chèn vào cấu trúc dữ liệu), chúng tôi vẫn nhận được hiệu suất O ( log n ) bằng cách sử dụng cấu trúc dữ liệu cây đo lường chung. Xem cosy.sbg.ac.at/~ksafdar/data/cifts/SeminarADS/ đá trượt 47-52. n2Ôi(đăng nhậpn)
Chao Xu

Jérémie và Chao Xu. Cảm ơn ý kiến ​​của bạn. Bây giờ tôi đã hiểu làm thế nào Cây thời gian có thể được sử dụng để duy trì tổng chiều dài của sự kết hợp của một tập các khoảng thay đổi. Đây thực tế là một cơ sở hạ tầng rất dễ thương.
Christoph Dürr

Đối với bài toán cấu trúc dữ liệu chung, việc tìm kiếm trong thời gian yêu cầu không gian O ( p ) O ( n 2 ) trong đó p là kích thước của danh sách các cặp tọa độ hoạt động. Nhưng thực sự đối với thuật toán quét p O ( n ) nên không gian vẫn tuyến tính. Vấn đề vẫn mở cho cấu trúc dữ liệu có không gian tốt hơn O ( p ) , khi pđăng nhập(n2)Ôi(đăng nhập(n))Ôi(p)Ôi(n2)ppÔi(n)Ôi(p) . pω(n)
Jeremy

2
Đây là một liên kết tuyệt vời nơi bạn có thể kiểm tra việc triển khai của mình với các giải pháp khác cho cùng một vấn đề: spoj.com/OI/probols/NKMARS
Erel Segal-Halevi

Câu trả lời:


2

Sử dụng cây phân đoạn - phân vùng đệ quy của phạm vi thành các phạm vi nhỏ hơn. Mỗi khoảng [ a , b ] của các hoạt động cập nhật của bạn có thể được phân vùng thành O ( log n ) của các phạm vi trong phân vùng đệ quy này. Đối với mỗi phạm vi [ x , y ] lưu trữ:[1,n][một,b]Ôi(đăng nhậpn)[x,y]

  • Số của các khoảng [ a , b ] đã được tăng và không giảm sao cho [ x , y ] là một trong các phạm vi mà [ a , b ] được phân vùngc(x,y)[một,b][x,y][một,b]
  • Số của các ô không được bao phủ bởi các tập hợp con được phân vùng của các khoảng nằm ở [ x , y ] hoặc thấp hơn trong đệ quybạn(x,y)[x,y]

Sau đó, nếu được phân chia đệ quy thành [ x , z ][ z + 1 , w ] ta có u ( x , y ) = { 0 nếu  c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) nếu không[x,y][x,z][z+1,w]

bạn(x,y)= ={0nếu c(x,y)>0bạn(x,z)+bạn(z+1,y)nếu không thì
để chúng tôi có thể cập nhật từng giá trị trong thời gian không đổi khi dữ liệu khác cho một phạm vi thay đổi. Mỗi truy vấn hỗ trợ có thể được trả lời bằng cách nhìn vào u ( 1 , n ) .bạn(x,y)bạn(1,n)

Để thực hiện thao tác tăng , phân vùng [ a , b ] thành các phạm vi O ( log n ) , tăng c ( x , y ) cho từng phạm vi này và sử dụng công thức trên để tính lại u ( x , y ) cho mỗi phạm vi này và từng tổ tiên của chúng. Các hoạt động giảm là như nhau với một giảm thay vì tăng.(một,b)[một,b]Ôi(đăng nhậpn)c(x,y)bạn(x,y)


Tôi không nghĩ rằng tôi hiểu viên đạn thứ hai của bạn. Trong cây con có rot có nhãn , những ô nào không được bao phủ bởi các tập hợp con được phân chia theo khoảng tại [ x , y ] ? Không phải toàn bộ phạm vi [ x , y ] được bao phủ, vì vậy u ( x , y ) = 0 ? [x,y][x,y][x,y]bạn(x,y)= =0
jbapple

Nó phụ thuộc vào việc tăng hoạt động bạn đã thực hiện. Ban đầu tất cả chúng đều không được phát hiện, nhưng khi bạn tăng một khoảng nhỏ trong (hoặc bất kỳ khoảng nào bắt đầu hoặc kết thúc trong [ x , y ] hoặc bao gồm [ x , y ] trong phân vùng của nó) thì nó sẽ giảm. [x,y][x,y][x,y]
David Eppstein

Bạn có thể cho một ví dụ?
jbapple

Giả sử khoảng của bạn là các số [1,8]. Nó được chia đệ quy thành [1,4], [4,8], sau đó [1,2], [3,4], [5,6] và [7,8], sau đó tất cả các phạm vi một yếu tố. Ban đầu, mọi thứ đều được khám phá, tất cả c [x, y] = 0 và mỗi phạm vi có u = chiều dài của nó. Nhưng sau đó, giả sử bạn thực hiện thao tác tăng [2,6]. Phạm vi tối đa O (log n) trong đó [2,6] có thể được phân tách là [2,2], [3,4] và [5,6], vì vậy chúng tôi đặt c [x, y] cho ba phạm vi đến 1. Theo công thức trong câu trả lời của tôi, điều này khiến u [x, y] cho ba phạm vi này cũng trở thành 0. u [1,2] trở thành 1, u [1,4] cũng trở thành 1, u [ 5,8] = 2 và u [1,8] = 1 + 2 = 3
David Eppstein

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.