数组取平均压缩

后台蓝牙采集到的数据量很大,比如有1389条数据,但是在界面上只能显示30个数据点,多了的话这回影响界面美观。那么这样我们后台向前台提供数据时需要将数据压缩成30个点。1389/30=46.3。如果简单将每46个数据取平均或者没47个取平均都会影响精度。所以基本想法是将0.3作为修正因子,每隔46加0.3。直到修正因子达到1 或者1以上时,就将47个数据取平均,再将小数部分作为修正因子。由于只需要循环一次即可,因此时间复杂度为o(n)。算法代码如下:

-(NSArray *)mergeArray:(NSArray*)array toArrayLength:(NSUInteger) length
{
    NSMutableArray *resultArray=[[NSMutableArray alloc] init];
    
    if (array==nil || length<=0 || length>array.count)
    {
        return nil;
    }
    
    /*
     x: 平均个数的整数部分  如 average=2.6  则x=2
     y: 平均个数的小数部分  如 average=2.6  则y=0.6
     z: 用于累加
     */
    CGFloat average=(float)array.count/length;
    int  x=(int)average;
    CGFloat y=average-x;
    int count=0;
    CGFloat sum=0;
    CGFloat z=0;
    
    for (int i=0;i<array.count; i++)
    {
        sum+=[array[i] intValue];
        if (count==x-1)
        {
            z=z+y;
        }
        
        count++;
        
        if (count==(int)(x+z) || count==array.count-1)
        {
            [resultArray addObject:[NSNumber numberWithFloat:sum*1.0/count]];
            sum=0;
            count=0;
            if (z>1)
            {
                z=z-1;
                
            }
        }
    }
    return  resultArray;
}


posted @ 2015-03-19 21:46  皮拉夫大王  阅读(265)  评论(0编辑  收藏  举报