下面是我的伪代码。

function highest(i, j, k)
{
  if(i > j && i > k)
  {
    return i;
  }
  else if (j > k)
  {
    return j;
  }
  else
  {
    return k;
  }
}

我认为作品,但在C最有效的方式++?

有帮助吗?

解决方案

要找到你需要看看究竟3个整数,不多不少是最大的。你在看6 3比较。你应该能够做到这一点在图3和2进行比较。

int ret = max(i,j);
ret = max(ret, k);
return ret;

其他提示

伪代码:

result = i
if j > result:
  result = j
if k > result:
  result = k
return result

如何
return i > j? (i > k? i: k): (j > k? j: k);

两个比较,没有使用瞬态临时堆叠变量...

您当前的方法: http://ideone.com/JZEqZTlj (0.40s)

克里斯的溶液:

int ret = max(i,j);
ret = max(ret, k);
return ret;

http://ideone.com/hlnl7QZX (0.39s)

通过伊格纳西奥巴斯克斯 - 拉姆斯解决方案:

result = i;
if (j > result)
  result = j;
if (k > result)
  result = k;
return result;

http://ideone.com/JKbtkgXi (0.40s)

和查尔斯BRETANA的:

return i > j? (i > k? i: k): (j > k? j: k);

http://ideone.com/kyl0SpUZ (0.40s)

这些测试,所有的解决方案将在3%以内的时间来执行作为其他的量。你正在设法优化的代码是非常短的,因为它是。即使你能挤出1所指示出来,这是不太可能使整个程序的整体的巨大差异(现代编译器可能赶上小优化)。花时间在其他地方。

修改更新了测试,结果发现它仍然之前优化它的部分进行。但愿这不是了。

对于这样的问题,请只有了解正是你的优化编译器在做什么,只是有什么可用的硬件的替代品。如果你有基本工具是二进制比较或二进制最大,两个比较或最大的是必需的,就足够了。

我更喜欢伊格纳西奥的溶液:

result = i;
if (j > result)
  result = j;
if (k > result)
  result = k;
return result;

由于在共同现代Intel硬件,编译器会发现它非常容易发出短短两年的比较和两个cmov指令,其放置在分支预测比条件分支在I-cache中一个较小的载荷和更小的压力。 (另外,代码清晰,易于阅读。)如果你使用的x86-64,编译器会甚至把一切都在寄存器中。

请注意您打算将很难嵌入这个代码进入的程序的在您的选择有差别......

我喜欢消除条件跳转作为智力训练。这是否对性能没有任何可测量的效果我不知道,但:)

#include <iostream>
#include <limits>

inline int max(int a, int b)
{
    int difference = a - b;
    int b_greater = difference >> std::numeric_limits<int>::digits;
    return a - (difference & b_greater);
}

int max(int a, int b, int c)
{
    return max(max(a, b), c);
}

int main()
{
    std::cout << max(1, 2, 3) << std::endl;
    std::cout << max(1, 3, 2) << std::endl;
    std::cout << max(2, 1, 3) << std::endl;
    std::cout << max(2, 3, 1) << std::endl;
    std::cout << max(3, 1, 2) << std::endl;
    std::cout << max(3, 2, 1) << std::endl;
}

此位操作只是为了好玩,在cmov解决方案可能是快了很多。

不知道这是否是最有效与否,但它可能是,它肯定会更短:

int maximum = max( max(i, j), k);

有是要加入到C ++ N2485下库这个提案。该提案是简单的,所以我已经包括下面的代码有意义。显然,这是假定可变参数模板

template < typename T >
const T & max ( const T & a )
{ return a ; }

template < typename T , typename ... Args >
const T & max( const T & a , const T & b , const Args &... args )
{ return  max ( b > a ? b : a , args ...); }
public int maximum(int a,int b,int c){
    int max = a;
    if(b>max)
        max = b;
    if(c>max)
        max = c;
    return max;
}

我认为“最有效的”你所谈论的性能,尽量不浪费计算资源。但是,你可能是指写更少的代码也许对您的源代码的可读性。我提供一个例子如下,如果你发现一些有用的东西,如果你喜欢收到你的答案另一个版本,你可以评估或。

/* Java version, whose syntax is very similar to C++. Call this program "LargestOfThreeNumbers.java" */
class LargestOfThreeNumbers{
    public static void main(String args[]){
        int x, y, z, largest;
        x = 1;
        y = 2;
        z = 3;
        largest = x;
        if(y > x){
            largest = y;
            if(z > y){
                largest = z;
            }
        }else if(z > x){
            largest = z;
        }
        System.out.println("The largest number is: " + largest);
    }
}
#include<stdio.h>
int main()
{
    int a,b,c,d,e;
    scanf("%d %d %d",&a,&b,&c);
    d=(a+b+abs(a-b))/2;
    e=(d+c+abs(c-d))/2;
    printf("%d is Max\n",e);
    return 0;
}

最大的3个数字的

int greater = a>b ? (a>c? a:c) :(b>c ? b:c); 
System.out.println(greater);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top