3

編集: 誰かがこれを読んでいるという奇妙な変更について、最後に 1 つ追加したいと思います。問題の 3 つの値が既にメモリ内にあり、それらが変更されていないと仮定すると、この偉業を達成するために少なくとも 14 の命令を数えることになります。

誰かができるなら、私はこれが非常に好きです。

【トップ編集終了】

問題は簡単です。3 つの整数値があり、最大値と最小値を見つける必要があります。最大とは、最小または中間ではないことを意味し、その逆も同様です。

オンラインで「質の高い解決策」を見つけることができなかったので、自分で試してみる必要がありました。

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

私が間違いを犯していないと仮定すると、これは 3 つの条件を使用して問題を解決するはずです。

意図したとおりに機能すると仮定すると、実際には私の努力に満足していますが、私の意図は最も効率的なアルゴリズムを見つけることでした.

よろしくお願いします。

編集:これまでに提案されたソリューションを確認しましたが、どれも素晴らしいものです。

これまでのところ私のお気に入り。

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個の条件文。それが印象的です。

'min' のエイリアスとして 'a' を使用して、上記の小さな改訂。

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

変数を交換する簡単な方法があれば... まあ、私が考えることができる唯一のことは、少なくとも C および C 派生物では、'max' の必要性を排除できるということです。メモリ使用量に関しては、余分な 4 バイトを費やす余裕があります。;)

4

8 に答える 8

4

あなたは3つしかないので、私は次のようなものを使用します:

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

使用している言語が正確にはわかりませんが、ほとんどすべての言語に最大機能があり、組み込みであるか、簡単にアクセスできます。

于 2012-09-02T14:48:54.933 に答える
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)
于 2012-09-02T16:02:59.987 に答える
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(decoded-inst.cache) に収まります。

于 2012-09-02T14:54:05.443 に答える
2

多分

 highest = a; lowest = a;
 if (b>a)
 {
     highest = b;
 }
 else
 {
     lowest = b;
 }
 if (c>highest)
 {
     highest = c;
 }
 else
 {
     if (c<lowest)
     {
         lowest = c;
     }
 }
于 2012-09-02T14:53:10.887 に答える
1

このソリューションでは、比較と比較を使用し2ます3

戻り値はカップル (最小、最大) です。

  • 与えられた 3 つの数字から 2 つの数字を選びます。
  • aそれらを比較して、小さい方と大きい方を呼びましょうb
  • 選ばれなかった番号にかけましょうc
  • c>=b の場合、(a, c) を返します。
  • c>=a の場合、(a, b) を返します。
  • (c, b) を返します。
于 2012-09-02T16:02:14.457 に答える
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
于 2012-09-02T14:59:33.557 に答える
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;
 }
于 2012-09-02T15:54:59.060 に答える
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;
}
于 2012-09-02T15:47:31.167 に答える