比较对象的3个数字属性

时间:2013-08-16 05:42:59

标签: c++ algorithm

我想知道比较数字的三个数字属性并确定最低值和最高值的最快和最有效的方法。 假设我有一个跟随道具的对象

obj.a = 5;
obj.b = 13;
obj.c = 2;

现在我需要计算最低值(2)和最高值(13);

我有一个选项是使用条件语句因此有三个条件用于检查最大元素,三个条件用于最低元素。导致6个条件语句。我的其他选项是在向量中推送这些值,然后从中检索极值一个排序的矢量。有替代方法吗?有什么建议 ?

5 个答案:

答案 0 :(得分:2)

如果使用C + 11是可以的,你可以这样做:

auto result = std::minmax({a, b, c});

result.first将保留最小值,result.second最大值 - 此处为live demo

答案 1 :(得分:1)

不超过三个的解决方案比较:

struct Obj
{
    int a;
    int b;
    int c;
    std::pair<int,int> getMinMax() const
    {
        std::pair<int,int> minmax = a< b ? std::make_pair(a,b) : std::make_pair(b,a);
        if (c < minmax.first )
            minmax.first = c;
        else if (c > minmax.second)
            minmax.second = c;
        return minmax;
    }
};

答案 2 :(得分:1)

为2个变量创建Min()函数:

int Min(int x, int y)
{
    return y ^ ((x ^ y) & -(x < y));
}

同样,2个变量的最大值为:

int Max(int x, int y)
{
    return x ^ ((x ^ y) & -(x < y));
}

现在将这个函数称为3个变量:

int max = Max(a,Max(b,c));
int min = Min(a,Min(b,c));

这些方法非常有效,可用于任何数量的变量比较。

它使用了

这个概念
  1. 数字的XOR本身为0

  2. 0的数字的XOR是数字本身。

  3. 同样,这可以用于N次数字比较的嵌套调用。

    注意:您甚至可以将x<y替换为x-y>>31(将X视为32位有符号整数)。

    我非常确定它不会比3号码更有效

答案 3 :(得分:0)

我正在给出伪代码:

a[0] = obj.a
a[1] = obj.b
a[2] = obj.c

获得最大值:

index = int(obj.a < obj.b)
larger = a[index]

largest = a[(larger > obj.c) ? index : 2]

获得最小的:

index = int (obj.a > obj.b)
smaller = a[index]

smallest = a[(smaller < obj.c) ? index : 2]

进行2 + 2比较。

答案 4 :(得分:0)

一旦你发现a是最小值,你就不必再考虑它了。因此,任何分别确定最小值和最大值的解决方案都是次优的。

有3种方法可以订购3件东西:abc acb bac bca cab cba。所以没有解决方案可以用少于6个分支。

这个解决方案有6个分支,每个案例最多3个比较,所以我希望它是最佳的:

if (obj.a < obj.b)
{
  if (obj.b < obj.c)
  {
     min = obj.a; max = obj.c;  // abc
  }
  else if (obj.c < obj.a)
  {
     min = obj.c; max = obj.b;  // cab
  }
  else
  {
     min = obj.a; max = obj.b;  // acb
  }
}
else
{
  if (obj.a < obj.c)
  {
     min = obj.b; max = obj.c;  // bac
  }
  else if (obj.c < obj.b)
  {
     min = obj.c; max = obj.a;  // cba
  }
  else
  {
     min = obj.b; max = obj.a;  // bca
  }
}

修改: 显然,这很慢。我想这与条件跳转有关。有条件的举动更好:

也许这个更好,虽然它仍然有一个分支:

if (obj.a < obj.b)
{
   min = std::min(obj.a, obj.c);
   max = std::max(obj.b, obj.c);
}
else
{
   min = std::min(obj.b, obj.c);
   max = std::max(obj.a, obj.c);
}

终止最后一个分支会把它变成其他答案之一:

  min = std::min(std::min(obj.a, obj.b), obj.c);
  max = std::max(std::max(obj.a, obj.b), obj.c);

底线:谁会想到'天真'的方法比写出来更快!