2012-05-02 39 views
8

Trong một chương trình tôi đang làm mà tạo ra đảo chữ cho một tập hợp các chữ cái, cách tiếp cận hiện tại của tôi là:Thuật toán cho các phép tính không lặp lại?

  1. Nhận tất cả các kết hợp của tất cả các chữ
  2. Lấy hoán vị của từng nhóm kết hợp
  3. Sắp xếp các hoán vị kết quả theo thứ tự abc
  4. Remove mục trùng lặp

câu hỏi của tôi gắn liền với toán học của hoán vị. Tôi tự hỏi nếu có thể tính toán kích thước mảng cần thiết để lưu trữ tất cả các mục còn lại sau khi loại bỏ các mục trùng lặp (sử dụng, nói, số lượng chữ cái lặp lại kết hợp với công thức hoán vị hoặc một cái gì đó).

Tôi xin lỗi về sự mơ hồ của câu hỏi của tôi, tôi vẫn đang nghiên cứu thêm về các kết hợp và hoán vị. Tôi sẽ cố gắng xây dựng mục tiêu của mình khi sự hiểu biết về sự kết hợp và hoán vị mở rộng, và một khi tôi làm quen với chương trình của mình (đó là dự án thời gian rảnh của mùa hè năm ngoái).

+0

Nhìn vào [Biến thể/Danh sách không lặp lại] (http://stackoverflow.com/questions/1900197/generating-variations-without-repetitions-permutations-in-java). Có một vài giải pháp khác nhau. – hariprasad

Trả lời

2

Nếu bạn có n yếu tố, và a[0] bản sao của một phần tử, a[1] bản sao của nguyên tố khác, và như vậy cho đến a[k], sau đó tổng số hoán vị khác nhau (lên đến bản sao) là n!/(a[0]! a[1]! ... a[k]!).

FYI, nếu bạn quan tâm, với Guava bạn có thể viết

Collection<List<Character>> uniquePermutations = 
    Collections2.orderedPermutations(Lists.charactersOf(string)); 

và kết quả sẽ là độc đáo hoán vị của các nhân vật, chiếm bản sao và tất cả mọi thứ. Bạn thậm chí có thể gọi phương thức .size() của nó - hoặc chỉ xem xét triển khai của nó cho các gợi ý. (Tiết lộ: Tôi đóng góp cho ổi.)

+0

anh ta không hỏi số lượng bản sao, bu cách nhận chúng. – keuleJ

+1

"Tôi tự hỏi nếu nó có thể phẳng ra tính toán kích thước mảng cần thiết để lưu trữ tất cả các mục còn lại sau khi loại bỏ các mục trùng lặp." Nghe có vẻ như yêu cầu số lượng hoán vị riêng biệt với tôi. –

+0

Âm thanh với tôi giống như có/không có câu hỏi :) – aviad

0

Tạo tất cả các hoán vị thực sự là ý tưởng tồi. Từ "tràn" ví dụ có 40320 hoán vị. Vì vậy, mức tiêu thụ bộ nhớ thực sự cao khi độ dài từ của bạn tăng lên.

Tôi tin rằng vấn đề bạn đang cố gắng giải quyết có thể được giảm xuống để tìm hiểu xem một từ có phải là đảo chữ cái của từ khác hay không.

Sau đó, bạn có thể giải quyết nó bằng cách đếm số lần mỗi chữ cái xuất hiện (nó sẽ là 26-tuple) và so sánh các tupples này với nhau.

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