@Override
  public void insert(Bin<T> bin) {
    addTotalCount(bin);
    if (isFrozen() && getBins().size() == getMaxBins()) {
      Double floorDiff = Double.MAX_VALUE;
      Bin<T> floorBin = floor(bin.getMean());
      if (floorBin != null) {
        floorDiff = Math.abs(floorBin.getMean() - bin.getMean());
      }
      Double ceilDiff = Double.MAX_VALUE;
      Bin<T> ceilBin = ceiling(bin.getMean());
      if (ceilBin != null) {
        ceilDiff = Math.abs(ceilBin.getMean() - bin.getMean());
      }
      if (floorDiff <= ceilDiff) {
        floorBin.sumUpdate(bin);
      } else {
        ceilBin.sumUpdate(bin);
      }
    } else {
      Bin<T> existingBin = get(bin.getMean());
      if (existingBin != null) {
        existingBin.sumUpdate(bin);
        if (isWeightGaps()) {
          updateGaps(existingBin);
        }
      } else {
         updateGaps(bin);
        _bins.put(bin.getMean(), bin);
      }
    }
  }