Алгоритм Кадане в Scala

У кого-нибудь есть реализация Scala алгоритма Кадане, выполненная в функциональном стиле?

2 ответа

Решение

Как насчет этого:

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

Я предпочитаю складывающееся решение сканирующему решению, хотя в последнем есть определенная элегантность. Тем не мение,

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

Следующий код возвращает начальный и конечный индекс, а также сумму:


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)
Другие вопросы по тегам