Podziel kolekcję na równe części „k” (Scala, ale agnostyczne językowe)
Zdefiniowane przed tym blokiem kodu:
dataset
może być aVector
lubList
numberOfSlices
jestInt
oznaczający ile „czasów” pokroić zestaw danychChcę podzielić zestaw danych nanumberOfSlices
plasterki, rozłożone równomiernie. Przez „podzielony” myślę, że mam na myśli „partycję” (przecięcie wszystkich powinno być puste, zjednoczenie wszystkich powinno być oryginalne), aby użyć terminu teorii zbiorów, choć niekoniecznie jest to zbiór, tylko dowolna kolekcja.
na przykład
dataset = List(1, 2, 3, 4, 5, 6, 7)
numberOfSlices = 3
slices == ListBuffer(Vector(1, 2), Vector(3, 4), Vector(5, 6, 7))
Czy jest lepszy sposób na zrobienie tego niż to, co mam poniżej? (czego nie jestem nawet pewien, czy jest optymalny ...) A może to nie jest możliwe do wykonania algorytmicznie przedsięwzięcie, w którym to przypadku znana jest dobra heurystyka?
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
}