2012-06-18 49 views
6

Tôi đang cố gắng viết một phương thức sẽ tính tất cả các hoán vị của một bộ nguồn có thứ tự quan trọng. Tôi tin rằng đây được gọi là "sắp xếp". Những gì tôi có ý nghĩa bởi đây là:Thuật toán sắp xếp hiệu quả trong java

{a} -> {{a}, {}} 
{a,b} -> {{a,b}, {b,a}, {a}, {b}, {}} 
{a,b,c} -> {{a,b,c}, {a,c,b}, {b,a,c}, {b,c,a}, {c,a,b}, {c,b,a}, {a,b}, {a,c}, {b,a}, {b,c}, {c,a}, {c,b}, {a}, {b}, {c}, {}} 

, vv ấn tượng của tôi là, cho một tập S, tôi nên tạo mỗi hoán vị của mỗi tập hợp con của Powerset S. Vì vậy, đầu tiên tạo ra Powerset, sau đó ánh xạ một hoán vị trên mỗi bộ.

Vấn đề là điều này vô cùng phức tạp - giống như O (∑n!/K!) Với k = 0..n.

Tôi tự hỏi nếu có bất kỳ thuật toán hiện có nào làm điều này loại điều rất hiệu quả (có lẽ là một thực hiện song song). Hoặc có lẽ ngay cả khi một thuật toán sức mạnh song song tồn tại và một thuật toán hoán vị song song tồn tại, tôi có thể kết hợp cả hai.

Suy nghĩ?

+2

Có thể kiểm tra bài đăng này: http://stackoverflow.com/questions/1506078 – squiguy

+0

có thể trùng lặp của [Hoán vị nhanh -> số -> thuật toán ánh xạ hoán vị] (http://stackoverflow.com/questions/1506078/fast -permutation-number-hoán vị-ánh xạ-thuật toán) – Makoto

+1

Tôi không nghĩ rằng đó là một bản sao. Tôi đọc chủ đề đó và nó yêu cầu một cái gì đó khá khác nhau. Các giải pháp có phần tương tự trong chủ đề nhưng chắc chắn là đủ khác nhau để đảm bảo các chủ đề riêng biệt. – rhombidodecahedron

Trả lời

1

Thư viện ổi do google cung cấp chứa các phương pháp khác nhau để hoán đổi bộ sưu tập.

Xem javadoc của lớp com.google.common.collect.Collections2 here.

+0

Câu trả lời hay, thực sự tiện dụng cho các bộ sưu tập nhỏ, nhưng tôi không nghĩ rằng quy mô triển khai khi N tăng lên. –

0

Để thực hiện điều này, trước tiên bạn tạo các kết hợp cho các vị trí 1-n trong đó n là số phần tử trong bộ nguồn. Ví dụ: nếu bạn có 3 phần tử, thì bạn sẽ có:

C (3, 3) = 1 kết hợp (abc)
C (3, 2) = 3 kết hợp (ab) (ac) (bc)
C (3, 1) = 3 kết hợp (a) (b) (c)

Bây giờ, bạn tạo hoán vị cho mỗi kết hợp.

Có các thuật toán nổi tiếng để tính hoán vị và kết hợp. Ví dụ: "Nghệ thuật lập trình máy tính" của Knuth, tập 4A, Mục 7.2.1.2 và 7.2.1.3, giải thích chính xác cách xây dựng các thuật toán có liên quan.

Các vấn đề liên quan