最有效的算法,用于查找三个值中较大和较小的值

时间:2012-09-02 14:46:38

标签: algorithm comparison performance

编辑: 奇怪的是,有人正在读这个,我想补充一点。 假设有问题的三个值已经在内存中并且没有被更改,我已经计算了不少于14条指令才能实现这一壮举。

如果有人可以的话,我非常喜欢这个。

[热门编辑结束]

问题很简单。我有三个整数值,我需要找到最大和最小的值。最大的意思是不是最小的或介于两者之间,反之亦然。

由于我无法在网上找到“质量解决方案”,我不得不自己尝试。

if(a > b) {
  if(a > c) {
    high = a;
    if(b > c) {
      low = c;
    }
    else {
      low = b;
    }
  }
  else {
    if(b > c) {
      high = b;
      low = c;
    }
    else {
      high = c;
      low = b;
    }
  }
}
else if(a > c) {
  if(b > c) {
    high = b;
    low = c;
  }
  else {
    high = c;
    low = b;
  }
}
else {
  low = a;
  if(b > c) {
    high = b;
  }
  else {
    high = c;
  }
}

假设我没有犯任何错误,这应该使用三个条件解决问题。

假设它按预期工作,我对我的努力非常满意,但我的目的是找到最有效的算法,因此我现在问你那是什么。

最好的问候。

编辑: 我已经回顾了到目前为止提出的解决方案,他们都很好。

到目前为止我最喜欢的。

if(a>b) {
  max = a;
  min = b;
}
else {
  max = b;
  min = a;
}
if(c>max)
  max = c
else if(c< min)
  min = c
如果我没有弄错的话,有2-3个贴纸和2-3个条件。这令人印象深刻。

上述的小修订,使用'a'作为'min'的别名。

if(a>b) {
  max = a;
  a = b;
}
else {
  max = b;
}
if(c>max)
  max = c
else if(c< a)
  a = c

如果只有一种简单的方法来交换变量......那么,我唯一能想到的就是可以消除'max'的需要,至少在C和C衍生品中,肯定不会有效,除了在内存使用方面,我可以额外花费额外的4个字节。 ;)

8 个答案:

答案 0 :(得分:4)

由于你只有3,我会使用类似的东西:

Maximum = max(a, max(b,c))
Minimum = min(a, min(b,c))

我不确定您使用的是哪种语言,但大多数语言都具有最大功能,内置或易于访问。

答案 1 :(得分:3)

if(a>b){swap(a,b);    /* in other words: a=a^b;b=a^b;a=a^b; */}
if(a>c){swap(a,c);    /*in other words: a=a^c;c=a^c;a=a^c;  */}
if(b>c){swap(b,c);    /*in other words: b=b^c;c=b^c;b=b^c;  */}
//now a is the smallest, c is the largest, but names are changed
high=c;
low=a;

如果你绝望,

void swap(int & x, int & y)  //<--- yes it needs to be pass by reference
{
    __asm
    {
       movaps xmm5,[x]
       movaps xmm6,[y]   
       movaps [x],xmm6
       movaps [y],xmm5   //i cant say anything without trying ^^
    }

    return;

}

只有3次比较=较少的cpu错误分支预测和总循环指令将足够小以适应cpu-loop-cache(decode-inst.cache)

答案 2 :(得分:3)

def min_max(a, b, c):
    if a > b:
        min, max = b, a   # two assignments
    else:
        min, max = a, b   # ditto

    if c > max:
        max = c
    elif c < min:
        min = c

    return (min, max)

答案 3 :(得分:2)

也许

 highest = a; lowest = a;
 if (b>a)
 {
     highest = b;
 }
 else
 {
     lowest = b;
 }
 if (c>highest)
 {
     highest = c;
 }
 else
 {
     if (c<lowest)
     {
         lowest = c;
     }
 }

答案 4 :(得分:1)

这使用了3次比较和3次或4次分配。

min = max = a;

if a < b
    max = b
else
    min = b

if b < c
    if c > a:
        max = c
else
    if c < a:
        min = c

答案 5 :(得分:1)

此解决方案使用23之间的比较。

返回值是夫妻(最小,最大)。

  • 选择3个给定数字中的2个数字。
  • 比较它们,然后拨打较小的a和较大的b
  • 让我们拨打未挑选的号码c
  • 如果c> gt = = b则返回(a,c)。
  • 如果c> = a,则返回(a,b)。
  • return(c,b)。

答案 6 :(得分:0)

计算/枚举开关应该给编译器足够的自由来最小化(条件)跳转量:

#include <stdio.h>

static inline void minmax3(int*themin,int*themax, int a, int b, int c)
{
switch(
          1 * (a>b)
        + 2 * (a>c)
        + 4 * (c>b)
        ) {
        case 0: *themin = a; *themax = b; break;
        case 1: *themin = b; *themax = a; break;
        case 2: *themin = c; *themax = b; break;
        case 3: *themin = b; *themax = a; break;
        case 4: *themin = a; *themax = c; break;
        case 5: *themin = b; *themax = c; break;
        case 6: *themin = b; *themax = c; break;
        case 7: *themin = b; *themax = a; break;
        }
return ;
}

int main(void)
{
int a,b,c,mi,ma;

for (a=0; a <3; a++) {
        for (b=0; b <3; b++) {
                for (c=0; c <3; c++) {

                        minmax3( &mi, &ma, a, b, c);
                        printf("a=%d b=%d c=%d min=%d max=%d\n"
                        , a, b, c, mi, ma
                        );
        }}}
return 0;
}

答案 7 :(得分:0)

if(a>=b)
 {if(a>=c)
   {MAX=a;
    MIN=c;
    if(c>=b)
     MIN=b;
     }
  else
   MAX=c,MIN=b;
 }
else
{if(b>=c)
   {MAX=b;
    MIN=c
    if(c>=a)
     MIN=a;
     }
  else
   MAX=c,MIN=a;
 }