Hiển thị rằng các truy vấn tổng hợp trên một mảng nhị phân không thể được thực hiện bằng cách sử dụng không gian tuyến tính và thời gian không đổi


8

Bạn được cung cấp một mảng nhị phân -sized .n

Tôi muốn chỉ ra rằng không có thuật toán nào có thể làm như sau (hoặc phải ngạc nhiên và tìm ra rằng các thuật toán đó tồn tại sau tất cả):

1) Xử lý trước mảng đầu vào bằng thời gian không giới hạn, nhưng chỉ sử dụng các bit .O(n)

2) Trả lời các truy vấn trong thời gian không đổi, trong đó truy vấn yêu cầu số lượng bit được đặt giữa chỉ số và chỉ mục trong mảng.x y(x,y)xy

Dường như thời gian không đổi trên mỗi truy vấn không cho phép thuật toán đọc đủ thông tin để tính toán số bit được đặt.

Làm thế nào chúng ta có thể chứng minh rằng không có thuật toán như vậy tồn tại?

Một câu hỏi tổng quát hơn sẽ là,

cho rằng thuật toán được phép sử dụng không gian , chúng ta có thể rút ra được ràng buộc nào thấp hơn về thời gian truy vấn?f(n)

Rõ ràng, nếu chúng ta có không gian chúng ta có thể lưu trữ tất cả các khoản tiền một phần và trả lời các truy vấn trong , nhưng nếu nhỏ hơn thì sao?O ( 1 ) ff=Ω(nlogn)O(1)f


Bạn có thể giả sử rằng kích thước của một từ bộ nhớ là và chúng ta có thể đọc các chỉ số trong thời gian không đổi.x , yΘ(logn)x,y


@ EmilJeřábek - Tôi muốn thuật toán sử dụng các bit (tuyến tính ở kích thước đầu vào), chứ không phải các từ bộ nhớ . Liệu nó có ý nghĩa? O ( n )O(n)O(n)
RB

2
Tôi thấy, cảm ơn đã làm rõ. Bây giờ, một câu hỏi khác: những hoạt động bạn có thể làm trong thời gian liên tục trên các từ bộ nhớ? Đây là một thuật toán ứng cử viên: chia mảng trong các khối có kích thước và với mỗi khối , lưu trữ nội dung của dưới dạng một từ và đếm số bit được đặt trước dưới dạng từ khác. Điều này tạo ra các bit . Mỗi truy vấn có thể được trả lời bằng cách kiểm tra bốn từ và nó có thể được tính bằng cách sử dụng các thao tác trên các từ này như dịch chuyển, trừ và quan trọng nhất là số lượng dân số. Mô hình của bạn cho phép điều này? b b b O ( n ) O ( 1 )(logn)bbbO(n)O(1)
Emil Jeřábek

@ EmilJeřábek - Tôi chỉ có các thao tác số học, lập chỉ mục và tra cứu bit (nghĩa là tìm kiếm một từ cụ thể trong một từ) trong tâm trí. Các hoạt động bit tiêu chuẩn như ca cũng có thể được xem xét. Tôi đồng ý rằng nếu chúng ta có thể đếm số bit được đặt trong thì thuật toán của bạn thực sự giải quyết được vấn đề. O(1)
RB

Vấn đề xuất phát từ một thuật toán mà chúng tôi đang xây dựng cho các truy vấn tổng hợp trên các cửa sổ trượt. Đó là, chúng tôi có một luồng các số nguyên, mỗi số trong và chúng tôi muốn tính gần đúng tổng của một khoảng nhất định. Vấn đề của chúng tôi sau đó giảm xuống số lượng khoảng thời gian chính xác trên một mảng nhị phân (nhỏ hơn nhiều) (cũng là `` slide ''). Đối với cửa sổ trượt nhị phân có kích thước , chúng tôi sử dụng các bit , thêm một bit trong thời gian không đổi được khấu hao và thực hiện các truy vấn trong . Tôi đã tự hỏi nếu truy vấn thời gian liên tục là khả thi, ngay cả khi mảng không được cập nhật. n O ( n ) O ( log n )0,1,,RnO(n)O(logn)
RB

@ EmilJeřábek - cảm ơn lời đề nghị và phân tích của bạn! Đây có thể là một câu trả lời cho câu hỏi, mặc dù nó không đáp ứng đầy đủ nhu cầu của chúng tôi. Các không gian bit là một hạn chế khó khăn cho chúng tôi, và chúng tôi muốn chứng minh rằng không có thuật toán thuật toán như vậy có thể trả lời các truy vấn trong thời gian liên tục. O(n)
RB

Câu trả lời:


6

Tôi tin rằng những gì bạn đang tìm kiếm là một cấu trúc dữ liệu nhỏ gọn hỗ trợ hoạt động xếp hạng. Xem...

https://en.m.wikipedia.org/wiki/Succotype_data_structure

Cụ thể, bạn có thể sửa đổi giải pháp Emils (đầu tiên) để loại bỏ thao tác đếm pop và thay thế nó bằng bảng tra cứu (để biết chi tiết xem bài viết wiki). Bằng cách giảm kích thước của khối thành (log n) / 2 bit, bảng tra cứu sử dụng các bit o (n).


(* facepalm *) Bảng tra cứu, rõ ràng. Tại sao tôi không nghĩ về điều đó.
Emil Jeřábek

Theo quan điểm của OP ở trên, cần lưu ý rằng cấu trúc có thể dễ dàng thực hiện dưới dạng cửa sổ trượt để việc di chuyển cửa sổ một bit (hoặc thậm chí là khối) cũng mất thời gian không đổi.
Emil Jeřábek

@ EmilJeřábek - dịch giải pháp của bạn sang cài đặt cửa sổ trượt không thẳng tiến. Thay vì đếm số bit được đặt trong toàn bộ phần trước khối hiện tại, chúng ta cần đếm số bit được đặt trong cửa sổ trượt trước khối này, điều này dường như không thể thực hiện được trong thời gian không đổi. Tôi có thiếu thứ gì không?
RB

Không, bạn không cần phải làm điều đó. Vì cuối cùng bạn sẽ trừ đi số đếm cho từ số đếm cho , nên không có vấn đề gì nếu tất cả các số lượng được lưu trữ bị tắt bởi một số tiền cố định; nói cách khác, cạnh trái của cửa sổ trượt có thể được chỉ định một số lượng tùy ý. Do đó, khi di chuyển cửa sổ, bạn chỉ cần cập nhật số đếm cho khối nơi phần tử mới cư trú. Thỉnh thoảng, bạn cần giảm tất cả số lượng để chúng không chiếm quá nhiều không gian, nhưng công việc nhỏ này có thể được phân phối dễ dàng để chỉ mất thời gian O (1) cho mỗi truy vấn nhất định. yxy
Emil Jeřábek

Trên thực tế, sự phiền toái trong câu cuối cùng có thể được tránh hoàn toàn bằng cách tính tất cả các phép tính modulo một số cố định lớn hơn . n
Emil Jeřábek

6

Tôi sẽ không chắc chắn một thuật toán như vậy không tồn tại; chắc chắn có những thuật toán rất gần Bên dưới, là , là , là logarit lặp và là .log 2 n log ( k ) n log ... log k  lần n log * n ~ O ( t ( n ) ) O ( t ( n ) polylog ( t ( n ) ) )lognlog2nlog(k)nloglogk timesnlognO~(t(n))O(t(n)polylog(t(n)))

Đề xuất: Có các thuật toán đạt được

  1. không gian và thời gian truy vấn cho bất kỳ hằng số ;O ( 1 ) kO(nlog(k)n)O(1)k

  2. không gian và thời gian truy vấn .~ O ( log * n )O(n)O~(logn)

Các thuật toán hoạt động như sau. Có các tham số và tùy thuộc vào . Chúng tôi chia mảng kích thước đầu thành các khối kích thước- (cấp 1); chúng tôi chia mỗi khối cấp 1 thành các khối kích thước (cấp 2); và cứ như vậy lên đến cấp . (Chúng ta hãy giả vờ tất cả là thừa của , để tránh các vấn đề có thể chia được.) Sau đó:n = b 0 > b 1 > > b k > 0 n b 0 b 1 b 2 k b i 2k>0n=b0>b1>>bk>0nb0b1b2kbi2

  • Đối với mỗi khối và mỗi khối cấp , chúng tôi lưu trữ số bit được đặt trong khoảng từ đầu khối xuống đến ranh giới khối gần nhất- .i ( i - 1 )i=1,,ki(i1)

  • Để giải quyết một truy vấn, chúng tôi tổng hợp số được lưu trữ tương ứng với chỉ mục và đếm các bit được đặt trước chỉ mục trong khối cấp của nó . Chúng tôi làm tất cả điều này cho và riêng biệt, và trừ kết quả.k x ykkxy

(Nếu các tham số không dễ tính toán, chúng tôi cũng có thể lưu trữ chúng.)bi

Sự sắp xếp này sử dụng không gian và thời gian truy vấn O(k+bk).

ni=1klogbi1bi,
O(k+bk).

Trong mệnh đề, với 1., chúng ta đặt là hằng số và đặt cho , .b i = log ( i ) n 0 < i < k b k = 1kbi=log(i)n0<i<kbk=1

Đối với 2., chúng ta có thể lấy và Không gian sau đó được giới hạn bởi khoảng cho một số hằng số .b i = i ( log i ) 3 log ( i ) n . n k i = 1 log ( i ) n + 2 log ik=logn

bi=i(logi)3log(i)n.
c
ni=1klog(i)n+2logii(logi)3log(i)nni=13i(logi)2=cn
c

2

Hóa ra không chỉ có thể thực hiện được điều này trong các bit bộ nhớ như đề xuất trong câu trả lời của Benjamin Sach, điều này thực sự có thể được thực hiện trong các bit .n ( 1 + o ( 1 ) )O(n)n(1+o(1))

Ý tưởng là để suy nghĩ của đầu vào -bit như vector đặc trưng của một tập hợp con của (ví dụ, các bit được thiết lập khi và chỉ khi nằm trong tập). Sau đó, chúng ta chỉ cần sử dụng một từ điển cô đọng để biểu diễn tập hợp với số bit cần thiết.{ 1 , 2 , ... , n } i ' t h in{1,2,,n}ithi

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.