简体   繁体   中英

calculate moving average without any special data structure

I recently had an interview where I was given a situation in which I need to calculate moving average given a period. I came up with below solution but interviewer said he wanted me to do this without any special data structure because the DS will take some space? Is there any other better way to do this without any data structure?

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);
  }
}

Does a fixed length array count as a "special data structure"? If not you could do something like this:

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);
  }  
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM