알고리즘 :: 함수의 반환값을 범위 점검할 때 abs 함수를 응용하자.
2009/02/26 13:45
abs 함수에 대해 다들 잘 아실 것입니다. 절대값을 구하는 함수지요. 이 abs 함수를 응용하면 함수의 반환값을 범위 점검할 때 걸리는 시간을 줄일 수 있습니다.
가령, 이와 같은 코드가 있다고 가정하겠습니다.
if((Func(i) > MIN) && (Func(i) < MAX));
Func 함수에서 반환된 값이 MIN ~ MAX 사이의 범위에 있는지 점검하는 코드입니다. 이 코드는 함수를 2회 호출합니다. 만약 1회만 호출하여 같은 연산을 할 수 있다면 시간상 유리할 것입니다.
아래 처럼요.
if(abs((Func(i)) - (MIN+MAX)/2) < (MAX-MIN)/2);abs 함수를 응용하였습니다. Func 함수의 반환값과 MIN ~ MAX 범위의 중간값의 차이가 MAX(혹은 MIN) 와 중간값의 차이보다 작은지 점검합니다. 즉, Func 함수의 반환값이 MIN ~ MAX 사이의 범위에 있는지 점검하는 것이죠. 위의 코드와 똑같이 작동합니다. 다만, 함수를 1회만 호출한 것이 차이입니다.
이 두 코드의 차이는 시간상으로 나타납니다. 그래서 두 코드의 결과를 비교해보겠습니다. 아래를 보시면,

abs 함수를 응용한 코드가 약 2배 정도 빠름을 알 수 있습니다. 만약 Func 함수가 시간이 제법 걸리는 함수라면 이 차이는 더욱 커지겠죠.
덧붙임
그런데 C 표준 라이브러리에는 왜 abs 함수가 stdlib.h에 있는건지 모르겠습니다. 멋모르고 math.h를 include했더니 경고만 나오더군요."0x07 알고리즘" 분류의 다른 글
| 알고리즘 :: 원탁의 기사 (The Knights of the Round Table) | 2010/06/09 |
| 자료구조 :: 양방향 원형 연결리스트 | 2010/01/01 |
| 자료구조 :: 크기가 조정되는 배열 스택 | 2009/12/20 |
| 알고리즘 :: 최적화된 에라토스테네스의 체 | 2009/02/23 |
| 알고리즘 :: floor 함수로 반올림하기 | 2009/02/20 |
Trackback Address:http://hisjournal.net/blog/trackback/171
int a = func(i);
if( (a > MIN) && (a < MAX) )
하시면 되지 않을까요
아! 그렇네요... (>_<);
이렇게 더 간단한 방법이...