复杂度为O(n)的取一组数中分布最密集的部分的算法

这篇博客介绍了如何通过排序和累加平均值的方法,找出一组数据中分布最密集的部分。算法以固定的阈值判断数值变化,将数据分为多个段,并记录每段的长度。最长的段被视为最密集区域,其平均值作为正常值的估计。通过示例代码展示了具体实现过程。
摘要由CSDN通过智能技术生成
    公司有一个检测系统,在单位时间内将每次检测结果保存。由于检测的环境受到外界干扰,会随机地出现异常值。以前的办法是:取得所有检测结果的最大值作为最终值。由于异常值的出现,导致检测结果非常不准确。于是思考在整个检测结果曲线中,取分布最密集的部分作为结果。(如果异常值大大多于正常值,且异常值的出现范围相同,则这种方法也不可靠。好在正常值是大多数) 
    算法实现的原理为:将N个数排序,从第一个数开始累加,然后除以个数得到n个数以来平均值,把平均值和当前的数比较,如果范围超出一个阈值,则认为后面的数属于下一个段,然后重新从当前数开始累加比较。遍历完成后就可以把整段数据分成若干个段,段以内的数值的变化都是比较小的。
    在遍历中记录下每个段的长度,就可以得出数据最多的段,此段就是分布最密集的地方。把此段的值取平均就得到了检测中的正常值。
   算法的源码如下:
#include  < stdio.h >
#include 
< string .h >

int  Data[]  =   { 2782023252632373844526769697281888892} ;
// 段的阈值,决定数值变化的大小
const   int  RANGE  =   3 ;

void  ShowSection( int  Data[],  int  Count)   // 显示数组中每个数据的分段结果
{
    
int* Sec = new int[Count];  //记录段的编号
    int nSum 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值