2013-02-28 2 views
-3

평균, 중간 및 s.d.를 계산해야합니다. 벡터 내부 값의 평균을 찾기 위해 벡터를 정렬 할 수 있지만 물건을 추가하는 것보다 평균 및 표준 편차를 쉽게 찾을 수있는 방법이 있습니까?두배가 포함 된 벡터

+1

나는이 말을하기 전에 두 번 생각했습니다. 당신은 무엇을 시도 했습니까? –

+0

누적 알고리즘이 있습니다. – chris

+3

정확히 "추가하는"것에 대해 어려운 점은 무엇입니까? –

답변

1

중간 값은 std::nth_element입니다. (일반적으로 O (N) N) 정렬이 일반적으로 O (N) (선형) 인 정렬 (sorting)보다 더 빠릅니다. 당신이 std::accumulate을 UST 수

은 평균의 요소를 추가하려면, 뭔가 같은 :

double total = std::accumulate(std::begin(v), std::end(v), 0.0); 

[참고 : 컴파일러가 얼마나 오래된에 따라, 당신은 begin(v) and 말 대신 v.begin()v.end()을 사용해야 할 수도 있습니다 (v)`). ]

차이 계산은 previous question에 설명되어 있습니다. 표준 편차는 단순히 분산의 제곱근입니다.

+0

대단히 감사합니다! C의 관련 고차 기능 ++에 – user2117875

0

평균을 찾으려면 단순히 벡터 내용을 추가해야합니다. 실제로 벡터를 먼저 정렬하지 않고 중간 값을 찾을 수 있지만 정렬되지 않은 벡터에서 중앙값을 계산하는 알고리즘은 정렬 된 것보다 훨씬 더 복잡합니다. 또한 정렬되지 않은 벡터에서 중간 값을 찾는 데 걸리는 시간을 계산할 경우 중간 값을 정렬하고 추출하는 데 걸리는 시간보다 더 깁니다. (단지 기술적 인 도전을 위해 그것을하고 있다면, 나는 당신을 위해 하나를 쓸 것이다 ...)

아마 당신은 벡터를 정렬해야 할 것이므로, 당신은 평균을 계산할 수있다. 정렬.

+0

당신은 나를 여기에서 잃어 버렸습니다 ... '정렬되지 않은 벡터에서 중간 값을 찾는 시간을 계산한다면, 그것은 거의 중앙값을 정렬하고 추출하는 결합 된 시간보다 더 될 것입니다.' – amdn

0

편집 : C++ 태그를 보지 못했습니다!

기능 프로그래밍 도구를 제공하는 언어를 사용하는 경우 + 기능으로 벡터를 폴드하고 평균 길이로 나눌 수 있습니다.

stddev의 경우 람다 : x -> (x - mean)^2를 사용하고 결과를 +로 폴드 할 수 있습니다.

더 효율적이지는 않지만 개발자에게는 많은 시간을 절약 할 수 있습니다!

+0

정보 : http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29#Folds_in_various_languages ​​ http://en.wikipedia.org/wiki/Anonymous_function# C.2B.2B http://en.wikipedia.org/wiki/Map_%28higher-order_function%29#Language_comparison – David

관련 문제