Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++求流数据的最大值

C++求流数据的最大值
EN

Stack Overflow用户
提问于 2017-04-03 17:58:51
回答 3查看 319关注 0票数 1

我有一个数据流,它在随机时间间隔内产生数值。现在,我需要连续地获得在特定时间间隔内产生的流的最大值,例如100毫秒。

我天真的做法是有一个缺陷的对和一个变量的最大值。如果传入值大于最大值,我将清除deque,否则我循环遍历deque,如果- ts大于我的回溯间隔,我将忽略它,否则检查它是否大于以前的值(除非它是第一个值)。如果是这样的话,我会保存迭代器。循环结束后,我将deque删除到(不包括我的最大迭代器)并设置新的最大值。

我只是想知道是否有一种更聪明、更优雅的方法可以通过使用不同的容器来完成这个任务。理想情况下,我应该坚持使用c++标准库中的某个容器。

编辑:有人建议一个优先级队列(答案被删除)。在这种情况下,我会创建一个成双成对的堆并告诉堆按值排序(或者如果不可能,创建一个带有字段时间戳和值的结构,并添加一个>操作符)。然后每次我得到最大值,我检查它是否过期,如果是,弹出它,并采取新的最大.这比我最初的方法好吗?

编辑:值不是唯一的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-03 21:07:58

如果数据足够小,可以很容易地适应您的CPU缓存(例如,100万float值),那么我们都在考虑这个问题。

只需存储一个std::deque< std::pair<float, timestamp> >

  • 当出现新值时,请使用push_back()
  • 当您需要查询max元素时,请调用pop_front(),直到清除所有过期值为止。那就打电话给std::max_element()吧。

如果没有缓存丢失,它将具有与涉及priority_queuemultiset等更精细的解决方案相同(或更好)的性能。

票数 3
EN

Stack Overflow用户

发布于 2017-04-03 18:17:02

==new update==

使用std::对值和时间戳的(max)堆。在c++11中,我正在讨论的堆是一个std::priority_queue。如果将值类型(而不是时间戳类型)作为对的第一个元素(即

代码语言:javascript
运行
AI代码解释
复制
std::pair<val_t,time_t> 

而不是

代码语言:javascript
运行
AI代码解释
复制
std::pair<time_t,val_t>

),那么您甚至不需要自定义比较器,因为std::结对比较将在默认情况下给出您想要的行为(优先比较pair.first,并且只在相同的情况下查看pair.second,在默认情况下使用std::->给出对w.r.t的最大堆。(第一值类型)。

插入/推送所有新值到(max)堆中。最大的价值将永远在最上面。在轮询时,检查顶部示例的时间戳(sample.second)和now()减去最近的窗口时间。如果太老了,就把它扔掉。某些值序列会导致堆在最大值下面隐藏陈旧值。当堆超过一定大小的阈值时,将其清空到一个新的阈值中,同时过滤出过期的值。这种情况与新样品的到达率非常不成比例,因为这与最近的窗口大小有关。

感谢@chrise建议修改我过早放弃的一个好主意

==previous update==

我最初的答复只回答了问题的一部分。我建议使用max_heap (std::priority_queue,默认情况下使用std::->最大堆)来维护最大值。这不包括最近的维修费用。您有两个独立的关注点,搜索最大成员资格和条件成员资格。更改现有堆上的成员资格规则(过期标准)将使堆失效,并给出难以根本原因的运行时错误。

相反,您可以使用一个成对列表(或deque,可能更好),但我使用了std::list的示例以及remove_if和一个跟踪最大值的谓词。这可以通过使用lambdas或创建函子类来实现。使用lambdas如下所示:

代码语言:javascript
运行
AI代码解释
复制
using sample = std::pair<unsigned,double>;
sample a{ 1,12.2 };
sample b{ 2,11.778 };
sample c{ 3,9.2 };
sample d{ 4,-2.6 };
sample e{ 5,10.1 };

std::list<sample> samples{ d,c,b,a };
cout << "list is: " << samples << endl << endl;
double maxval = -std::numeric_limits<double>::infinity();
unsigned cutoff = now() - timerange;
samples.remove_if([&maxval,cutoff](sample s) 
{
    //if older than cutoff, remove
    if (s.first < cutoff) return true;
    //otherwise, keep and update max
    maxval = std::max(maxval, s.second);
    return false;
});
cout << "max is: " << maxval << ", list is: " << samples << endl << endl;

有关完整示例,请参见http://ideone.com/O6UJPW

使用函式类如下所示:

代码语言:javascript
运行
AI代码解释
复制
using sample = std::pair<unsigned,double>;
sample a{ 1,12.2 };
sample b{ 2,11.778 };
sample c{ 3,9.2 };
sample d{ 4,-2.6 };
sample e{ 5,10.1 };

std::list<sample> samples{ d,c,b,a };
cout << "original list is: " << samples << endl;

double maxval(-std::numeric_limits<double>::infinity());
//eliminate samples older than 2
using pred = PredRetainMax<sample>;
samples.remove_if(pred(now() - timerange, maxval));
cout << "max is: " << maxval << ", list is: " << samples << endl << endl;

谓词看起来如下所示

代码语言:javascript
运行
AI代码解释
复制
template<class T>
struct PredRetainMax;

template<class Time, class Val>
struct PredRetainMax<std::pair<Time, Val>>
{
    PredRetainMax(Time cutoff, Val& m) :_cutoff(cutoff), _max(m) {}
    bool operator()(const std::pair<Time, Val>& s)
    {
        //if older than cutoff, remove
        if (s.first < _cutoff) return true;
        //otherwise, keep and update max
        _max = std::max(_max, s.second);
        return false;
    }
    Val get() { return _max; }
private:
    Time _cutoff;
    Val& _max;
};

完整的示例请参见http://ideone.com/qs153j

函子是通过对外部maxval的引用实例化的,因为stl将remove_if谓词作为副本,因此这是一种跟踪maxval的黑客行为。

==original响应below==

用一堆。在c++11中,它被称为std::priority_queue。插入/推送所有新值到(max)堆中。最大的价值将永远在最上面。

有关一些有用的用法示例,请参见queue

票数 3
EN

Stack Overflow用户

发布于 2017-04-03 20:24:53

只需保存两份数据:

  • std::deque< std::pair<timestamp, double> >
  • std::multiset<double>

当一个新的值到达时:

  1. 将其添加到两个容器中
  2. 清洗过时的价值,通过检查前面的德克。 a.如果deque的第一个值太旧(过期),请从(两个容器)中删除它。 重复,直到deque中的第一个值不是过期值为止。
  3. 最大值在末尾(a.k.a )。( rbegin())多集的。

性能说明:

多集插入和删除为O(log(N)),rbegin()为O(1)。如果性能确实是一个问题,并且您不介意使用boost,那么可以考虑使用boost::container::flat_multiset,它可以替代std::multiset,但速度要快得多(除非数据量很大)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43197078

复制
相关文章
C++怎么求三个数的最大值?
C++98的老码农们,应该都知道std::max() 函数可以从两个数中求最大值。
果冻虾仁
2021/12/08
4.8K0
C++怎么求三个数的最大值?
SQL求最大值的几种方式
insert into students values(1,'AARON',20);
BUG弄潮儿
2022/06/30
1.6K0
【运筹学】运输规划求最大值 ( 运输规划求最大值问题示例 | 转为运输规划求最小值的方式 )
在所有值都变为负数后 , 为了方便计算 , 给所有的值都加上一个正数 , 计算的数值虽然不同 , 但是最终的运输规划结果是相同的 ;
韩曙亮
2023/03/28
1.8K0
C语言矩阵求逆(c语言求矩阵的局部最大值)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129049.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
3.2K0
Power Pivot中求汇总后的最大值
今天在群里看到群友在询问一个案例,想着也来分析和分享下。 原数据: 目标数据: (一) 分析需求 先求销售合计,然后在计算出的销售合计的基础上求最大值。 求合计:这个是针对所有筛选条件进行的求和,所以
逍遥之
2020/03/24
1.5K0
【DP】花瓶插花求美学最大值
现在有F束不同品种的花束,同时有至少同样数量的花瓶被按顺序摆成一行,其位置固定于架子上,并从1至V按从左到右顺序编号,V是花瓶的数目(F≤V)。花束可以移动,并且每束花用1至F的整数唯一标识。标识花束的整数决定了花束在花瓶中排列的顺序,如果i<j,那么花束i必须放在花束j左边的花瓶中。每个花瓶只能放一束花。如果花瓶的数目大于花束的数目,则多余的花瓶空置。
echobingo
2019/05/22
7600
滑动窗口求最大值 leetcode 59
滑动窗口最大值问题 利用递减队列实现 Dequeue dequeue = new LinkedList<>(); 递减队列方法说明 peekFirst获取队头元素 pollFirsr队头元素出队 offerLast == add在队尾插入新元素
全栈程序员站长
2022/09/14
2730
【递归】递归求n个数中的最大值
🧓作者:每天都要记得刷题(●’◡’●) 🍉时间:2022/04/04 🍉本篇感悟:举一反三,由求 n的阶乘联想到递归求n个数中的最大值,对递归有了更深的了解。 文章目录 ⭐题目(代码😇在文末) ⭐递归思想 ⭐求前n个斐波那契数 ⭐具体代码(答案😇) ⭐题目(代码😇在文末) 使用递归求 55 ,22, 155, 77, 99这5个数中的最大值 ⭐递归思想 🎈Q: 什么是递归? A1:我们学过函数,知道了函数调用,函数调用就是一个函数调用其他函数,比如主函数调用求两个数之和。 A2:
MicroFrank
2023/01/16
1.4K0
求十个数中最大值和最小值-C++
效果图: Please input 10 number: 1 2 3 4 5 6 7 8 9 10 Max is :10 Min is :1 /* 功能:求十个数中最大值和最小值 日期:2013-09-08 */ #include<iostream> using namespace std; void maxMinValue(int *arr,int n); int main(void) { int arr[10]; int i,n=10; cout << "Please i
WindCoder
2018/09/20
3.4K0
JavaScript 函数求1-100的数字之和,数字之间求最大值
JavaScript 使用关键字 function 定义函数。 函数可以通过声明定义,也可以是一个表达式。 JavaScript 函数求1-100的数字之和 <script> function getSum(){ var sum = 0; for(var i = 1; i<=100; i++ ) { sum += i; } console.log(sum); } getSum(); </script> 数字之间求最大值 <script type="text/
梦溪
2021/09/09
1.3K0
C++ IO流_数据的旅行之路
程序中的数据总是在流动着,既然是流动就会有方向。数据从程序的外部流到程序内部,称为输入;数据从程序内部流到外部称为输出。
一枚大果壳
2022/09/16
8360
找出三个最大值求乘积
给你一个正数整型数组nums(不考虑有负数的情况),在数组中找出由三个数组装成的最大乘积值,并输出这个乘积
算法与编程之美
2022/02/17
5420
蚁群算法求函数最大值二
functionsants = edgeselection(ants, tau, P0, lamda, xl, xu, yl, yu)
mwangblog
2018/12/10
1.3K0
Python算法与数据结构--求所有子数组的和的最大值
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
用户1631416
2018/09/14
1.8K0
蚁群算法求函数最大值一
ants = initant(Ant, xl, xu, yl, yu); % 初始化蚁群
mwangblog
2018/12/10
2.1K0
蚁群算法求函数最大值一
[C] 最简单的一个求最大值的函数
int max(int a, int b) { (a>b)||(a=b); return a; }
轻舞飞扬SR
2021/02/24
5530
问与答81: 如何求一组数据中满足多个条件的最大值?
Q:在工作表中有一些数据,如下图1所示,我想要获取“参数3”等于“A”、”参数4“等于”C1“对应的”参数5”中的最大值,能够使用公式解决吗?
fanjy
2020/04/20
4.2K0
第八周算法提高求最大值
本文最后更新于 1163 天前,其中的信息可能已经有所发展或是发生改变。 #include<iostream> #include<cstring> using namespace std; int sum1=0,sum2=0,Max=0; int n; int a[105][3]; void dg(){ for(int j=0;j<n;j++){ if(a[j][2]==0&&(sum1+a[j][0])>=0&&(sum2+a[j][1])>=0){ sum1+=a[j][0]; su
Yuyy
2022/06/28
4250
js算法之求最大值及其下标
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> var a=Number(prompt("666")); var arr=[]; var max=0; for(var i=0;i<a;i++) { arr[i]=Number(prompt("6666")
贵哥的编程之路
2021/04/02
2.4K0
acm C语言求两个数最大值
C语言实验题――两个数比较 描述 求2个数中较大者。 输入 第一行为测试的数据组数N,接下来的N行分别是两个待比较的整数 输出 输出N行,每一行的值为每组数中较大的整数 样例输入 2 1 2 15 10 样例输出 2 15 #include <stdio.h> int a,b; int main(int argc, char const *argv[]) { scanf(“%d,%d”,&a,&b); if (a>b) { pr
kevinfaith
2018/09/18
2.8K0

相似问题

使用递归C++求向量中的最大值

16

求最大值

320

在向量c++中求结构结构的最大值

316

在阵列C++中求最小/最大值的索引

33

求函数的最大值

50
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档