问题:
如下图所示的问题,给定最小阈值、最大阈值以及一段数据队列,对数据队列中超过阈值部分的极值进行保存,即从队列中得到P1-P6
计算规则
规则类似状态机
首先定义last_type标志位:
{
上一时刻大于
m
a
x
_
t
h
:
l
a
s
t
t
y
p
e
=
1
上一时刻在
m
a
x
_
t
h
和
m
i
n
_
t
h
之间
:
l
a
s
t
t
y
p
e
=
0
上一时刻小于
m
i
n
_
t
h
:
l
a
s
t
t
y
p
e
=
−
1
\left\{ \begin{array}{l} 上一时刻大于max\_th : last_type = 1 \\ 上一时刻在max\_th和min\_th之间 : last_type = 0 \\ 上一时刻小于min\_th : last_type = -1 \\ \end{array} \right.
⎩
⎨
⎧上一时刻大于max_th:lasttype=1上一时刻在max_th和min_th之间:lasttype=0上一时刻小于min_th:lasttype=−1
定义存储数据为最终返回的数据data
规则
{
不符合阈值直接
l
略过
如果当前为
d
a
t
a
是空
−
直接放入
d
a
t
a
如果
d
a
t
a
最后数据
l
a
s
t
_
t
y
p
e
为
−
1
并且当前大于阈值直接放入
d
a
t
a
如果
d
a
t
a
最后数据
l
a
s
t
_
t
y
p
e
为
1
并且当前大于阈值
d
a
t
a
b
a
c
k
=
m
a
x
(
d
a
t
a
b
a
c
k
,
当前值
)
如果
d
a
t
a
最后数据
l
a
s
t
_
t
y
p
e
为
−
1
并且当前小于阈值
d
a
t
a
b
a
c
k
=
m
i
n
(
d
a
t
a
b
a
c
k
,
当前值
)
直接放入
d
a
t
a
如果
d
a
t
a
最后数据
l
a
s
t
_
t
y
p
e
为
1
并且当前小于阈值直接放入
d
a
t
a
\left\{\begin{array}{l} 不符合阈值直接l略过 \\ 如果当前为data是空-直接放入data \\ 如果data最后数据last\_type为-1并且当前大于阈值直接放入data \\ 如果data最后数据last\_type为1并且当前大于阈值data_back = max(data_back,当前值) \\ 如果data最后数据last\_type为-1并且当前小于阈值data_back = min(data_back,当前值)直接放入data \\ 如果data最后数据last\_type为1并且当前小于阈值直接放入data \end{array} \right.
⎩
⎨
⎧不符合阈值直接l略过如果当前为data是空−直接放入data如果data最后数据last_type为−1并且当前大于阈值直接放入data如果data最后数据last_type为1并且当前大于阈值databack=max(databack,当前值)如果data最后数据last_type为−1并且当前小于阈值databack=min(databack,当前值)直接放入data如果data最后数据last_type为1并且当前小于阈值直接放入data
代码
#include "iostream"
#include "deque"
#include "vector"
#include "math.h"
// 搜索最值
using namespace std;
// 寻找周期的最大值最小值
class FindMM
{
private:
double max_th;
double min_th;
deque<double> mDataQue;
public:
FindMM(double _max_th, double _min_th){
max_th = _max_th;
min_th = _min_th;
}
~FindMM(){
}
int last_type = 0;
int type(double _data){
if(_data < min_th) return -1;
if(_data >= min_th && _data <= max_th) return 0;
return 1;
}
void push_back(double _data){
if(_data >= min_th && _data <= max_th){
return;
}
if(last_type == 0){
mDataQue.push_back(_data);
last_type = type(_data);
return;
}
// 大于情况
if(_data > max_th && (last_type == -1)){
mDataQue.push_back(_data);
last_type = type(_data);
return;
}
if(_data > max_th && (last_type == 1)){
if(_data > mDataQue.back()){
mDataQue.back() = _data;
}
return;
}
// 小于情况
if(_data < min_th && (last_type == 1)){
mDataQue.push_back(_data);
last_type = type(_data);
return;
}
if(_data < min_th && (last_type == -1)){
if(_data < mDataQue.back()){
mDataQue.back() = _data;
}
return;
}
}
void print(){
for(int i = 0; i < mDataQue.size(); ++i){
std::cout << mDataQue[i] << " ";
}
std::cout << std::endl;
}
};
int main(void){
int max_th = 1;
int min_th = -1;
FindMM finder(max_th, min_th);
vector<double> fuction;
for(double i = 0; i < 10; i += 0.2){
fuction.push_back(sin(i)*2);
std::cout << fuction.back() << " ";
}
std::cout << std::endl;
for(int i = 0; i < fuction.size(); ++i){
finder.push_back(fuction[i]);
}
finder.print();
return 0;
}