/// <summary> /// Gets the median based on the current elements in the stream /// </summary> /// <returns>median of the stream</returns> public double GetMedian() { if ((MinHeapInst.HeapSize + MaxHeapInst.HeapSize) % 2 != 0) { // odd number of elements in the stream return(MaxHeapInst.PeekMax()); } // even number of elements in the stream int mid1 = MaxHeapInst.PeekMax(); int mid2 = MinHeapInst.PeekMin(); return(mid1 + ((mid2 - mid1) / 2.0)); // This will prevent overflow }
/// <summary> /// Insert a value to the stream /// </summary> /// <param name="val"></param> public void Insert(int val) { if (MaxHeapInst.HeapSize == 0) { MaxHeapInst.Insert(val); return; } if (MaxHeapInst.PeekMax() > val) // The val needs to go in MaxHeap { if (MaxHeapInst.HeapSize > MinHeapInst.HeapSize) // Make sure MaxHeap.Count does not go beyond MinHeap.Count + 1 { MinHeapInst.Insert(MaxHeapInst.ExtractMax()); } MaxHeapInst.Insert(val); } else // The val needs to go in MinHeap { if (MinHeapInst.HeapSize == MaxHeapInst.HeapSize) // Make sure that the MinHeap.Count does not go beyond MaxHeap.Count { MaxHeapInst.Insert(MinHeapInst.ExtractMin()); } MinHeapInst.Insert(val); } }