2013-02-17 33 views
1

的段的平均I具有100個數字的一​​個NSArray。我想創建一個5個數字的NSArray。第二個數組中的第一個數字是第一個數組中前20個數字的平均值。第二個數字是第一個數組中第二組20個數字的平均值。等等。採取的NSArray

我很好奇,想聽到人們的想法,一個高效的算法。

我有一個想法是做對每一組20個號碼的for循環,創建20個數字組成一個臨時的NSArray。然後執行KVO平均操作並添加到最終的NSArray中。

注:我總是獎答案的人,我毫不避諱地投了你的答案。我鼓勵許多答案。謝謝!

+3

我完全錯過使用志願這裏.... – Till 2013-02-17 21:07:14

+3

點很簡單 - 寫代碼。您可能會想出使用KVO或任何其他保證更慢,更隱晦的「幻想」方案。除非這是進入一個晦澀難懂的代碼競賽或其他類似的東西,否則只需編寫代碼! – 2013-02-17 21:09:53

+0

@Till,maddy向我解釋KVO與鍵值編碼不同。現在我明白你的評論。謝謝你的評論。 – 2013-02-18 01:07:36

回答

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); 
+1

當談到效率時,可以通過省略內循環內的乘法20來獲得一些結果。不難想象如何做到這一點...... – Till 2013-02-17 21:20:53

+1

另一點,你正在使用一個雙值來分割,改變符號爲20.0f,以備用另一個隱式類型轉換。 – Till 2013-02-17 21:22:06

+1

@Zaph'@(avg)'是'[NSNumber numberWithFloat:avg]'的縮寫。 – rmaddy 2013-02-17 21:23:55

2

僅僅通過20中的值相加在每20數段,分而放於適當的輸出陣列位置。這是一個通過陣列大O(n),你還能要求什麼?計算這個的時間是微不足道的。

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倍。

(聯合國)幸運的是,它甚至不是最醜的解決方案,但毫無疑問它是快速的地獄,我不會推薦它除了速度真的的事情,因爲那種解決方案,可以提供效率真的很好。

+1

@eddieios這不是志願(鍵 - 值觀察),它的鍵 - 值編碼 – rmaddy 2013-02-18 00:47:39

+1

FYI - 我在我的答案異形對一個該解決方案平均此代碼。需要較長的時間的50倍來執行我的解決方案!當然這種解決方案是很多不夠快,如果你只有100個號碼,你不是做計算超過幾十倍。 – rmaddy 2013-02-18 00:58:27

+0

@maddy,你只教了我3讓我成爲更好的程序員的東西。謝謝。我也很感激你花時間來剖析代碼。我真的很喜歡你的答案。請繼續關注並回答我的問題,我一定會對您的答案進行投票。再次感謝。 – 2013-02-18 01:05:30