Tìm min chung trong thời gian logarit


7

Tôi đang tìm kiếm một cấu trúc dữ liệu để lưu trữ một tập hợp sao cho hai trường hợp kích thước O(n) được biết là có giao lộ không trống, yếu tố tối thiểu của giao lộ có thể được tìm thấy trong O(logn)thời gian. Điều này có thể đạt được, cho trường hợp xấu nhất hoặc phức tạp khấu hao? Các yêu cầu khác cho cấu trúc dữ liệu:O(logn) xóa, O(nlogn) khởi tạo.

Dưới đây là một ứng dụng ví dụ về cấu trúc dữ liệu như vậy, để làm rõ các yêu cầu. Đầu vào bao gồm n tập con của{1,...,n}tất cả đều chứa số n. Đầu ra là một ma trận n by n cói,jmục nhập là phần tử tối thiểu trong giao điểm của bộ i và j. Với cách tiếp cận cơ bản, người ta có thể giải quyết vấn đề này trongO(n3)thời gian. Với cấu trúc dữ liệu thỏa mãn các điều kiện trên, người ta có thể giải quyết nó trongO(n2logn) thời gian.


Tình huống tôi quan tâm nhất là khi các bộ có đuôi thấp thưa thớt với mật độ tăng dần. Chẳng hạn, có một thuật toán O (d log n) rõ ràng cho các tập hợp có mật độ giới hạn dưới 1 / d, trong đó bạn sử dụng heap tối thiểu và bắt đầu từ mức tối thiểu của một tập hợp, sau đó ping pong qua lại luôn lấy phần tử lớn nhất tiếp theo trong đống cho đến khi bạn ổn định.
tiền thận

Điều đó có nghĩa gì đối với một bộ có đuôi thấp hơn thưa thớt, hoặc mật độ của nó tăng đều đặn?
DW

Ví dụ: nghĩ về một tập hợp ngẫu nhiên trong đó phần tử i được bao gồm với xác suất 1 / (ni) cho i <n và n được bao gồm với xác suất 1.
tiền thận

Nếu bạn có thể chỉnh sửa câu hỏi để chỉ định một thăm dò cụ thể. phân phối, điều đó có thể làm cho điều này dễ dàng hơn để giải quyết. Chẳng hạn, nếu mỗi bộ được chọn ngẫu nhiên (trong đó phần tử i được bao gồm xác suất p, bất kể i), thì tôi nghĩ có một thuật toán tự nhiên có thời gian chạy dự kiến ​​là như thếO(n2logn): đầu tiên liệt kê tất cả các cặp Si,Sjcả hai đều chứa 1; sau đó tất cả các cặp chứa 1 (nhưng chưa được tìm thấy); và như thế. Có một điều kiện dừng đơn giản và nếu các bộ là ngẫu nhiên, bạn sẽ không cần phải tiếp tục rất xa trước khi dừng.
DW

Một ví dụ khác, đối với phân phối cụ thể trong nhận xét của bạn, có một cách đơn giản O(n2logn) thuật toán thời gian, vì kích thước dự kiến ​​của mỗi bộ là O(logn).
DW

Câu trả lời:


2

Bạn không thể. Không có cấu trúc dữ liệu như vậy. Giả sử bạn có một phiên bản riêng cho mỗi bộ và mỗi phiên bản được khởi tạo riêng (chỉ sử dụng thông tin về bộ mà nó đại diện và không có bất kỳ thông tin nào về bất kỳ bộ nào khác), những thời gian chạy này không thể đạt được.

Đặc biệt, khi bạn có hai bộ, việc tìm phần tử chung tối thiểu mất Ω(n)thời gian. Thật vậy, kiểm tra sự khác biệt đòi hỏiΩ(n)thời gian, như được giải thích ở đây . Bây giờ, hãy tưởng tượng bắt đầu với hai bộS1,S2 trên vũ trụ {1,2,,n1}. Để choT1=S1{n}T2=S2{n}. Hiện nayT1,T2được đảm bảo có một yếu tố chung. Vì vậy, nếu bạn có cấu trúc dữ liệu tốt cho vấn đề của mình, hãy lưu trữT1 trong một ví dụ của cấu trúc dữ liệu và T2trong một cái khác Sau đó, nếu chúng ta có cách tìm yếu tố tối thiểu làT1T2 trong o(n) thời gian, điều này sẽ cho chúng ta một cách để kiểm tra sự rời rạc của S1,S2 trong o(n) thời gian (chỉ kiểm tra xem phần tử tối thiểu có nhỏ hơn không n) - nhưng chúng tôi đã biết sau này là không thể. Theo sau đó, điều này là không thể, tức là, bất kỳ cấu trúc dữ liệu nào cho vấn đề của bạn phải mấtΩ(n) thời gian để tìm phần tử chung tối thiểu của hai bộ.

Điều này không có nghĩa là ứng dụng của bạn không thể được giải quyết một cách hiệu quả. Vẫn có thể có một cách để giải quyết ứng dụng của bạn trongO(n2logn)thời gian; kết quả này không loại trừ điều đó.


1
Tôi sẽ đánh giá rất cao nếu bạn có thể làm cho câu trả lời của mình trở nên khép kín hơn một chút, vì nó trích dẫn câu trả lời của bạn trên một bài đăng khác, từ đó trích dẫn một kết quả mà bạn chưa đưa ra tham khảo.
tiền thận

Hãy để tôi chỉ ra chính xác bước nào tôi tin rằng cần phải xây dựng thêm. Bước quan trọng trong lập luận của bạn là tuyên bố rằng, đối với các bộ được lưu trữ theo bất kỳ cách nào nhưng không thể truy cập vào bộ nhớ của nhau, việc giải quyết vấn đề quyết định rời rạc cần có thời gian của Omega (n). Bạn cho rằng bất kỳ thuật toán nhanh hơn nào cũng sẽ mâu thuẫn với các kết quả phức tạp trong giao tiếp cơ bản. Tuy nhiên, mô hình này của kênh truyền thông dường như tổng quát hơn các mô hình truyền thông cơ bản mà tôi đã tìm thấy trong tài liệu, mà Omega (n) ràng buộc được biết đến. Đây là lý do tại sao tôi yêu cầu một trích dẫn cụ thể.
tiền thận

@ tiền thận, tôi không hiểu cách nào có vẻ chung chung hơn. Dù sao, có vẻ như sự phản đối của bạn chủ yếu là câu trả lời khác của tôi , vì vậy hãy tham gia bất kỳ cuộc thảo luận nào ở đó. Tôi đã chỉnh sửa câu trả lời của mình ở đó để làm rõ chi tiết. Nếu bạn có một mối quan tâm cụ thể về mô hình tính toán, vui lòng bình luận ở đó giải thích cụ thể về sự khác biệt trong mô hình tính toán mà bạn thấy. Tôi không nhìn thấy một, nhưng điều đó không có nghĩa là bạn sai - Tôi không phải là chuyên gia về chủ đề này và tôi luôn có thể bị nhầm lẫn.
DW

Điểm công bằng và cảm ơn đã cập nhật. Sẽ xem xét.
tiền thận

-1

Đây là một ý tưởng để giải quyết vấn đề, đưa ra 2 bộ:

Bạn có thể giữ "bộ" bằng một cây đen đỏ. Ngoài ra, với mỗi nút trong cây, chúng tôi liên kết một bit để xác định xem cây con của nó có chứa một phần tử trong cả hai bộ không. Để trình bày, nó được gọi là bit chèn . Tôi giả sử cây đen đỏ sắp xếp các yếu tố từ trái sang phải.

Khi chèn một phần tử vào cây, thuật toán sẽ kiểm tra xem phần tử đó có tồn tại trong cây không (tức là trong phần còn lại của tập hợp). Nếu không- chúng ta chèn phần tử như bình thường. Nếu không, bằng cách di chuyển từ gốc đến lá chứa phần tử, thuật toán sẽ bật bit chèn của các nút tương ứng. Trong trường hợp xấu nhất phải mấtO(logn).

Khi xóa một phần tử, thuật toán sẽ kiểm tra xem phần tử đó có tồn tại trong cây không và nếu bit chèn được bật. Nếu phần tử không tồn tại trong cây- chúng ta sẽ trả về lỗi. Nếu phần tử tồn tại và bit chèn bị tắt, thì chúng ta xóa phần tử như trong thuật toán cây Đen Đen. Mặt khác, bằng cách di chuyển từ gốc đến lá chứa phần tử, thuật toán sẽ tắt bit chèn của các nút tương ứng. Xóa mấtO(logn).

Cuối cùng, thuật toán tìm phần tử tối thiểu được chia sẻ bởi cả hai bộ bắt đầu bằng thư mục gốc. Nếu bit chèn của root bị tắt- thì các tập hợp bị tách rời, thuật toán trả về lỗi. Mặt khác, thuật toán di chuyển đệ quy đến con trái nếu bit chèn của nó được bật và nếu không nó sẽ di chuyển sang con phải. Thuật toán dừng lại ở phần tử có giá trị tối thiểu. Thuật toán chạy ởO(logn).

Tôi đang cố gắng nghĩ làm thế nào để khái quát hóa cho số lượng lớn hơn các bộ ...


1
Điều này không đáp ứng các tiêu chí đã nêu vì nó giả sử hai trường hợp được biết đến với nhau trong quá trình khởi tạo - nếu bạn có nhiều trường hợp và cần tìm cặp giao cắt tối thiểu khôn ngoan, điều này sẽ không đáp ứng thời gian vì bạn sẽ phải xây dựng lại cấu trúc dữ liệu cho mỗi cặp bộ.
tiền thận

Nếu các trường hợp không biết nhau - thì bạn có thể hợp nhất chúng vào O(n)thời gian sử dụng en.wikipedia.org/wiki/
Kẻ

Đầu vào của vấn đề là gì? Khi khởi tạo các tập hợp, bạn có thể chèn \ xóa các phần tử vào một cây chung và sau đó sử dụng các thao tác xóa và chèn liên tiếp sẽ không ảnh hưởng đến độ phức tạp của truy vấn, sẽ mấtO(logn)
dùng3563894

Đó là điểm, các bộ không thể được ghép nối. Hãy để tôi cập nhật câu hỏi của tôi với một ứng dụng ví dụ về cấu trúc dữ liệu như vậy, để làm rõ.
tiền thận

Nhân tiện, tôi đã không bỏ phiếu cho bạn - Tôi nghĩ rằng câu trả lời của bạn rất hữu ích cho cuộc thảo luận và làm rõ thêm mà nó tạo ra, ngay cả khi nó không thực sự trả lời câu hỏi của tôi.
tiền thận

-1

Khởi tạo:
1) tạo cây đỏ đen chứa tất cả các thành phần của danh sách # 1 - O (n log n) cho toàn bộ danh sách.
2) lặp qua tất cả các phần tử của danh sách # 2 và kiểm tra xem nó có tồn tại trong cây đỏ-đen không - O (n log n) cho toàn bộ danh sách
3) nếu nó tồn tại trong cây đỏ-đen, hãy chèn phần tử đó vào danh sách # 2 vào heap tối thiểu yêu thích của bạn - O (n log n) cho toàn bộ danh sách

Để sau đó tìm kiếm, tìm phần tử giao nhau tối thiểu, chỉ cần nhìn vào đỉnh của heap, vì vậy đó là O (1).


2
Cách tiếp cận này bị các vấn đề tương tự như câu trả lời của người dùng3563894, xem các bình luận ở đó.
tiền thậ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.