Нещодавно я написав якийсь код, який вважав дуже неефективним, але оскільки він містив лише кілька значень, я його прийняв. Однак мене все ще цікавить кращий алгоритм для наступного:
- Список 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 йде в останню позицію, у мене більше немає ваг, я закінчую