У меня была эта проблема некоторое время, все еще пытаясь работать над решением.
Каков наилучший способ равномерного распределения элементов в списке с низким расхождением?
Скажем, у нас есть список или элементы в массиве:
Red, Red, Red, Red, Red, Blue, Blue, Blue, Green, Green, Green, Yellow
В идеале вывод будет иметь нечто вроде:
Red, Blue, Red, Green, Red, Yellow, Blue, Red, Green, Red, Blue, Green.
Где каждый экземпляр "как можно дальше" от другого экземпляра себя, насколько это возможно...
Когда я сначала попытался решить эту проблему, я должен признать, что я был наивным, поэтому я просто использовал какую-то форму посеянного случайного числа, чтобы перетасовать список, но это приводит к сгущению экземпляров.
Предложение началось с элемента с наивысшей частотой, поэтому красный будет помещен в положение n * 12/5 для n от 0 до 4 включительно.
Затем поместите следующий наиболее повторяющийся элемент (синий) в положения n * 12/3 + 1 для n от 0 до 2 включительно. Если что-то уже размещено там, просто поставьте его на следующее пустое место. и т.д. Однако при записи на бумаге это не работает при любых обстоятельствах,
Скажите, что список только
Red, Red, Red, Red, Red, Blue
Это не сработает.
Если в одной из опций есть три соседства с цветом
Red, Red, Blue, Red, Red, Red
Red, Red, Red, Blue, Red, Red
Так что, пожалуйста, любые идеи или реализации, как это сделать, были бы замечательными.
Если это важно, я работаю над objective-c, но сейчас все, о чем я забочусь, это методология, как это сделать.