Scala中的Kadane算法

时间:2012-01-28 00:22:47

标签: scala functional-programming kadanes-algorithm

有没有人以功能样式完成Kadane's algorithm的Scala实现?

3 个答案:

答案 0 :(得分:14)

这个怎么样:

numbers.scanLeft(0)((acc, n) => math.max(0, acc + n)).max

答案 1 :(得分:6)

我更喜欢扫描解决方案的折叠解决方案 - 尽管后者确实很优雅。无论如何,

numbers.foldLeft(0 -> 0) {
  case ((maxUpToHere, maxSoFar), n) =>
    val maxEndingHere = 0 max maxUpToHere + n
    maxEndingHere -> (maxEndingHere max maxSoFar)
}._2

答案 2 :(得分:0)

以下代码返回开始和结束索引以及总和:


import scala.math.Numeric.Implicits.infixNumericOps
import scala.math.Ordering.Implicits.infixOrderingOps

case class Sub[T: Numeric](start: Index, end: Index, sum: T)

def maxSubSeq[T](arr: collection.IndexedSeq[T])(implicit n: Numeric[T]) =
  arr
    .view
    .zipWithIndex
    .scanLeft(Sub(-1, -1, n.zero)) {
      case (p, (x, i)) if p.sum > n.zero => Sub(p.start, i, p.sum + x)
      case (_, (x, i))                   => Sub(i, i, x)
    }
    .drop(1)
    .maxByOption(_.sum)