11

Đối với thuật toán tự động, tôi yêu cầu cấu trúc dữ liệu Union-Find nhanh chóng bằng ngôn ngữ chức năng. Vì tôi cần chính thức chứng minh tính chính xác của cấu trúc dữ liệu, tôi thích cấu trúc đơn giản hơn.Các lớp tương đương và liên kết/tìm bằng ngôn ngữ chức năng

Điều tôi đang cố gắng làm là tính toán các lớp tương đương của các phần tử trong một tập hợp S w.r.t. một mối quan hệ R ⊆ S × S. Những gì tôi muốn nhận ra cuối cùng là một số chức năng f: S → S mà bản đồ bất kỳ yếu tố của S đến một (canonical) đại diện của lớp học R-tương đương của nó. Theo "kinh điển", tôi có nghĩa là tôi không quan tâm người đại diện nào miễn là nó giống nhau cho tất cả các yếu tố của một lớp tương đương, tức là tôi muốn giữ f x = f y ⟺ (x,y) ∈ R.

Cấu trúc và thuật toán dữ liệu tốt nhất cho điều này bằng ngôn ngữ chức năng là gì? Tôi nên thêm rằng tôi thực sự cần mã chức năng "bình thường", tức là không có biến thể trạng thái biến đổi/trạng thái.

EDIT: Trong lúc này, tôi đã đưa ra thuật toán này:

m := empty map 
for each s ∈ S do 
    if m s = None then 
    for each t in {t | (s,t) ∈ R} 
     m := m[t ↦ s] 

này tạo ra một bản đồ mà các bản đồ bất kỳ yếu tố S để người đại diện của lớp tương đương của nó, nơi mà người đại diện là người đầu tiên phần tử đạt được bằng phép lặp qua S. Tôi nghĩ rằng điều này thực sự có thời gian tuyến tính (nếu hoạt động bản đồ là hằng số). Tuy nhiên, tôi vẫn còn quan tâm đến các giải pháp khác, vì tôi không biết làm thế nào hiệu quả này là trong thực tế.

(quan hệ của tôi được biểu thị nội bộ dưới dạng tùy chọn "S → (S Set)", do đó lặp lại trên {t | (s, t) ∈ R} - đây là hoạt động rẻ trên cấu trúc đó.)

+3

những sự cố này có thể giúp ích không? http://hackage.haskell.org/packages/archive/equivalence/0.2.3/doc/html/Data-Equivalence-Monad.html và http://hackage.haskell.org/packages/archive/equivalence/0.2. 2/doc/html/Data-Equivalence-STT.html –

+0

Nếu tôi đọc chính xác, tất cả đều sử dụng IO hoặc các biến trạng thái biến đổi, nghĩa là chúng sử dụng cấu trúc dữ liệu có thể thay đổi bên trong. Trong khi điều này có lẽ là loại điều tôi muốn làm cuối cùng, khung hiện tại của tôi không hỗ trợ loại mã giả này. Nhưng nhờ liên kết, tôi không biết điều này tồn tại và nó có thể hữu ích cho tôi trong tương lai. Tôi đã làm rõ điều này trong bài đăng của tôi ngay bây giờ. –

Trả lời

7

AFAIK (và tìm kiếm nhanh không giải thích cho tôi), không có tương đương hoàn toàn chức năng thuần túy của thông số disjoint-set datastructure có hiệu suất tiệm cận tương đương (tính năng nghịch đảo-Ackermann). (cơ sở hạ tầng thông thường không hoàn toàn chức năng vì nó yêu cầu cập nhật phá hủy để thực hiện nén đường dẫn)

Nếu bạn không chết trên độ tinh khiết chức năng, bạn chỉ có thể sử dụng cập nhật phá hủy và triển khai cơ sở hạ tầng thông thường.

Nếu bạn không quan tâm đến hiệu suất tiệm cận, bạn có thể thay thế mảng truy cập ngẫu nhiên của cơ sở hạ tầng thông thường bằng persistent associative map, với chi phí của hệ số hiệu suất O (log N) bổ sung và cần xác minh đúng đắn.

Nếu bạn muốn đơn giản hóa tối đa cho mục đích xác minh và không được đặt ở cả hai bên trên, bạn có thể sử dụng mảng cập nhật để giảm tối ưu hóa theo từng hạng. IIRC này mang lại hiệu suất trường hợp xấu nhất O (log N), nhưng thực sự có thể cải thiện tốc độ thực thi thực tế (vì thứ hạng không còn cần được lưu trữ hoặc quản lý nữa).

+1

Tôi sợ tôi không thể sử dụng mã không tinh khiết trong môi trường hiện tại của mình.Về điều bản đồ, tôi không thấy làm thế nào mà có thể được áp dụng cho các phương pháp tiếp cận công đoàn/tìm tiêu chuẩn. Hiện tại, tôi có một thực hiện đơn giản và mạnh mẽ, hoàn toàn chức năng (tôi đã thêm nó vào câu hỏi của tôi) sử dụng bản đồ, nhưng tôi không nghĩ đó là những gì bạn nghĩ. Nếu tôi thấy điều này một cách chính xác, bằng cách sử dụng một bản đồ theo cách bạn đề nghị sẽ phá hủy tất cả các lợi thế của công đoàn/tìm cấu trúc, nó sẽ không? –

+0

Ah, bây giờ tôi cuối cùng đã hiểu ý của bạn bằng cách "thay thế một bản đồ liên kết liên tục". Tôi nghĩ tôi sẽ thử điều đó, cảm ơn. –

+0

Xin lỗi vì bị che khuất - Tôi đã cập nhật câu trả lời của mình để thử và làm mọi việc rõ ràng hơn. – comingstorm