我有100个号码的NSArray。我想创建一个5个数字的NSArray。第二个数组中的第一个数字是第一个数组中前20个数字的平均值。第二个数字是第一个数组中第二组20个数字的平均值。等等。
我很想听听人们对高效算法的看法。
我的一个想法是在每组20个数字上做一个for循环,创建一个20个数字的临时NSArray。然后执行KVO平均操作并添加到最终的NSArray。
注意:我总是将答案授予某人,而且我并不羞于投票给你答案。我鼓励很多答案。谢谢!
答案 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倍。
(联合国)幸运的是,它甚至都不是最丑陋的解决方案,但毫无疑问它是快死的,我不会推荐它除了速度真的很重要,因为这种解决方案可以提供非常好的效率。