Могу я вычислить элемент без перебора всех предшествующих элементов в моем случае (см. тело вопроса)?

У меня есть 2 массива Double одинаковой длины. Массив a заполнен некоторыми данными, массив b должен быть вычислен.

Каждый элемент массива b равен соответствующему значению из массива a плюс взвешенная сумма всех предшествующих элементов в массиве b.

Взвешенная сумма вычисляется путем сложения всех этих элементов, каждый из которых умножается на коэффициент, равный его расстоянию от текущего элемента, который мы вычисляем, деленному на количество элементов в предыдущем подмножестве.

Для реализации этого цикла I через все предыдущее подмножество для каждого рассчитываемого мной элемента.

Можно ли это оптимизировать? У меня недостаточно математических навыков, но я подозреваю, что могу использовать только первый предыдущий элемент для вычисления каждого следующего, поскольку каждый элемент уже получен из предыдущего набора и содержит всю информацию о нем, уже взвешенную. Может быть, я могу просто скорректировать формулу веса и получить тот же результат без цикла второго уровня?

Это похоже на пример в Scala (я не уверен, что это правильно: -]). Поскольку в реальном проекте используются отрицательные индексы, рассматривать (1) и (2) как предшествующие (0) в терминах задачи, описанной выше.


import scala.Double.NaN
val a = Array[Double] (8.5, 3.4, 7.1, 5.12, 0.14, 5)
val b = Array[Double] (NaN, NaN, NaN, NaN, NaN, 5)
var i = b.length - 2
while (i >= 0) {
  b(i) = a(i) + {
    var succession = 0.0
    var j = 1
    while (i + j < b.length) {
      succession += b (i+j) * (1.0-j.toDouble/(b.length - i))
      j += 1
    }
    succession
  }
  i -= 1
}
b.foreach((n : Double) => println(n))

7
задан Cœur 7 July 2019 в 07:06
поделиться