2014-04-18 12 views
1

나는 min() 함수를 사용하여 세 개의 숫자 중 가장 작은 숫자를 찾는 알고리즘을 연구하고 있습니다. 프로그램은 C/C++ 언어로 작성됩니다. 일시적으로 나는최소 세 숫자

분 (숫자 1, 분 (번호 2, 번호 3))

를 사용하지만 CPU 시간의 약 90 %를했다. 이 문제의 가장 빠른 해결책은 무엇입니까? 어쩌면 어떤 비트 트릭이나 뭐?

+0

정수 제가 추정합니까? – Suedocode

답변

3

당신의 컴파일러가 최적화되어 있다면 아마 당신이 얻는 것만 큼 좋을 것입니다.

#include <algorithm> 

int test(int i, int j, int k) 
{ 
    return std::min(i, std::min(j, k)); 
} 

내가
cmpl %edi, %esi 
movl %edx, %eax 
cmovg %edi, %esi 
cmpl %edx, %esi 
cmovle %esi, %eax 
ret 

컴파일 할 때 아마 당신이 어떤 최적화 플래그를 통과하지 못한 얻을 g++ -S -c -O3 test.cpp 컴파일?

+0

답장을 보내 주셔서 감사합니다 . 나는 최적화를 사용했고 코드는 당신과 같지만 그것에도 불구하고 여전히 가장 많이 사용되는 함수이다. 어쩌면 내가 알고리즘의 논리를 변경해야합니다 ... – nosbor

1

확인 this 솔루션은 참조 위의 코드를 아래에 인용 당신에게

을 할 수있는 경우는

int x; // we want to find the minimum of x and y 
int y; 
int r; // the result goes here 

r = y^((x^y) & -(x < y)); // min(x, y) 

같은 제목 아래 또 하나의 트릭은

r = y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // min(x, y) 

당신은 제거 할 수 있습니다 -1 트릭 2에서입니다 일부 시스템에서만 작동하며 이식 가능하지 않습니다.

이 아이디어를 확장하여 최소 3 개의 숫자를 찾을 수 있습니다.

static inline int min3(int x, int y, int z) 
{ 
    register int r, d; 
    d = x - y; 
    r = y + (d & (d >> (sizeof(int) * CHAR_BIT))); /* add -1 if required */ 
    d = r - z; 
    r = z + (d & (d >> (sizeof(int) * CHAR_BIT))); /* add -1 if required */ 
    return r; 
} 

숫자의 범위가 너무 작 으면 일부 조회를 사용하거나 더 효율적이지만 해킹 할 수 있습니다.

+2

당신은 정말로 간단한 조작으로 컴파일러를 이길 수 없다. 코드는 std :: min (x, std :: min (y, z))에 대한 어셈블리 대 11의 명령어를 가지고 끝난다. – user657267

관련 문제