作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个开始的算法
int sumLargest2 ( int * arr, size_t n )
{
int largest(max(arr[0], arr[1])), secondLargest(min(arr[0],arr[1]));
// ...
我意识到第一个可能不是最优的,因为当您认为知道最小值所需的信息已经存在一次时,调用 max
然后调用 min
是重复的你已经找到了最大值。所以我想我可以做
int largest = max(arr[0], arr[1]);
int secondLargest = arr[0] == largest ? arr[1] : arr[0];
减少对 min
的无用调用,但我不确定这是否真的节省了多少操作。是否有任何花哨的位移算法可以做等同于
int largest(max(arr[0], arr[1])), secondLargest(min(arr[0],arr[1]));
??????
最佳答案
在 C++ 中,您可以使用 std::minmax
生成最小值和最大值的 std::pair
。这与 std::tie
结合起来特别容易:
#include <algorithm>
#include <utility>
int largest, secondLargest;
std::tie(secondLargest, largest) = std::minmax(arr[0], arr[1]);
至少 GCC 能够将对 minmax 的调用优化为单个比较,与下面的 C 代码的结果相同。
在 C 中,您可以自己编写测试:
int largest, secondLargest;
if (arr[0] < arr[1]) {
largest = arr[1];
secondLargest = arr[0];
} else {
largest = arr[0];
secondLargest = arr[1];
}
关于c++ - 是否可以微优化 "x = max(a,b); y = min(a,b);"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30353910/
我是一名优秀的程序员,十分优秀!