Niedawno napisałem kod, który uważałem za bardzo nieefektywny, ale ponieważ zawierał tylko kilka wartości, zaakceptowałem go. Nadal jednak interesuje mnie lepszy algorytm dla następujących elementów:
- Lista X obiektów, z których każdy ma przypisaną „wagę”
- Zsumuj wagi
- Wygeneruj losową liczbę od 0 do sumy
- Iteruj przez obiekty, odejmując ich wagę od sumy, aż suma będzie dodatnia
- Usuń obiekt z listy, a następnie dodaj go na końcu nowej listy
Pozycje 2,4 i 5 zajmują n
czas, więc jest to O(n^2)
algorytm.
Czy można to poprawić?
Jako przykład tasowania ważonego element ma większą szansę na bycie z przodu o większej masie.
Przykład (wygeneruję liczby losowe, aby były prawdziwe):
6 obiektów o wadze 6,5,4,3,2,1; Suma wynosi 21
Wybrałem 19: 19-6-5-4-3-2 = -1
więc 2 idzie na pierwszą pozycję, wagi są teraz 6,5,4,3,1; Suma wynosi 19
Wybrałem 16: 16-6-5-4-3 = -2
więc 3 idzie na drugą pozycję, ciężary są teraz 6,5,4,1; Suma wynosi 16
Wybrałem 3: 3-6 = -3
w ten sposób 6 idzie na trzecią pozycję, wagi są teraz 5,4,1; Suma wynosi 10
Wybrałem 8: 8-5-4 = -1
w ten sposób 4 idzie na czwartą pozycję, wagi są teraz 5,1; Suma wynosi 6
Wybrałem 5: 5-5=0
tak więc 5 idzie na piątej pozycji, ciężary są teraz 1; Suma wynosi 1
Wybrałem 1: 1-1=0
w ten sposób 1 idzie na ostatnią pozycję, nie mam już ciężarów, kończę