标签:一文 datalist sensor sum 算法 uint16 dt 数据 模拟
刚才刷手机看到今天脚本之家推送的一个文章《模拟管道算法的一次实际应用》 地址 https://mp.weixin.qq.com/s/89VfbuuB3Yz8sQFv2JwMYA
作者对问题的描述是 “”“
前段时间从事单片机开发的同学找我帮忙解决一个问题:有一个数据采集的设备,该设备定时对外进行数据采集。当数据采集小于5份时,记住所有的数据,并求和;
当数据采集超过5份时,只记住最近采集到的5份,并求和。
”“”
作者使用了顺序前移法,每次向后插入一个数据都需要把n-1个数据向前移动一次。那么问题来了,对于单片机来说其速度是硬伤(虽然也占用不了多少时间),可是总还是不优雅。此外,
如果对于具有1000个数据的情形是否还能这样靠移动呢? 分析一下这样移动的时间复杂度就是O(n)。
其实,我们还有更好的方法,可以让时间复杂度成为O(1)。使用什么方法呢,当然使用指针,移动指针,代码清晰简单,也无需过多解释:
#include <iostream> using namespace std; static const uint16_t DATALENGTH=5; //数据长度 static uint16_t datalist[DATALENGTH]={0}; static uint16_t *currentdata=datalist; void adddata(uint16_t dt) { *currentdata++=dt; if (currentdata==datalist+DATALENGTH) currentdata=datalist; } void printdata() { for (int i=0;i<DATALENGTH;i++){ cout<<datalist[i]<<'\t'; } cout<<endl; } void calsum() { uint32_t sum=0; for (int i=0;i<DATALENGTH;i++){ sum+=datalist[i]; } cout<<"The sum of sensor is :"<<sum <<endl; } int main() { uint16_t dt; while(1) { printdata(); cin>>dt; adddata(dt); calsum(); } return 0; }
输出:
0 0 0 0 0
1
The sum of sensor is :1
1 0 0 0 0
2
The sum of sensor is :3
1 2 0 0 0
3
The sum of sensor is :6
1 2 3 0 0
4
The sum of sensor is :10
1 2 3 4 0
5
The sum of sensor is :15
1 2 3 4 5
6
The sum of sensor is :20
6 2 3 4 5
7
The sum of sensor is :25
6 7 3 4 5
8
The sum of sensor is :30
6 7 8 4 5
9
The sum of sensor is :35
6 7 8 9 5
0
The sum of sensor is :30
6 7 8 9 0
这不是更清晰简单吗?
这里我想说的是,作者的想法没有问题但是如果数据很长的话,那就不是一个好的方法了。
我们有时候需要对问题真的做好分析,找到那个hit point。
不要说我太mean,有时候需要较较真。这个方法可能我自己也要使用。
还有,一般加和是不怎么用的,需要滤波是真的,中值滤波可以考虑下。
当然本文的算法即使数据长度修改为1000,10000。 插入新的数据仍然嗖的一下。因为时间复杂度是O(1)。
标签:一文,datalist,sensor,sum,算法,uint16,dt,数据,模拟 来源: https://www.cnblogs.com/yjphhw/p/11299597.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。