2016-10-13 120 views
0

我有一個數組,我想從每個第四個元素(在這種情況下,每4個,從1開始)開始,每個第n個元素的平均值。什麼是最快的方法來做到這一點?快速數組的每個第n個元素的平均值

我目前的方法是一個for循環與循環切換語句,但我想知道是否有一個更快的方法。

我想,如果這樣的事情可以工作:

let num_array = [1,2,3,4,5,6,7,8] 
let mean4th = num_array[Array(stride(from: 1, to: num_array.count, by: 4))].reduce(0, +)/(num_array.count/4) 

希望能得到mean4th = 3(即(1 + 5)/ 2)

這將返回錯誤

Cannot subscript a value of type 'Array<UInt8>' with an index of type 'Array<Int>' 

。 。我正在努力避開

+0

爲什麼你想讓它更快,更不可讀?你必須每秒啓動這個代碼x次?這是一個有數千個數字的數組? – FredericP

+0

確實。我希望這可以運行在一個500k的元素陣列上,頻率爲60 Hz – Ian

+0

我目前用for循環得到的頻率約爲25 Hz – Ian

回答

0

我不明白你的意思是什麼Hz在您的意見,但要做到這一點的方法之一是生成所有的元素,你要去參觀,並從那裏迭代指數:

let num_array = [1,2,3,4,5,6,7,8] 
let indices = Array(stride(from: 0, to: num_array.count, by: 4)) 

let mean = Double(indices.reduce(0) { $0 + num_array[$1] })/Double(indices.count) 
0

陣列不能使用序列作爲它的下標,但你可以把它寫不同

let mean4th = stride(from: 0, to: num_array.count-1, by: 4).reduce(0) {$0 + num_array[$1] }/(num_array.count/4) 

使用索引(代碼不同)是在正確的軌道上,但在非常大的陣列,構建臨時索引陣列增加了處理時間(一個500K元件陣列上的5倍以上)的想法

我在MacBook Pro上獲得500K(在操場上)的時間是0.41毫秒,遠低於60赫茲所需的16.7毫秒。你可能做得更多,只是這個平均的計算,儘管越快越好。