请教算法问题,是找出10个数中超过平均值正负10%的方法

[复制链接]
1229|3
手机看帖
扫描二维码
随时随地手机跟帖
zgjzgjkyo|  楼主 | 2019-8-21 10:05 | 显示全部楼层 |阅读模式
详细是这样的
有10个数值,然后求出这些数值的平均值。

但难点就是要剔除超过平均值正负10%的数值(也就是假如有1个数值是超过余下9个数平均值的正负10%,就删除那个1数值,再剩下的9个数值求平均值)

最少要求出5个数值的平均值(这5个数都是没有超过平均值正负10%的)

现在的问题是:
1、先求10组数平均值再找出哪个超过10%数值的话,那超过正负10%的数值必然会拉低或升高了平均数值,造成无法正确找出超过10%数值。
2、超过正负10%的数值可能不一定是只有1个,也有可能2个、3个...等等(只要不超过5个的话)

我目前想到的
第一步是先用冒泡算法,求出最小到最大数值的排序。
第二步直接求中间值第5和第6位数值的平均值,再看有没有超过10%
第三步就是4、5、6平均值,再看有没超过10%
第四步就是5、6、7平均值,再看有没超过10%
第五步就是4、5、6、7平均值,再看有没超过10%
然后如此类推

1、但我觉得这样的算法实在太复杂了,估计也占相当的资源,不知大家有没有更好的算法?
2、这个算法如何用C程序写出来呢?(实际上数值可能不止10个(这里我只是举个例),可能是100个、1000个等等,也就是数组不定,但是要求出这数组一半数值的平均值是没超过正负10%)





使用特权

评论回复

相关帖子

tianxj01| | 2019-8-21 10:34 | 显示全部楼层
你把问题想复杂了。
如果我们换个角度思考呢?
像这样的采样数据,很明显不会是一个快速变化的数据,在上一个平均周期和下一个平均周期,如果我们周期定的合理,那么我们完全可以做到该2个周期的平均数差是一个不超过+0.1%-0.1%这样的数据。根据这个思路,上周期的平均数,则完全可以作为下周期的参考,只需要找出不超过±10%的数据,参加积分、平均,就可以获得新一个采样周期的平均数据,这样的运算量将是非常小的,连排序都不需要。
当被采样数据超一个方向较快速度变化时候,这样的采样规则,自然会在实际参与数据正偏差更多或者负偏差更多的情况下被成功刷新,从而还是能很好的跟踪实际数据情况,再给你提出一个问题,那就是,从第一次开始,我们没有前一次的参考该怎么办?很简单,做个标记,前几次我们可以不管三七二十一,所有数据都统计进去参与计算平均数,过了几个周期,数据就会稳定到我们可以使用的范围。

使用特权

评论回复
zgjzgjkyo|  楼主 | 2019-8-21 10:47 | 显示全部楼层
tianxj01 发表于 2019-8-21 10:34
你把问题想复杂了。
如果我们换个角度思考呢?
像这样的采样数据,很明显不会是一个快速变化的数据,在上一 ...

你这样说也对。如果采集的次数非常多,这样不停的统计,终是比较好找出平均值。

但如果采样的数值不够(如2小时采集一次,一天才12次)然后求出1天里的平均值,次数少,又要防止采集超差。那还是只能用上面的方法了?

使用特权

评论回复
tianxj01| | 2019-8-21 10:55 | 显示全部楼层
zgjzgjkyo 发表于 2019-8-21 10:47
你这样说也对。如果采集的次数非常多,这样不停的统计,终是比较好找出平均值。

但如果采样的数值不够( ...

低概率采集,怎么复杂的算法都不过分,根本不会挤占多少系统资源,也就是代码多点而已吧?
我讨论的当然的高密度连续采集,只有这样,计算量和计算时间,才会是占用系统资源的根本因素,这时候,化简计算模型就变的至关重要。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

213

帖子

4

粉丝