Đố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 đó.)
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 –
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ờ. –