Cấu trúc dữ liệu dựa trên so sánh để tìm các mục


34

Có cấu trúc dữ liệu nào có một mảng n mục không được sắp xếp , thực hiện quá trình tiền xử lý trong O(n) và trả lời các truy vấn: có một số phần tử x trong danh sách, mỗi truy vấn trong thời gian xấu nhất O(logn) không?

Tôi thực sự nghĩ rằng không có, vì vậy một bằng chứng rằng không có gì cũng được hoan nghênh.


3
(1) Tôi không biết lý do tại sao bạn có thể nói về Lát Tất nhiên tôi xem xét thời gian dự kiến, vì bạn không nói rõ về mong đợi của bạn trong câu hỏi của bạn. Hãy cố gắng nêu câu hỏi của bạn chính xác hơn trước khi nói tất nhiên. Hãy (2) Vui lòng xác định không thể băm được. Tiết
Tsuyoshi Ito

2
(1) Tôi thấy. Cảm ơn đã giải thích. Nếu ai đó hỏi, bạn có quan tâm đến thời gian hoạt động không? Tất nhiên, câu trả lời sẽ thực sự là một cách rõ ràng. Trực tiếp :) (2) Tôi nghĩ rằng hành động được phép duy nhất là so sánh hai giá trị trong danh sách. thay vì chỉ nêu ra không thể băm được. Có thể bạn chỉnh sửa câu hỏi để mọi người không phải đọc các bình luận để hiểu ý nghĩa của trò chơi không thể băm được không?
Tsuyoshi Ito

3
Nhân tiện, nếu bạn không thể chứng minh điều đó, tại sao bạn biết điều đó là không thể? Nếu đó là một bài tập trong sách giáo khoa hoặc một lớp học, bạn đang hỏi trên một trang web sai.
Tsuyoshi Ito

6
Đây có phải là câu hỏi của bạn không?
sdcvvc

2
@Filip: Có dễ nhìn không? Nếu nó là sự thật, thì tôi đồng ý rằng nó giải quyết được câu hỏi.
Tsuyoshi Ito

Câu trả lời:


30

Đây là một bằng chứng cho thấy điều đó là không thể. Giả sử bạn có thể xây dựng một cấu trúc dữ liệu như vậy. Xây dựng nó. Sau đó, chọn mục một cách ngẫu nhiên từ danh sách, thêm ε để mỗi người trong số họ, nơi ε là nhỏ hơn so với sự khác biệt giữa bất kỳ hai mặt hàng trong danh sách, và thực hiện các truy vấn để kiểm tra xem bất kỳ mục kết quả là trong danh sách. Bạn đã thực hiện các truy vấn O ( n ) cho đến nay.n/lognϵϵO(n)

Tôi muốn khẳng định rằng các so sánh bạn đã thực hiện là đủ để cho biết một mục trong danh sách ban đầu nhỏ hơn hoặc lớn hơn bất kỳ mục mới nào b . Giả sử bạn không thể nói. Sau đó, vì đây là mô hình dựa trên so sánh, bạn sẽ không biết liệu a có bằng b hay không, mâu thuẫn với giả định rằng cấu trúc dữ liệu của bạn hoạt động.abab

Bây giờ, vì các mục bạn chọn là ngẫu nhiên, nên các so sánh của bạn có xác suất cao được cung cấp đủ thông tin để chia danh sách ban đầu thành n / log n liệt kê từng kích thước O ( log n ) . Bằng cách sắp xếp từng danh sách này, bạn sẽ có được thuật toán sắp xếp thời gian ngẫu nhiên O ( n log log n ) chỉ dựa trên so sánh, một mâu thuẫn.n/lognn/lognO(logn)O(nloglogn)


Một vài gợi ý để giúp hiểu các bằng chứng (giả sử tôi hiểu nó một cách chính xác bản thân mình tất nhiên): các mục cần được lấp đầy bằng các mục sau ε đã được thêm vào chúng; mô hình so sánh đảm bảo cho bạn biết trường hợp nào a ba b giữ; các n / log n danh sách ở trong 'thứ tự tăng dần': mọi phần tử trong bất kỳ danh sách cao là cao hơn so với mọi phần tử trong bất kỳ danh sách thấp hơn; sau các truy vấn ban đầu, bạn có đủ thông tin để tạo danh sách xung quanh các mục bạn chọn ngẫu nhiên,bϵababn/logn
Alex ten Brink

(tiếp theo) lưu ý rằng bạn thậm chí không cần phải có khả năng xây dựng danh sách trong thời gian được cung cấp để giữ bằng chứng.
Alex ten Brink

Tôi không im lặng hiểu bằng chứng này. Các mâu thuẫn cuối cùng là tắt "thuật toán dựa trên sự so sánh", nhưng trong những bước đầu tiên của thuật toán của chúng tôi chúng tôi đã thêm cho từng hạng mục (hơn nữa, "nơi ε là nhỏ hơn so với sự khác biệt giữa bất kỳ hai mặt hàng thuộc danh mục"). Tại sao chúng tôi vẫn biện minh rằng thuật toán của chúng tôi vẫn chỉ so sánh dựa trên nếu chúng tôi giả định các mặt hàng của chúng tôi có tổng thứ tự không rời rạc trên chúng? ϵϵ
Artem Kaznatcheev

5
@Artem: đầu vào gốc của bạn bao gồm các yếu tố . Sau đó, bạn xây dựng một bộ X mới = X × { 0 , 1 } ; bạn đại diện cho một gốc x X( x , 0 ) X ' và sửa đổi x +xXX=X×{0,1}xX(x,0)X ( x , 1 ) X ' . Bây giờ bạn sử dụng thuật toán hộp đen; các thuật toán so sánh các yếu tố của X 'x+ϵ(x,1)XXcho nhau; để trả lời các truy vấn như vậy, bạn chỉ cần so sánh một số phần tử với nhau. Do đó mọi thứ nên được thực hiện trong mô hình so sánh, với chi phí không đổi. X
Jukka Suomela

1
@Aryabhata: có. Là gì thuật toán? O(log2n)
Peter Shor

24

Tôi tin rằng đây là một bằng chứng khác nhau, chứng minh tính không thể của cấu trúc thời gian truy vấn , với tiền xử lý O ( n ) .O(logkn)O(n)

Giả sử trong quá trình tiền xử lý, bạn thực hiện so sánh , dẫn đến một thứ tự từng phần.O(n)

Bây giờ hãy xem xét kích thước của antichain lớn nhất trong đó. Vì các phần tử này không thể so sánh được, để chúng tôi có thuật toán truy vấn O ( log k n ) , chúng tôi phải có A = O ( log k n ) .AO(logkn)A=O(logkn)

Bây giờ theo định lý của Dilworth, có một phân vùng cỡ , thành các chuỗi.A

Bây giờ chúng ta có thể bổ sung thuật toán để xác định các chuỗi trong phân vùng. Chúng ta có thể xác định xem hai yếu tố có thể so sánh được hay không bằng cách tạo một biểu đồ so sánh có hướng và thực hiện phân tích khả năng tiếp cận. Điều này có thể được thực hiện mà không có bất kỳ so sánh bổ sung. Bây giờ chỉ cần loại bỏ từng phân vùng có thể có kích thước để xác định xem đó có phải là phân vùng của chuỗi không.A

Khi chúng ta có các chuỗi, chúng ta có thể hợp nhất chúng để đưa ra thuật toán so sánh để sắp xếp toàn bộ danh sách.O(nloglogn)


1
Đây là một ý tưởng tốt đẹp. Và nếu bạn có thể chỉ ra rằng phân vùng chuỗi phải được biết đến bằng thuật toán thì bạn có thể sử dụng phép hợp nhất để chỉ ra rằng nó sẽ chỉ lấy một phép so sánh O (n log log n) bổ sung để sắp xếp toàn bộ đầu vào, thay vì sử dụng Jensen. Nhưng có một vấn đề: tại sao thuật toán tiền xử lý phải xây dựng một phân vùng chuỗi? Phải có một phân vùng chuỗi, nhưng điều đó rất khác so với thuật toán được biết đến.
David Eppstein

8
Ok, bây giờ tôi tin bằng chứng này. Và nó cho thấy mạnh mẽ hơn rằng để đạt được thời gian truy vấn polylog, bạn phải sử dụng một số phép so sánh trong một phụ gia sắp xếp. Tốt đẹp. Nhân tiện, phân vùng chuỗi có thể được tìm thấy trong thời gian đa thức từ tập so sánh đã được thực hiện, thay vì cần tìm kiếm vũ lực, nhưng điều đó không tạo ra bất kỳ sự khác biệt nào cho lập luận của bạn. O(nloglogn)
David Eppstein

6
Các bằng chứng thực sự cho thấy rằng bạn phải có tiền xử lý hoặc Ω ( n ) cho mỗi truy vấn. Tất nhiên cả hai đều chặt chẽ. Điều này cho thấy tìm kiếm nhị phân và tìm kiếm tuyến tính là các thuật toán tìm kiếm "thú vị" duy nhất (ít nhất là trong thế giới cổ điển). Ω(nlogn)Ω(n)
Yuval Filmus

1
@Yuval: có lẽ bạn nên viết lên quan sát này như một câu trả lời thực tế, bởi vì dường như với tôi rằng bạn phải thực hiện một lượng công việc vừa phải để có được kết quả trên từ các bằng chứng trong các câu trả lời.
Peter Shor

1
@Yuval: suy nghĩ về những bằng chứng, tôi chỉ thấy rằng bạn phải có một trong hai tiền xử lý hoặc Ω ( n 1 - ε ) thời gian truy vấn cho tất cả ε . Có thể có thời gian tiền xử lý o ( n log n ) và thời gian truy vấn O ( n / log n ) . Người ta có thể phân chia danh sách vào log n danh sách kích thước n / log n mỗi trong thời gian θ ( nΩ(nlogn)Ω(n1ϵ)ϵo(nlogn)O(n/logn)lognn/logn sử dụng tìm kiếm trung bình lặp đi lặp lại. θ(nloglogn)
Peter Shor

0

Như câu trả lời của Peter Shor, để loại trừ tư cách thành viên trong mô hình dựa trên so sánh, chúng ta cần biết yếu tố này so sánh với mọi thành viên như thế nào. Do đó, bằng cách sử dụng truy vấn ngẫu nhiên (số lượng thành viên nhỏ hơn số truy vấn không truy vấn là ngẫu nhiên), chúng tôi thu được thông tin Θ ( n log k ) liên quan đến việc có n giá trị chưa được sắp xếp. Do đó, đối với một số hằng số c > 0 , sử dụng ck<nΘ(nlogk)nc>0 tiền xử lý, chúng ta không thể cócnlogk truy vấn miễn phí. Điều này là tối ưu cho một yếu tố không đổi vì chúng ta có thể sắp xếp dữ liệu vào k = k / log k n / log n xấp xỉ các thùng bằng nhau (mỗi nhóm không được sắp xếp) trong O ( n log k ) = O ( n log k ) thời gian, cho phépchi phí truy vấn O ( n / k ) .cnlogk/kk=k/logkn/lognO(nlogk)=O(nlogk)O(n/k)

O(n)o(n)o(nlogn)kO(nε)ε>0Ω(n1ε) chi phí truy vấn.

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.