取NSArray的平均分段

时间:2013-02-17 21:04:23

标签: ios algorithm nsarray key-value-observing

我有100个号码的NSArray。我想创建一个5个数字的NSArray。第二个数组中的第一个数字是第一个数组中前20个数字的平均值。第二个数字是第一个数组中第二组20个数字的平均值。等等。

我很想听听人们对高效算法的看法。

我的一个想法是在每组20个数字上做一个for循环,创建一个20个数字的临时NSArray。然后执行KVO平均操作并添加到最终的NSArray。

注意:我总是将答案授予某人,而且我并不羞于投票给你答案。我鼓励很多答案。谢谢!

3 个答案:

答案 0 :(得分:2)

只需在每个20个数字部分中添加值,除以20并放入相应的输出数组位置。这是一个通过阵列,大O(n),你还能要求什么?计算时间是微不足道的。

答案 1 :(得分:1)

以下简单有效:

NSArray *numbers = ... // array of 100 numbers
NSMutableArray *averages = [NSMutableArray array];

for (int = 0; i < 5; i++) {
    float total = 0.0;
    int base = i * 20;
    for (int j = 0; j < 20; j++) {
        float num = [numbers[base + j] floatValue];
        total += num;
    }

    float avg = total / 20.0f;
    [averages addObject:@(avg)];
}

NSLog(@"Averages = %@", averages);

答案 2 :(得分:1)

你可以尝试这样的事情......

NSArray *_array = // with the 100 numbers... (I used NSNumber object for each number)

NSMutableArray *_averages = [NSMutableArray array];
for (int i = 0; i < 5; i++) [_averages addObject:@([[[_array subarrayWithRange:NSMakeRange(i * 20, 20)] valueForKeyPath:@"@avg.floatValue"] floatValue])];

_averages将包含5个值,其中包含100个数字中五个不同部分的平均值。

<强>更新:

这部分仅适用于有额外好奇心的眼睛。

如果你试图避免NSObjects和双for循环,你可以实现一个非常快的算法,当然当你走低级别时,你也可以提高当前的速度,问题是:它真的需要吗?

NSInteger _segments = 1000; // it means 20.000 numbers;
Float64 _numbers[(_segments * 20)]; // fill this array as you'd like.

Float64 _averages[_segments];

for (int i = 0; i < _segments; i++) {
    NSInteger _offset = (_segments<<4)+4;
    _averages[i] = (_numbers[_offset] + _numbers[_offset+1] + _numbers[_offset+2] + _numbers[_offset+3] + _numbers[_offset+4] + _numbers[_offset+5] + _numbers[_offset+6] + _numbers[_offset+7] + _numbers[_offset+8] + _numbers[_offset+9] + _numbers[_offset+10] + _numbers[_offset+11] + _numbers[_offset+12] + _numbers[_offset+13] + _numbers[_offset+14] + _numbers[_offset+15] + _numbers[_offset+16] + _numbers[_offset+17] + _numbers[_offset+18] + _numbers[_offset+19]) / 20.f;
}

比使用double for for循环和NSObject类的解决方案快10倍。

(联合国)幸运的是,它甚至都不是最丑陋的解决方案,但毫无疑问它是快死的,我不会推荐它除了速度真的很重要,因为这种解决方案可以提供非常好的效率。