算法第六节(第7部分: 一个数据流中,随时可以取得中位数)

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
using namespace std;
//
//  test.h
//  test
//
//  Created by 吴珝君 on 2018/12/31.
//  Copyright  ©   2018年 闲着也是贤者. All rights reserved.
//
/************************************************************************/
/************************************************************************/
/* 
一个数据流中,随时可以取得中位数
*/
/************************************************************************/
/************************************************************************/
/* 算法思想:
	用两个堆来实现,一个大顶堆,用来保存较小的n/2个数,一个小顶堆,用来包村较大的数



*/
/************************************************************************/
class  Midian 
{
public:
	int getMedian(vector<int> v)
	{
		for (int i = 0 ; i < v.size(); i++)
		{
			if (pMax.empty())
			{
				pMax.push(v[i]);
			}
			else
			{
				if (v[i] > pMax.top())
				{
					pMin.push(v[i]);
				}
				else
				{
					pMax.push(v[i]);
				}
			}
			if (pMax.size() - pMin.size() ==2)
			{
				pMin.push(pMax.top());
				pMax.pop();
			}
			else if (pMin.size() - pMax.size() == 2)
			{
				pMax.push(pMin.top());
				pMin.pop();
			}
		}//处理数据
		
		//获取结果
		if (pMax.size() == pMin.size())
		{
			return (pMax.top() + pMin.top())/2;
		}
		if (pMax.size() - pMin.size() == 1)
		{
			return pMax.top();
		}
		else
			return pMin.top();
		
	}
private:
	 priority_queue<int, vector<int>, less<int>> pMax;//大顶堆 放置比较小的一半数
	  priority_queue<int, vector<int>, greater<int>> pMin;//小顶堆 放置比较大的一半数
}; 
//优先级队列
class project
{
public:
	project(int c, int p)
	{
		cost = c;
		profit = p;
	}
	int cost;
	int profit;
};

int main()
{
	vector<int> v;
	for (int i = 0 ; i <11; i++)
	{
		v.push_back(rand() % 11 +1);
	}
	Midian m_;
	cout <<m_.getMedian(v) <<endl;
	for (int i = 0 ; i <10; i++)
	{
		sort(v.begin(),v.end(),less<int>());
		cout << v[i] <<" ";
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39804483/article/details/87824808