본문으로 바로가기

고속연속평균-실시간평균

category 개발언어/c++ 2016. 9. 16. 18:31

프로젝트를 수행 하다 보면 조금 전혀 예상치 못한 난감한 상황을 맞이하는 경우가 있다.그리 어렵지 않아 보이는 문제다.
예를 들면 특정한 값이 계속 입력된다고 전제하고(특정 지역의 소음 값 등)이 입력 값의 평균을 실시간으로 계속 보여준다고 생각 해보자.평균을 구하는 것이니 매우 단순해 보인다.그러나 실제현업에서 요구하는 상황은 이렇다. 공장의 경우 기계가 가동될 때의 소음도 있고 정지 했을 때의 다른 소음도 있다. 이것을 측정하기 위해 매초마다 값을 측정하여 평균을 구한다고 생각해보자. 그리고 소음측정을 한곳에서만 하는 것이 아니라 100개의 지역을 나누어서 측정하고 100개 지역에 대해서 매초마다 평균 소음에 대한 측정값을 화면에 보여 준다고 전재 해보면 상황이 조금 어려워 진다. 또 이렇게 보여주는 값이 잠깐 동안 측정하는 것이 아니라 24시간 365일 가동되는 시스템이라면어떻게 해야 할 까? 평균을 산출하는 데이터의 갯수는 몇개 까지 한정 해야 할까? 대부분 수십 또는 수백 개 평균 합시다 라고 결론 할 것이다. 100개의 데이터를 평균한다고 가정하면 100*100의 데이터를 매초마다 평균해야 한다.데이터 입력이 매초마다 이루어지는 것이 아니고 1/1000 초 일 때는 문제가 더욱 복잡해 진다. 조금만 생각해도 만들 수 있는 간단한 알고리즘인데도 막상 만들어 보면 그렇게 단순하지만 않다. 처리하고 보면 너무나 간단하기 때문에 기어게 남지도 않는다. 종종 이런 유형의 작업을 할 때 기억을 더듬어 보지만, 기억에 없다. 쉽게 인터넷에서 검색을 해보지만 이름이 모호해서 검색에도 잘 발견되지 않는다.
!그래서 다시 메모를 해둔다.검색이 쉽도록 굳이 이름을 붙이자면 고속평균? 연속평균? 실시간평균? 순차적평균? 곧바로평균? 빠른평균? 입력값에 대한 평균? n번째 평균? 정도로 이름을 붙이는 것도 괜찮은 것 같다.

 

=입력되는 n 번째 숫자
= n 번째까지의 평균
평균을 구하는 식은

 

n번째까지의 합에서 입력된 개수 n을 나누는 것입니다.
수식을 변형 해보면

 

로 표현 될 수 있습니다.
말로 풀어서 설명하면 값이 입력 될 때 마다 이전까지 계산된 평균 값에다 마지막 입력된 값을 더하고 현재까지 입력된 값의 갯수를 나누면 된다. 

C++ 로 코드를 작성하면 다음과 같다.

Int An=0;
Int Vn=0;
Int n=0;
//1 부터 99 까지의 평균을 구하기

for( n = 1; n <= 100; n ++)
{
An=n;
Vn =(An+(n-1)* Vn)/n;
}

으로 간단히 표현된다.