Gần đây tôi đã viết một số mã mà tôi nghĩ rất kém hiệu quả, nhưng vì nó chỉ bao gồm một vài giá trị, tôi đã chấp nhận nó. Tuy nhiên, tôi vẫn quan tâm đến một thuật toán tốt hơn cho các điều sau:
- Một danh sách các đối tượng X, mỗi đối tượng được gán một "trọng số"
- Tổng trọng lượng
- Tạo một số ngẫu nhiên từ 0 đến tổng
- Lặp lại qua các đối tượng, trừ đi trọng số của chúng từ tổng cho đến khi tổng không dương
- Xóa đối tượng khỏi danh sách, sau đó thêm nó vào cuối danh sách mới
Các mục 2,4 và 5 đều mất n
thời gian và do đó, đây là một O(n^2)
thuật toán.
Điều này có thể được cải thiện?
Như một ví dụ về shuffle có trọng số, một phần tử có cơ hội lớn hơn ở phía trước với trọng lượng cao hơn.
Ví dụ (Tôi sẽ tạo số ngẫu nhiên để biến nó thành sự thật):
6 đối tượng có trọng lượng 6,5,4,3,2,1; Tổng là 21
Tôi đã chọn 19 19-6-5-4-3-2 = -1
:, do đó, 2 đi ở vị trí đầu tiên, trọng lượng hiện là 6,5,4,3,1; Tổng là 19
Tôi đã chọn 16: 16-6-5-4-3 = -2
vì vậy 3 đi ở vị trí thứ hai, trọng lượng hiện là 6,5,4,1; Tổng là 16
Tôi đã chọn 3 3-6 = -3
:, do đó 6 đi ở vị trí thứ ba, trọng lượng hiện là 5,4,1; Tổng là 10
Tôi chọn 8 8-5-4 = -1
:, do đó 4 đi ở vị trí thứ tư, trọng lượng hiện là 5,1; Tổng là 6
Tôi đã chọn 5 5-5=0
:, do đó 5 đi ở vị trí thứ năm, trọng lượng bây giờ là 1; Tổng là 1
Tôi đã chọn 1: 1-1=0
vì vậy 1 đi ở vị trí cuối cùng, tôi không còn trọng lượng nữa, tôi kết thúc