Đối với một số lựa chọn của tập hợp phụ có nhiều cách để tăng tốc độ tính toán, nếu bạn không ngại làm một số tiền (có thể tốn kém) precomputation, nhưng không phải cho tất cả. Ví dụ: giả sử các tập con của bạn là {1,2}, {2,3}, {3,4}, {4,5}, ..., {n-1, n}, {n, 1}; sau đó cách tiếp cận ngây thơ sử dụng một phép toán số học cho mỗi tập con, và bạn rõ ràng không thể làm tốt hơn điều đó. Mặt khác, nếu tập con của bạn là {1}, {1,2}, {1,2,3}, {1,2,3,4}, ..., {1,2, ..., n} sau đó bạn có thể nhận được bằng với các số học số học n-1, trong khi cách tiếp cận ngây thơ là tồi tệ hơn nhiều.
Dưới đây là một cách để thực hiện precomputation. Nó sẽ không luôn luôn tìm thấy kết quả tối ưu. Đối với mỗi cặp tập con, hãy xác định chi phí chuyển đổi thành phút (kích thước chênh lệch đối xứng, kích thước Y - 1). (Sự khác biệt đối xứng của X và Y là tập hợp các thứ trong X hoặc Y nhưng không phải cả hai.) Vì vậy, chi phí chuyển đổi là số phép tính số học bạn cần làm để tính tổng các phần tử của Y, với tổng của X's. Thêm bộ trống vào danh sách các tập hợp con của bạn và tính toán cây kéo dài chi phí tối thiểu bằng thuật toán Edmonds (http://en.wikipedia.org/wiki/Edmonds%27_algorithm) hoặc một trong các biến thể nhanh hơn nhưng phức tạp hơn trên chủ đề đó. Bây giờ hãy chắc chắn rằng khi cây bao trùm của bạn có cạnh X -> Y bạn tính X trước Y. (Đây là "kiểu topo" và có thể được thực hiện hiệu quả.)
Điều này sẽ cho kết quả tối ưu dưới mức rõ ràng khi, ví dụ: bạn có {1,2}, {3,4}, {1,2,3,4}, {5,6}, {7,8}, {5,7,7,8}. Sau khi quyết định thứ tự hoạt động của bạn bằng cách sử dụng quy trình trên, bạn có thể thực hiện một bước tối ưu hóa, nơi bạn tìm thấy cách rẻ hơn để đánh giá tổng của mỗi tập hợp cho số tiền đã tính, và điều này có thể sẽ cho kết quả khá tốt trong thực tế.
Tôi nghi ngờ, nhưng không cố gắng chứng minh, rằng việc tìm kiếm một quy trình tối ưu cho tập hợp con các tập con nhất định là NP-hard hoặc tệ hơn. (Chắc chắn là tính toán; bộ tính toán có thể có mà bạn có thể làm là hữu hạn. Nhưng, đối mặt với nó, nó có thể cực kỳ tốn kém; có khả năng bạn sẽ theo dõi khoảng 2^n khoản tiền một phần, thêm bất kỳ một trong số chúng ở mỗi bước khác, và có tới khoảng 2 bước, cho một chi phí siêu ngây thơ (2^2n)^(n^2) = 2^(2n^3) hoạt động để thử mọi khả năng.)
Bất kỳ xấp xỉ nào về số lượng 'n' có thể là bao nhiêu? –
Câu trả lời có thể phụ thuộc vào những thứ như: Có phải hai "n" của bạn (số phần tử trong * A * và số lượng tập con) thực sự bằng nhau không? Họ lớn bao nhiêu? Các tập con là bao nhiêu? Bạn sẽ làm điều tương tự lặp đi lặp lại với "cùng một tập con"? (Lưu ý: rõ ràng * A * không thực sự là một bộ * * nhưng * một chuỗi * và có lẽ mỗi * Aj * được chỉ định bởi một nhóm các chỉ mục thành * A *.) –
_n_ là rất lớn, trong khi kích thước của tập con của A nhỏ hơn nhiều so với _n_. –