1

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

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

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

注意:我总是将答案授予某人,并且我并不羞于对您的答案进行投票。我鼓励许多答案。谢谢!

4

3 回答 3

2

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

于 2013-02-17T21:07:39.140 回答
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 循环和NSObject类的解决方案快 10 倍。

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

于 2013-02-17T21:51:44.497 回答
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);
于 2013-02-17T21:15:38.010 回答