在 PHP、Node 和 Golang 中查找两个数组之间的差异

这是我需要做的典型示例


$testArr = array(2.05080E6,29400,420);


$stockArrays =  array(

                      array(2.05080E6,29400,0),

                      array(2.05080E6,9800,420),

                      array(1.715E6,24500,280),

                      array(2.05080E6,29400,140),

                      array(2.05080E6,4900,7));

我需要确定差异最小的 stockArray。几点说明

  • 保证每个位置数组元素的数值不重叠。(即 arr[0] 将始终具有最大值,arr 1将至少小 10 个数量级等)。

  • 在确定最小差异时,差异的绝对值不计算在内。只是,不同数组索引的数量很重要。

  • 位置差异确实具有权重。因此,在我的示例中,stockArr 1“更加不同” ——就像它的 stockArr[0] 和 stockArr[3] 对应物一样——仅在一个索引位置上有所不同,因为该索引位置更大。

  • stockArrays 元素的数量通常少于 10 个,但可能更多(尽管永远不会变成 3 个数字)

  • 库存数组将始终具有相同数量的元素。测试数组将具有相同或更少的元素。但是,当填充较少的 testArr 时,可能匹配的元素始终与 stockArray 位于同一位置。例如

    $testArray(29400,140)

将被转化为

$testArray(0,29400,140);

在进行差异测试之前。

  • 最后,平局是可能的。例如,我上面的匹配示例是 stockArrays[0] 和 stockArrays[3]。

在我的例子中,结果是

$result = array(0=>array(0,0,1),3=>array(0,0,1));

表明差异最小的股票数组位于索引 0 和 3 处,差异位于位置 2。

在 PHP 中,我会以array_diff作为起点来处理所有这些。对于 Node/JavaScript,我可能会倾向于php.js array_diff端口,尽管我倾向于探索一下,因为在最坏的转换场景中它是一个 O(n2) 事件。

我是 Golang 的新手,所以我不确定如何在那里实现这个问题。我注意到 Node 确实有一个 array_diff npm 模块。

我有一个不合时宜的想法是将数组转换为填充字符串(较小的数组元素填充为 0)并有效地对每个字符的序数值执行 XOR,但我认为这可能是一件相当疯狂的事情。

我关心速度,但不是不惜一切代价。在理想的世界中,每种目标语言都将使用相同的解决方案(算法),但实际上它们之间的差异可能意味着这是不可能的/不是一个好主意。

也许这里的某个人可能会向我指出实现这一点的不那么简单的方法 - 即不仅仅是 array_diff 端口。


跃然一笑
浏览 154回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go