【发布时间】:2016-01-24 15:50:00
【问题描述】:
所以我有两个数组,a 和 b 大小不一,包含相同长度的子数组,并且它们的类型与子数组相同(例如浮点数)。
我想在数组 a 的子数组中找到 b 中子数组的所有匹配项。
现在我正在寻找一种更快或更好的方法来执行此操作(可能是 CUDA 或 SIMD 编码)。
目前我有类似 (F#) 的东西:
let mutable result = 0.0
for a in arrayA do:
for b in arrayB do:
if a = b then
result <- result + (a |> Array.sum)
我的数组 a 包含大约 500 万个元素,数组 b 包含大约 3000 个元素。因此是与性能相关的问题。
【问题讨论】:
-
什么是“子”数组?这些阵列有多大?请发布一个最小的演示数据集和您想要的输出。
-
除此之外,您如何定义浮点值的“相等”?你有考虑到一些
epsilon吗? -
可能值得先对一个或两个数组进行排序,因此您可以在 O(NlogN + MlogM) 时间内完成此操作,而不是 O(N*M)。如果您在排序时消除和计算重复项,则不必在循环时执行此操作。实际上,只需对较短的数组进行排序,然后对于每个
a,在arrayB中进行二进制搜索。排序是特别的。如果您要使用容差进行较慢的比较,则很有价值。 -
我在最后一段中指定了估计尺寸。我认为为避免精度问题,我将使用小数等,因为它是我要处理的与货币相关的信息。
-
感谢您的 cmets,他们帮助我稍微调整了循环。
标签: arrays parallel-processing f# simd