我正在研究大量使用min()函数的算法来查找最少数量的三个数字。程序是用C / C ++语言编写的。暂时我用
min(number1,min(number2,number3))
但它占用了大约90%的CPU时间。什么是这个问题的最快解决方案?也许任何按位技巧或什么?
答案 0 :(得分:3)
只要您的编译器正在优化,那可能与您将获得的一样好。
#include <algorithm>
int test(int i, int j, int k)
{
return std::min(i, std::min(j, k));
}
使用g++ -S -c -O3 test.cpp
编译我得到了
cmpl %edi, %esi
movl %edx, %eax
cmovg %edi, %esi
cmpl %edx, %esi
cmovle %esi, %eax
ret
编译时可能没有传递任何优化标志?
答案 1 :(得分: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)
您可以从技巧2中删除-1。它仅适用于某些系统并且不可移植。
你可以扩展这个想法,找到至少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;
}
如果您的数字范围非常小,您甚至可以使用一些查找,或者更有效但是黑客攻击。