找到三个整数中最大的一个的最有效方法
下面是我的伪代码。
function highest(i, j, k)
{
if(i > j && i > k)
{
return i;
}
else if (j > k)
{
return j;
}
else
{
return k;
}
}
我认为这是可行的,但这是 C++ 中最有效的方法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(17)
要找到最大的整数,您需要查看正好 3 个整数,不多也不少。您正在查看 6 个和 3 个比较。您应该能够通过 3 次和 2 次比较来完成。
To find the greatest you need to look at exactly 3 ints, no more no less. You're looking at 6 with 3 compares. You should be able to do it in 3 and 2 compares.
伪代码:
Pseudocode:
两次比较怎么样
,不使用瞬态临时堆栈变量......
How about
two comparisons, no use of transient temporary stack variables...
您当前的方法:
http://ideone.com/JZEqZTlj (0.40s)
Chris 的解决方案:
http://ideone.com/hlnl7QZX (0.39s)
Ignacio Vazquez-Abrams 的解决方案:
http://ideone.com/JKbtkgXi (0.40s)
和 Charles Bretana 的:
http ://ideone.com/kyl0SpUZ (0.40s)
在这些测试中,所有解决方案的执行时间与其他解决方案的执行时间相差不到 3%。您尝试优化的代码实际上非常短。即使您能够从中挤出 1 条指令,它也不可能对整个程序产生巨大的影响(现代编译器可能会捕获这个小的优化)。把时间花在别处吧。
编辑:更新了测试,结果发现它仍在优化之前的部分内容。希望不再是这样了。
Your current method:
http://ideone.com/JZEqZTlj (0.40s)
Chris's solution:
http://ideone.com/hlnl7QZX (0.39s)
Solution by Ignacio Vazquez-Abrams:
http://ideone.com/JKbtkgXi (0.40s)
And Charles Bretana's:
http://ideone.com/kyl0SpUZ (0.40s)
Of those tests, all the solutions take within 3% the amount of time to execute as the others. The code you are trying to optimize is extremely short as it is. Even if you're able to squeeze 1 instruction out of it, it's not likely to make a huge difference across the entirety of your program (modern compilers might catch that small optimization). Spend your time elsewhere.
EDIT: Updated the tests, turns out it was still optimizing parts of it out before. Hopefully it's not anymore.
对于这样的问题,了解优化编译器正在做什么以及硬件上可用的内容是无可替代的。如果您拥有的基本工具是二进制比较或二进制最大值,则两次比较或最大值都是必要且充分的。
我更喜欢 Ignacio 的解决方案:
因为在常见的现代 Intel 硬件上,编译器会发现非常容易发出两个比较和两个
cmov
指令,这会给 I-cache 带来更小的负载和更少的压力在分支预测器上比在条件分支上。 (此外,代码清晰易读。)如果您使用的是 x86-64,编译器甚至会将所有内容保存在寄存器中。请注意,您将很难将此代码嵌入到您的选择会产生影响的程序中......
For a question like this, there is no substitute for knowing just what your optimizing compiler is doing and just what's available on the hardware. If the fundamental tool you have is binary comparison or binary max, two comparisons or max's are both necessary and sufficient.
I prefer Ignacio's solution:
because on the common modern Intel hardware, the compiler will find it extremely easy to emit just two comparisons and two
cmov
instructions, which place a smaller load on the I-cache and less stress on the branch predictor than conditional branches. (Also, the code is clear and easy to read.) If you are using x86-64, the compiler will even keep everything in registers.Note you are going to be hard pressed to embed this code into a program where your choice makes a difference...
我喜欢将消除条件跳转作为一种智力练习。我不知道这是否对性能有任何可测量的影响:)
这个小玩意只是为了好玩,
cmov
解决方案可能要快得多。I like to eliminate conditional jumps as an intellectual exercise. Whether this has any measurable effect on performance I have no idea though :)
This bit twiddling is just for fun, the
cmov
solution is probably a lot faster.不确定这是否是最有效的,但它可能是,而且肯定更短:
Not sure if this is the most efficient or not, but it might be, and it's definitely shorter:
有人建议将其包含到 N2485 下的 C++ 库中。该提案很简单,因此我在下面包含了有意义的代码。显然,这假设了可变参数模板
There is a proposal to include this into the C++ library under N2485. The proposal is simple, so I've included the meaningful code below. Obviously, this assumes variadic templates
在 C++ 中查找 2 个或更多数字的最大值或最小值的最简单方法是: -
您可以提供任意多个变量。
有趣的是,它的效率也令人难以置信,至少与 Ignacio Vazquez-Abrams 的解决方案(https://godbolt. org/z/j1KM97):
与 GCC 类似,而 MSVC 则将循环搞得一团糟。
The easiest way to find a maximum or minimum of 2 or more numbers in c++ is:-
You can give as many variables as you want.
Interestingly enough it is also incredibly efficient, at least as efficient as Ignacio Vazquez-Abrams'solution (https://godbolt.org/z/j1KM97):
Similar with GCC, while MSVC makes a mess with a loop.
我认为“最有效”指的是性能,尽量不浪费计算资源。但您可能指的是编写更少的代码行,或者可能是关于源代码的可读性。我在下面提供了一个示例,您可以评估您是否发现有用的内容或者您是否更喜欢收到的答案中的另一个版本。
I think by "most efficient" you are talking about performance, trying not to waste computing resources. But you could be referring to writing fewer lines of code or maybe about the readability of your source code. I am providing an example below, and you can evaluate if you find something useful or if you prefer another version from the answers you received.
我用的是这种方式,花了0.01秒
或者这样
I Used This Way, It Took 0.01 Second
Or This
找到 3 个数字中最大的数字的最有效方法是使用 max 函数。这是一个小例子:
如果你有C++ 11,那么你可以这样做:
如果你有兴趣使用一个函数,以便你可以轻松地多次调用它,代码如下:
The most efficient way to find the greatest among 3 numbers is by using max function. Here is a small example:
If you have C++ 11, then you can do it as follow:
If you are interested to use a function, so that you can call it easily multiple times, here is the code:
这是您可以使用的一个小功能:
Here is a small function you can use:
在C#中找到3位数之间的最大和最小数字
=========================================== =========================
In C# finding the greatest and smallest number between 3 digit
=================================================================