2013-02-02 59 views
5

tôi cần phải hiệu quả tính toán hoán vị tiếp theo của chiều dài k từ n lựa chọn. Danh sách Wikipedia a great algorithm để tính toán hoán vị tiếp theo có chiều dài n từ số n lựa chọn.hiệu quả tính toán hoán vị tiếp theo của chiều dài k từ sự lựa chọn n

Điều tốt nhất tôi có thể sử dụng thuật toán đó (hoặc the Steinhaus–Johnson–Trotter algorithm), sau đó chỉ xem xét các mục k đầu tiên của danh sách và lặp lại bất cứ khi nào thay đổi ở trên vị trí đó.

ràng buộc:

  • Thuật toán phải tính toán hoán vị tiếp theo được gì hơn là các hoán vị hiện tại. Nếu cần tạo danh sách tất cả các hoán vị, nó sẽ chiếm quá nhiều bộ nhớ.
  • Nó phải có khả năng tính toán một hoán vị của chiều dài chỉ k của n (đây là nơi các thuật toán khác không

không hạn chế:

  • Đừng quan tâm nếu nó trong- đặt hoặc không
  • Tôi không quan tâm nếu nó theo thứ tự từ điển hoặc bất kỳ thứ tự nào cho vấn đề đó
  • Tôi không quan tâm quá nhiều làm thế nào hiệu quả nó tính toán hoán vị tiếp theo, trong lý do tất nhiên, nó không thể cho tôi hoán vị tiếp theo bằng cách làm cho một danh sách của tất cả những người có thể mỗi lần.
+0

Tôi khá chắc chắn bạn sẽ tìm thấy câu trả lời của bạn trong mã cho mô-đun itertools Python, có một cái nhìn – YXD

+0

yeah nó là một * .so trên mac os x, vì vậy tôi đã quá lười biếng để đi tìm nguồn. đoán tôi nên ngừng lười biếng và đi làm điều đó. – aaronstacy

+1

http://hg.python.org/releasing/2.7.3/file/7bb96963d067/Modules/itertoolsmodule.c#l2497 – Dougal

Trả lời

1

Bạn có thể phá vỡ vấn đề này thành hai phần:

1) Tìm tất cả các tập con của kích thước k từ một tập hợp các kích thước n.

2) Đối với mỗi tập con như vậy, hãy tìm tất cả các hoán vị của tập hợp con có kích thước k.

Bài viết Wikipedia tham chiếu cung cấp thuật toán cho phần 2, vì vậy tôi sẽ không lặp lại ở đây. Thuật toán cho phần 1 khá giống nhau. . Để đơn giản, tôi sẽ mô tả nó cho "tất cả các tập con của kích thước k của số nguyên [0...n-1]

1) Bắt đầu với tập hợp con [0...k-1]

2) Để có được tập hợp con tiếp theo, đưa ra một tập hợp con S:

2a) Tìm nhỏ nhất jj ∈ S ∧ j+1 ∉ S Nếu j == n-1, không có tập con tiếp theo;.. chúng tôi đang thực hiện

2b) các yếu tố ít hơn j dạng một chuỗi i...j-1 (vì nếu bất kỳ giá trị nào bị thiếu, j sẽ không được tối thiểu). Nếu i không phải là 0, hãy thay thế các thành phần này bằng i-i...j-i-1. Thay thế phần tử j bằng phần tử j+1.

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