Vấn đề đa dạng tối đa đơn giản hóa


7

Vấn đề đa dạng tối đa yêu cầu chọn mục từ danh sách mục, sao cho độ đa dạng được xác định là khoảng cách số liệu giữa các mục được tối đa hóa.mn

Tôi có một vấn đề đơn giản hơn, mà tôi đã hy vọng tôi có thể giải quyết theo cách đơn giản hơn. Trong trường hợp của tôi, tôi có một danh sách gồm mục với một khóa không duy nhất. Tôi muốn chọn mục từ danh sách của mình để số lượng mục tối đa trên mỗi khóa được giảm thiểu .nm

ví dụ: nếu danh sách của tôi là:

('a', 5), ('b', 4), ('c', 2), ('a', 6), ('b', 5)

và chúng ta phải chọn mục, một giải pháp tối ưu sẽ là một danh sách chứa một mục cho mỗi khóa.m= =3

Có một thuật toán để làm điều này đơn giản hơn các thuật toán cho Bài toán Đa dạng Tối đa không?


1
Bạn đã thử những gì? Bạn bị kẹt ở đâu? Chúng tôi không muốn chỉ đưa cho bạn giải pháp; chúng tôi muốn bạn có được sự hiểu biết Tuy nhiên, vì chúng tôi không biết vấn đề tiềm ẩn của bạn là gì, vì vậy chúng tôi không thể bắt đầu giúp đỡ. Xem ở đây để thảo luận có liên quan. Nếu bạn không chắc chắn làm thế nào để cải thiện câu hỏi của mình, tại sao không hỏi xung quanh trong Trò chuyện Khoa học Máy tính ? Bạn cũng có thể muốn kiểm tra các câu hỏi tham khảo của chúng tôi .
Raphael

@Raphael - Tôi không phải là chuyên viên CS, vì vậy nghiên cứu của riêng tôi đã dẫn tôi đọc về Vấn đề Đa dạng Tối đa, nhưng điều này có vẻ hơi quá mức. Tôi có một số phương pháp phỏng đoán mà tôi nghĩ đến, nhưng tôi không nghĩ chúng rất hiệu quả. Đây là một vấn đề thực tế mà tôi gặp phải, không phải là một bài tập nào.
nbubis

Nếu có k các khóa khác nhau thì nguyên tắc pigeonhole ngụ ý rằng sự đa dạng tối đa của bạn ít nhất là m/k; và điều này có thể đạt được.
Yuval Filmus

@Yuvalfilmus - Đúng. Câu hỏi là làm thế nào.
nbubis

Trên thực tế tôi lấy lại rằng nó luôn luôn có thể đạt được. Nhưng có vẻ như một chiến lược tham lam nên hoạt động.
Yuval Filmus

Câu trả lời:


3

Các thuật toán sau nên làm việc.

Thuật toán tiến hành trong nhiều vòng. Tại mỗi vòng, hãym'là số lượng các mặt hàng còn lại để lấy. Lấy một mục trên mỗi khóa, tối đam'các mục, và loại bỏ các mục này. Nếu chúng ta lấym'các mục, thuật toán chấm dứt. Nếu không, tiếp tục vòng tiếp theo.

Chúng tôi để lại bằng chứng chính xác (hoặc một ví dụ mẫu) cho người đọc.


Cảm ơn! Tôi đã thêm câu trả lời của riêng mình để đưa ra giải pháp tương tự trong một lần chạy.
nbubis

3

Nghĩ về nó nhiều hơn một chút, tôi nghĩ rằng tôi có một thuật toán "một lần vượt qua" để giải quyết vấn đề này.

Để đó đi n các mặt hàng với k chìa khóa, với nicác mục cho mỗi phím. Chúng tôi muốn chọnmTôinTôi, như vậy mà ΣmTôi= =mvà đó tối đamTôi được giảm thiểu.

Rõ ràng, nếu cho tất cả nTôi chúng ta có nTôi>m/k, chúng tôi chỉ cần chọn mTôi= =m/k. Mặt khác, chúng tôi sử dụng thuật toán sau:

  1. Đếm số lượng vật phẩm cho mỗi phím (nTôi) và sắp xếp chúng theo thứ tự tăng dần.
  2. Trong khi nTôim/k bộ mTôi= =nTôi
  3. Cho tất cả nTôi>m/k, chọn mTôi= =m-Σj<Tôimjk-Tôi+1

Thuật toán này nên Ôi(n) trong độ dài của danh sách, giả sử số lượng các khóa khác nhau là không đáng kể so với.

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.