algorithm - 将集合划分为 "k"接近相等的部分(Scala,但与语言无关)

标签 algorithm scala slice

在此代码块之前定义:

  • dataset 可以是 VectorList
  • 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
}

最佳答案

如果 xs.grouped(xs.size/n) 的行为对您不起作用,则可以很容易地准确定义您想要的内容。商是小块的大小,余数是大块的个数:

def cut[A](xs: Seq[A], n: Int) = {
  val (quot, rem) = (xs.size / n, xs.size % n)
  val (smaller, bigger) = xs.splitAt(xs.size - rem * (quot + 1))
  smaller.grouped(quot) ++ bigger.grouped(quot + 1)
}

关于algorithm - 将集合划分为 "k"接近相等的部分(Scala,但与语言无关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456107/

相关文章:

c++ - 像素距离泛光填充

sql-server - SQL使用什么算法?

python - 如何在 Pandas 中获取数据框的列片

go - 在 go routine 中追加 slice

java - 在 Apache spark 中,使用 mapPartitions 和结合使用广播变量和映射有什么区别

generics - slice 的通用 remove() 函数

algorithm - 如何充分计算这个矩阵

algorithm - 日历调度算法

scala - 使用 if-else 中的重复代码减少代码重复

scala - Scala是否具有将Seq [Option [T]]转换为Seq [T]的API方法?