Недавно я написал некоторый код, который мне показался очень неэффективным, но, поскольку он содержал только несколько значений, я принял его. Тем не менее, я все еще заинтересован в лучшем алгоритме для следующего:
- Список X объектов, каждому из которых присваивается «вес»
- Подвести итоги
- Генерация случайного числа от 0 до суммы
- Перебирайте объекты, вычитая их вес из суммы, пока сумма не будет положительной
- Удалить объект из списка, а затем добавить его в конец нового списка
Пункты 2,4 и 5 все занимают n
время, и поэтому это O(n^2)
алгоритм.
Можно ли это улучшить?
В качестве примера взвешенной тасовки у элемента больше шансов оказаться впереди с большим весом.
Пример (я сгенерирую случайные числа, чтобы сделать это реальным):
6 предметов с весом 6,5,4,3,2,1; Сумма 21
Я выбрал 19: 19-6-5-4-3-2 = -1
таким образом, 2 идет в первую позицию, веса теперь 6,5,4,3,1; Сумма 19
Я выбрал 16: 16-6-5-4-3 = -2
таким образом, 3 идет на вторую позицию, веса теперь 6,5,4,1; Сумма 16
Я выбрал 3:, 3-6 = -3
таким образом, 6 идет на третью позицию, веса теперь 5,4,1; Сумма 10
Я выбрал 8: 8-5-4 = -1
таким образом, 4 идет на четвертой позиции, веса теперь 5,1; Сумма 6
Я выбрал 5: 5-5=0
таким образом, 5 идет в пятую позицию, веса теперь 1; Сумма 1
Я выбрал 1:, 1-1=0
таким образом, 1 идет в последней позиции, у меня больше нет весов, я заканчиваю