题
下面是我的伪代码。
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);