int MedianMaintenance(MaxHeap<int>& heapLow, MinHeap<int>& heapHigh, int elem)
{
	if(heapLow.size() == heapHigh.size())
	{
		if(heapLow.size())
		{
			if(elem > heapHigh.get_min())
			{
				heapHigh.insert(elem);
				heapLow.insert(heapHigh.extract_min());
			}
			else
				heapLow.insert(elem);
		}
		else
			heapLow.insert(elem);
	}
	else
	{
		if(elem < heapLow.get_max())
		{
			heapLow.insert(elem);
			heapHigh.insert(heapLow.extract_max());
		}
		else
			heapHigh.insert(elem);
	}

	return heapLow.get_max();
}
Exemplo n.º 2
0
int main() {

    MaxHeap<int> maxheap = MaxHeap<int>(100);
    cout<<maxheap.size()<<endl;

    return 0;
}
 double findMedian() {
   /*
   Three cases: since abs(max_heap_.size() - min_heap_.size()) <= 1
   denote x as min(max_heap_.size() - min_heap_.size())
   1) size x and x means even elements so it just the average of max of first
   heap and min of second heap 2) size x + 1 and x means odd elements so the
   max of the first heap is the median element 3) size x and x + 1 means odd
   elements so the min of the second heap is the median element
   */
   if (max_heap_.size() == min_heap_.size()) {
     return (double)(max_heap_.top() + min_heap_.top()) / 2.0;
   } else if (max_heap_.size() > min_heap_.size()) {
     return max_heap_.top();
   } else {
     return min_heap_.top();
   }
 }
  void addNum(int num) {
    if (max_heap_.empty()) {
      max_heap_.push(num);
    } else {
      if (num > max_heap_.top()) {
        min_heap_.push(num);
      } else {
        max_heap_.push(num);
      }

      // Maintain abs(max_heap_.size() - min_heap_.size()) <= 1
      if (max_heap_.size() > min_heap_.size() + 1) {  // max_heap_ too large
        min_heap_.push(max_heap_.top());
        max_heap_.pop();
      } else if (min_heap_.size() >
                 max_heap_.size() + 1) {  // min_heap_ too large
        max_heap_.push(min_heap_.top());
        min_heap_.pop();
      }
    }
  }
Exemplo n.º 5
0
bool test_maxheap()
{
	MaxHeap<int> maxheap;
	int lim = 1000;
	for(int i = 0;i < lim; i++)
	{
		maxheap.insert(rand() % lim  + (rand() < (RAND_MAX/8)?-lim/10:lim));
	}
	int *max_sort = new int[maxheap.size()];
	int i = 0;
	while(maxheap.size())
	{
		max_sort[i++] = maxheap.remove_max();
	}
	i = 1;
	for(int i = 1; i < lim; i++)
	{
		if(max_sort[i] > max_sort[i-1])return false;
	}
	return true;
}
Exemplo n.º 6
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
	if( nrhs!=1 )
		mexErrMsgTxt("This function requires 1 arguments\n");
	if( !mxIsNumeric(prhs[0]) )
		mexErrMsgTxt("parameter 1 missing!\n");

	// retrieve the heap
	MaxHeap<double>*  heap;
	retrieve_heap( prhs[0], heap);

	// pop top element in the PQ
	plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
	*mxGetPr(plhs[0]) = heap->size();
}
Exemplo n.º 7
0
#include "../../data_structures/max_heap.hpp"

namespace max_heap_test {

  TEST_CASE( "Basic FIFO operations maintains max ordering", "[min_heap]" ) {
    MaxHeap<int> h;

    REQUIRE( h.size() == 0 );

    h.insert(5);
    REQUIRE( h.peek() == 5 );

    h.insert(4);
    REQUIRE( h.peek() == 5 );

    h.insert(6);
    REQUIRE( h.peek() == 6 );

    REQUIRE( h.pop() == 6 );
    REQUIRE( h.pop() == 5 );
    REQUIRE( h.pop() == 4 );

    for(int i=0; i<500; i++){
      h.insert(rand() % 100);
    }
    for(int i=0; i<h.size(); i++){
      REQUIRE( h.pop() >= h.peek() );
    }
  }

}