确定非零最小值的最快方法
Fastest way to determine the non-zero minimum
有一个由4个整数组成的数组,如何以最快的方式确定它的非零最小值?
除非在元素添加到数组时保持最小值,或者按排序顺序保持数组,否则我看不到其他解决方案,只能迭代每个成员来确定最小值。
没有"快速"的方式来测试每个成员。
一般来说,我建议不要优化某个东西,除非它真的很慢。程序的旧规则将90%的时间花在10%的代码中,这通常是正确的。程序员优化代码的可能性为99.99%,而不是10%。
评测您的代码-评测代码-评测您的编码
这个问题有一个并行的解决方案,但可能不值得付出努力。
首先,我们定义了一个在数组a:上的操作xchg(m, n)
xchg(m, n) => ((a[m] > a[n] && a[n] != 0) || a[m] == 0) ? swap(a[m],a[n])
如果两个元素"m"answers"n"都包含非零值,则此操作将按升序对它们进行排序;如果"m"元素中的值为零,则进行交换。
接下来,我们执行一组五个这样的操作,如下所示:
xchg(0,2) xchg(1,3)
xchg(0,1) xchg(2,3)
xchg(1,2)
成对的xchg
操作可以并行执行,与严格的顺序执行相比,时间成本降低了40%。完成后,数组中的任何非零元素都将按升序排序。最小值元素将位于[0]中。如果该值为零,则数组中没有非零值。
该解决方案利用了排序网络(http://en.wikipedia.org/wiki/Sorting_network),但对4个元素的顺序扫描也使用不超过三次的比较操作,并且至关重要的是,平均需要一半的存储写入:
顺序扫描
int v = a[0]
for (n = 1; n < 4; n++) {
if ((a[n] < v && a[n] != 0 ) || v == 0) v = a[n]
}
取决于输入。如果数组没有排序,那么您将不得不遍历整个数组。如果数组已经排序,那么您只需要循环,直到找到不为零的东西——它要短得多。
如果我们正在考虑微观优化,那么在现代无序处理器上计算min(min(a,b),min(c,d))
而不是min(min(min(a,b),c),d)
可能会更快,因为顺序依赖性较小:在前者中,如果有足够的执行单元可用,处理器可以并行独立计算min(a,b)
和min(c,d)
。这是假设处理器具有条件移动指令,因此计算min
不需要分支。
编码它的最快方法是std::min({a,b,c,d})
。
更严重的一点是:如果你的应用程序遇到了一些瓶颈,比如取很多值中的最小值,一个更好的解决方案可能是找到一种方法,将最小值查找任务拆分为多个部分,并发送到GPU(或多个线程),然后GPU可以同时操作多个最小值查找计算。
并行性可能比试图在程序集中编写最小函数更有帮助。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用递归的数组的最小值.这是怎么回事
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- txt 文件中浮点数的最大和最小值
- 余数运算符的等效操作,用于处理低于允许的最小值
- 需要使用模板查找数组的第二个最小和最小值
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 查找包含 N 个元素的数组的最小值和最大值
- 错误C++在Visual Studio 2019中使用numeric_limits的长双精度最小值/最大值
- 从向量中提取最小值、最大值和中位数的最有效方法是什么
- 有没有一种无分支方法可以快速找到两个双精度浮点值的最小值/最大值
- 在映射最小值和最大值时从未签名转换为已签名的最佳方法?
- 在 C++ 中,在矩阵中搜索最小值和最大值以及不同行或列的最快方法是什么
- 确定非零最小值的最快方法
- 在容器中查找具有给定字段最小值的元素的最紧凑的方法