code: func (b *BucketFeedback) splitBucket(newNumBkts int, totalCount float64, originBucketCount float64) []bucket {
  	// Split the bucket.
  	bounds := b.getBoundaries(newNumBkts + 1)
  	bkts := make([]bucket, 0, len(bounds)-1)
  	for i := 1; i < len(bounds); i++ {
  		newBkt := bucket{&bounds[i-1], bounds[i].Copy(), 0, 0}
  		// get bucket count
  		_, ratio := getOverlapFraction(Feedback{b.lower, b.upper, int64(originBucketCount), 0}, newBkt)
  		countInNewBkt := originBucketCount * ratio
  		countInNewBkt = b.refineBucketCount(newBkt, countInNewBkt)
  		// do not split if the count of result bucket is too small.
  		if countInNewBkt < minBucketFraction*totalCount {
  			bounds[i] = bounds[i-1]
  			continue
  		}
  		newBkt.Count = int64(countInNewBkt)
  		bkts = append(bkts, newBkt)
  		// To guarantee that each bucket's range will not overlap.
  		setNextValue(&bounds[i])
  	}
  	return bkts
  }
docs: // splitBucket firstly splits this "BucketFeedback" to "newNumBkts" new buckets,
  // calculates the count for each new bucket, merge the new bucket whose count
  // is smaller than "minBucketFraction*totalCount" with the next new bucket
  // until the last new bucket.