#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;
}
算法第六节(第7部分: 一个数据流中,随时可以取得中位数)
猜你喜欢
转载自blog.csdn.net/weixin_39804483/article/details/87824808
今日推荐
周排行