рассчитать скользящее среднее без какой-либо специальной структуры данных - PullRequest
0 голосов
/ 30 сентября 2018

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

public class MovingAverage {
  private final Queue<BigDecimal> window = new ArrayDeque<>();
  private final int period;
  private BigDecimal sum = BigDecimal.ZERO;

  public MovingAverage(int period) {
    this.period = period;
  }

  public void add(BigDecimal num) {
    sum = sum.add(num);
    window.add(num);
    if (window.size() > period) {
      sum = sum.subtract(window.remove());
    }
  }

  public BigDecimal getAverage() {
    if (window.isEmpty())
      return BigDecimal.ZERO;
    BigDecimal divisor = BigDecimal.valueOf(window.size());
    return sum.divide(divisor, 2, RoundingMode.HALF_UP);
  }
}

1 Ответ

0 голосов
/ 30 сентября 2018

Считает ли массив фиксированной длины «особую структуру данных»?Если бы не вы могли сделать что-то вроде этого:

public class MovingAverage {
  private final BigDecimal[] window;
  private final int period;
  private int size;
  private int idx;
  private BigDecimal sum = BigDecimal.ZERO;

  public MovingAverage(int period) {
    this.period = period;
    window = new BigDecimal[period];
  }

  public void add(BigDecimal num) {    
    if(size < period)
      size += 1;
    else 
      sum = sum.subtract(window[idx]);

    sum = sum.add(num);
    window[idx++] = num;
    if(idx == period) idx = 0;
  }

  public BigDecimal getAverage() {
    if (size == 0)
      return BigDecimal.ZERO;
    BigDecimal divisor = BigDecimal.valueOf(size);
    return sum.divide(divisor, 2, RoundingMode.HALF_UP);
  }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...