C++算法:数据流的中位数

简介: C++算法:数据流的中位数

题目

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。

例如 arr = [2,3,4] 的中位数是 3 。

例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。

实现 MedianFinder 类:

MedianFinder() 初始化 MedianFinder 对象。

void addNum(int num) 将数据流中的整数 num 添加到数据结构中。

double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

示例 1:

输入

[“MedianFinder”, “addNum”, “addNum”, “findMedian”, “addNum”, “findMedian”]
[[], [1], [2], [], [3], []]

输出

[null, null, null, 1.5, null, 2.0]

解释

MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1); // arr = [1]
medianFinder.addNum(2); // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3); // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

提示:

-105 <= num <= 105

在调用 findMedian 之前,数据结构中至少有一个元素

最多 5 * 104 次调用 addNum 和 findMedian

2023年5月版

有的优先队列(堆)

class MedianFinder {
public:
MedianFinder() {
}
void addNum(int num) {
m_qTopMax.emplace(num);
if (m_qTopMax.size() > m_qTopMin.size() + 1)
{
auto tmp = m_qTopMax.top();
m_qTopMax.pop();
m_qTopMin.emplace(tmp);
}
if (m_qTopMax.size() && m_qTopMin.size())
{
const int iTopMax = m_qTopMax.top();
const int iTopMin = m_qTopMin.top();
if (iTopMax > iTopMin)
{
m_qTopMax.pop();
m_qTopMin.pop();
m_qTopMax.push(iTopMin);
m_qTopMin.push(iTopMax);
}
}
}
double findMedian() {
if (m_qTopMax.size() == m_qTopMin.size())
{
return (m_qTopMax.top() + m_qTopMin.top()) / 2.0;
}
return m_qTopMax.top();
}
std::priority_queue m_qTopMax;
std::priority_queue<int,std::vector,std::greater> m_qTopMin;
};

8月第一版

用的可重复集合

class MedianFinder {
public:
MedianFinder() {
}
void addNum(int num) {
m_set.emplace(num);
if (1 == m_set.size())
{
m_it = m_set.begin();
}
if (num < *m_it)
{
m_iNum++;
}
while (m_iNum < m_set.size() / 2)
{
m_it++;
m_iNum++;
}
while (m_iNum > m_set.size() / 2)
{
m_it–;
m_iNum–;
}
}
double findMedian() {
if (1 & m_set.size())
{
return *m_it;
}
auto tmp = m_it;
–tmp;
return (*tmp + *m_it) / 2.0;
}
multiset m_set;
multiset::iterator m_it = m_set.begin();
int m_iNum = 0;//[m_set.begin(),m_it)的元素个数
};

优化版

减少集合数

class MedianFinder {
public:
MedianFinder() {
}
void addNum(int num) {
m_set.emplace(num);
if (m_set.end() == m_it )
{
m_it = m_set.begin();
return ;
}
if (num < *m_it)
{
m_iNum++;
}
while (m_iNum < m_set.size() / 2)
{
m_it++;
m_iNum++;
}
while (m_iNum > m_set.size() / 2)
{
m_it–;
m_iNum–;
}
}
double findMedian() {
if (1 & m_set.size())
{
return *m_it;
}
auto tmp = m_it;
–tmp;
return (*tmp + *m_it) / 2.0;
}
multiset m_set;
multiset::iterator m_it = m_set.begin();
int m_iNum = 0;//[m_set.begin(),m_it)的元素个数
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

| 鄙人想对大家说的话

|

|-|

|闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。|

| 墨家名称的来源:有所得以墨记之。 |

|如果程序是一条龙,那算法就是他的是睛|

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境:

VS2022 C++17


相关文章
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
671 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
45 0
|
2月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
2月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
2月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
2月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
26天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
44 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
90 5