至少三个数字

时间:2014-04-18 04:59:59

标签: c++ c algorithm min

我正在研究大量使用min()函数的算法来查找最少数量的三个数字。程序是用C / C ++语言编写的。暂时我用

  

min(number1,min(number2,number3))

但它占用了大约90%的CPU时间。什么是这个问题的最快解决方案?也许任何按位技巧或什么?

2 个答案:

答案 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;
}

如果您的数字范围非常小,您甚至可以使用一些查找,或者更有效但是黑客攻击。