对《模拟管道算法的一次实际应用》一文的思考和修改
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了对《模拟管道算法的一次实际应用》一文的思考和修改,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2307字,纯文字阅读大概需要4分钟。
内容图文
刚才刷手机看到今天脚本之家推送的一个文章《模拟管道算法的一次实际应用》 地址 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)。
内容总结
以上是互联网集市为您收集整理的对《模拟管道算法的一次实际应用》一文的思考和修改全部内容,希望文章能够帮你解决对《模拟管道算法的一次实际应用》一文的思考和修改所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。