Là liên minh hedge luôn nhanh như chia và chinh phục?


8

Adams mô tả một thuật toán phân chia và chinh phục để tìm sự kết hợp của hai bộ (được biểu diễn dưới dạng cây tìm kiếm nhị phân cân bằng trọng lượng). Sau đó, ông mô tả một thuật toán "liên minh phòng hộ" mới mà ông tuyên bố sẽ cải thiện khả năng phân chia và chinh phục. Tuy nhiên, anh ta không đưa ra một bằng chứng, hoặc thậm chí là một lời giải thích thực sự, về lý do tại sao nó phải là , chứ đừng nói tại sao nó phải nhanh hơn sự phân chia và chinh phục.O(m+n)

Blelloch, Ferizovic và Sun cho thấy thuật toán phân chia và chinh phục của Adams thực sự đạt được tối ưu về mặt lý thuyết trong đó . Họ không, tuy nhiên, giải quyết các thuật toán liên minh phòng hộ.m nΘ(mlog(n/m+1))mn

Là liên minh phòng hộ, trên thực tế, có hiệu quả như chia rẽ và chinh phục? Phần ít rõ ràng nhất là phần bên trong. Ít nhất là bề ngoài, có vẻ như trùng lặp công việc giữa các bên trái và bên phải rằng toàn bộ cổ phần được phân chia giữa chúng. Có lẽ điều này ổn vì một số lý do, nhưng tôi không biết tại sao.

Một cuộc điều tra khác: Haskell's Data.SetData.Mapsử dụng các biến thể của hàng rào giao nhau và sự khác biệt, cũng như liên minh. Tôi chưa tìm thấy bất kỳ cuộc thảo luận được công bố nào về các thuật toán đó. Các câu hỏi tương tự cũng áp dụng cho những điều này.

Câu trả lời:


3

Mặc dù tôi chưa thấy hoặc phân tích lý thuyết về các thuật toán phòng hộ, tôi có một số bằng chứng thực nghiệm cho thấy chúng còn tệ hơn các thuật toán phân chia và chinh phục cho cây nhị phân.

Bắt đầu với mã trong containersgói Haskell , tôi đã tối ưu hóa thuật toán hedge union bằng cách áp dụng thủ công chuyên môn hóa mô hình cuộc gọi để giảm phân bổ trung gian. Điều này đã cải thiện hiệu suất của nó khoảng 10%, mang lại cho nó một cú đánh công bằng.

Bắt đầu với mã phân chia và chinh phục ở Adams, tôi đã tối ưu hóa thuật toán hợp nhất bằng cách thêm các trường hợp đặc biệt khi một trong hai đầu vào là một đơn (mã liên kết hedge tối ưu hóa một mặt do đó, và không rõ liệu bên kia có thể được tối ưu hóa không tương tự).

Tôi đã thử nghiệm từng triển khai bằng cách sử dụng một tập hợp các điểm chuẩn hoạt động được đóng gói kèm theo containers. Phân chia và chinh phục thường nhanh hơn hàng rào, đôi khi nhanh gấp đôi. Khi nó chậm hơn, nó chỉ hơi như vậy.

Điểm chuẩn tương tự của các hoạt động thiết lập khác cho kết quả tương tự.


Đầu cơ:

Các thuật toán hedge có thể hữu ích khi sử dụng các cây có hệ số phân nhánh lớn, có thể tốn kém hơn để phân chia đệ quy. Chúng cũng có thể hữu ích cho các cây con nhỏ, nơi chúng có thể tiết kiệm đủ phân bổ để xứng đáng với công việc làm thêm.


Bạn đã thực sự thay đổi việc thực hiện Data.Setdựa trên những quan sát này?
Joachim Breitner

@JoachimBreitner, vâng, tôi đã làm. Tôi cũng đã sử dụng cách tiếp cận tương tự cho các tiện ích hợp nhất an toàn mới, mặc dù việc mô tả đặc điểm hiệu suất chính xác của chúng chắc chắn là quá khó để bận tâm.
dfeuer
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.