Recientemente escribí un código que pensé que era muy ineficiente, pero como solo incluía unos pocos valores, lo acepté. Sin embargo, todavía estoy interesado en un mejor algoritmo para lo siguiente:
- Una lista de objetos X, a cada uno de ellos se le asigna un "peso"
- Resume los pesos
- Genera un número aleatorio de 0 a la suma
- Iterar a través de los objetos, restando su peso de la suma hasta que la suma no sea positiva
- Elimine el objeto de la lista y luego agréguelo al final de la nueva lista
Los ítems 2,4 y 5 toman ntiempo, por lo que es un O(n^2)algoritmo.
¿Se puede mejorar esto?
Como ejemplo de una combinación aleatoria ponderada, un elemento tiene una mayor probabilidad de estar al frente con un peso mayor.
Ejemplo (generaré números aleatorios para hacerlo real):
6 objetos con pesas 6,5,4,3,2,1; Suma es 21
Elegí 19: por lo 19-6-5-4-3-2 = -1tanto, 2 va en la primera posición, los pesos ahora son 6,5,4,3,1; Suma es 19
Elegí 16: por lo 16-6-5-4-3 = -2tanto, 3 va en la segunda posición, los pesos ahora son 6,5,4,1; Suma es 16
Elegí 3: por lo 3-6 = -3tanto, 6 va en la tercera posición, los pesos ahora son 5,4,1; Suma es 10
Escogí 8: 8-5-4 = -1entonces 4 va en la cuarta posición, los pesos ahora son 5,1; Suma es 6
Escogí 5: 5-5=0entonces 5 va en la quinta posición, los pesos ahora son 1; Suma es 1
Elegí 1: por lo 1-1=0tanto, 1 va en la última posición, no tengo más pesas, termino