Разделить коллекцию на «k» близко -к -равным частям (Scala, но независимо от языка)

Определяется перед этим блоком кода:

  • datasetможет быть VectorилиList
  • numberOfSlicesпредставляет собой Int, обозначающее, сколько «раз» нужно срезать набор данных

Я хочу разбить набор данных на numberOfSlicesсрезов, распределенных как можно более равномерно. Под «разделением» я подразумеваю «разделение» (пересечение всех должно быть пустым, объединение всех должно быть исходным ), если использовать термин теории множеств, хотя это не обязательно множество, просто произвольный набор.

например.

dataset = List(1, 2, 3, 4, 5, 6, 7)
numberOfSlices = 3
slices == ListBuffer(Vector(1, 2), Vector(3, 4), Vector(5, 6, 7))

Есть ли лучший способ сделать это, чем то, что я ниже? (в котором я даже не уверен, что он оптимален... )Или, возможно, это алгоритмически невыполнимая попытка, и в этом случае любая известная хорошая эвристика?

val slices = new ListBuffer[Vector[Int]]
val stepSize = dataset.length / numberOfSlices
var currentStep = 0
var looper = 0
while (looper != numberOfSlices) {
  if (looper != numberOfSlices - 1) {
    slices += dataset.slice(currentStep, currentStep + stepSize)
    currentStep += stepSize
  } else {
    slices += dataset.slice(currentStep, dataset.length)
  }
  looper += 1
}
19
задан adelbertc 12 July 2012 в 17:30
поделиться