1

私は100個の数字のNSArrayを持っています。5つの数字のNSArrayを作成したいと思います。2番目の配列の最初の数値は、最初の配列の最初の20個の数値の平均です。2番目の数値は、最初の配列の20個の数値の2番目のセットの平均です。等々。

効率的なアルゴリズムについての人々のアイデアを聞きたいです。

私が持っていたアイデアの1つは、20個の数値の各セットに対してforループを実行し、20個の数値の一時NSArrayを作成することでした。次に、KVO平均操作を実行し、最終的なNSArrayに追加します。

注:私は常に誰かに答えを与えます、そして私はあなたの答えに賛成票を投じることを恥ずかしがり屋ではありません。私は多くの答えを奨励します。ありがとう!

4

3 に答える 3

2

20の数値セクションごとに値を加算し、20で除算して、適切な出力配列の場所に配置するだけです。配列BigO(n)を1回通過しますが、これ以上何を求めることができますか?これを計算する時間はごくわずかです。

于 2013-02-17T21:07:39.140 に答える
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 に答える
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には、100個の数値の5つの異なるセクションの平均を含む5つの値が含まれます。

更新しました:

この部分は、特別な好奇心を持った目のためだけのものです。

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;
}

doubleforループとNSObjectクラスを使用したソリューションよりも10倍高速です。

(残念ながら)それは最も醜い解決策でもありませんが、それが地獄のように速いことは間違いありません。その種の解決策は本当に良い効率を提供できるので、速度が本当に重要である以外はお勧めしません。

于 2013-02-17T21:51:44.497 に答える