2016-12-08 15 views
2

나는 모든 X 번째 항목을 데시 메이팅하거나 추출하여 긴 배열을 다운 샘플링하려고합니다. 여기 데시 메이트 (decimating)를 통한 효율적인 어레이 다운 샘플링 방법은 무엇입니까?

내가 내 배열 연장을 가지고 무엇을 : 나는 원래 배열에 50-100k 항목을 기대하고있어 아마 화면의 기본 경계 너비로 다운 샘플링합니다

func downsampled(to threshold: Int) -> [T] { 
    // Validate that threshold falls in valid range 
    guard !isEmpty, 1...count ~= threshold else { return Array(self) } 

    let skip = (count/threshold) + 1 
    var index = 0 

    var items = [T]() 
    while index < count { 
     items.append(self[index]) 
     index += skip 
    } 

    return items 
} 

(500-1k 점) .

더 간결하고 효율적인 방법이 있습니까?

답변

5

그것은 아마 더 효율적이지 않다 그러나 나는 다음과 같이, :)으로 :,하는 :,에서 보폭 (위해 사용하는 것이 더 간결 것이라고 생각 :

extension Array { 
    func every(nth: Int) -> Array { 
     var result: Array = [] 
     stride(from: 0, to: count, by: nth).forEach { result.append(self[$0]) } 
     return result 
    } 
} 

놀이터 테스트

let array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15].every(nth: 2) 
array // [1, 3, 5, 7, 9, 11, 13, 15] 
+0

return enumerated(). filter {$ 0.0 % nth == 0} .map {$ 0.1}'는 약간 짧지 만 효율성은 떨어집니다. – Eendje

+0

왜'result.reserveCapacity()'를 호출하지 않겠습니까? –

+0

그래, 그 goalposts을 이동하십시오. :) – matt