definiti prima questo blocco di codice:Partizione una raccolta in "k" close to uguale pezzi (Scala, ma il linguaggio agnostico)
dataset
può essere unVector
oList
numberOfSlices
è unInt
denotare quante "volte" per segmentare dataset
Voglio dividere il set di dati in fette numberOfSlices
, distribuite nel modo più uniforme possibile. Con "split" intendo dire "partizione" (l'intersezione di tutti dovrebbe essere vuota, l'unione di tutti dovrebbe essere l'originale) per usare il termine di teoria dell'insieme, sebbene questo non sia necessariamente un insieme, solo una raccolta arbitraria.
ad es.
dataset = List(1, 2, 3, 4, 5, 6, 7)
numberOfSlices = 3
slices == ListBuffer(Vector(1, 2), Vector(3, 4), Vector(5, 6, 7))
C'è un modo migliore per farlo rispetto a quello che ho qui sotto? (che non sono nemmeno sicuro sia ottimale ...) O forse questo non è uno sforzo gestibile dal punto di vista algoritmico, nel qual caso qualsiasi nota euristica valida?
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
}
Non sono sicuro di come interpretare "distribuito nel modo più uniforme possibile". Seguendo il tuo codice, 'Seq: grouped (Int)' fa già ciò che vuoi, tranne che non va mai al di sopra della dimensione dello slice. – Kaito
Sembra 'raggruppato' dividerlo in gruppi di" x "mentre io voglio dividere una raccolta in gruppi" x ". L'ho provato nella risposta, 'List (1, 2, 3, 4, 5) .grouped (2) .toList' dà' List (List (1, 2), List (3, 4), List (5)) 'mentre io voglio qualcosa come' List (List (1, 2), List (3, 4, 5)) '. – adelbertc