这是我需要做的典型例子
$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。一些澄清
库存数组将始终具有相同数量的元素。测试阵列将具有相同或更少的元素。但是,当填充较少的testArr时,可能匹配的元素始终与stockArray位于同一位置。例如
$ testArray(29400,140)
将转换为
$testArray(0,29400,140);
在进行差异测试之前。
在我的例子中,结果将是
$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填充)并有效地对每个字符的序数值进行异或,但是已经认为这可能是一个相当坚果的事情。做。
我关注速度,但不是不惜一切代价。在理想的世界中,每种目标语言都会使用相同的解决方案(算法),但实际上它们之间的差异可能意味着不可能/不是一个好主意。
也许这里的某个人可能会指出我不太常行的方式来实现这一点 - 即不仅仅是array_diff端口。
答案 0 :(得分:1)
这里相当于array_diff解决方案:(假设我没有犯错误)
package main
import "fmt"
func FindLeastDifferent(needle []float64, haystack [][]float64) int {
if len(haystack) == 0 {
return -1
}
var currentIndex, currentDiff int
for i, arr := range haystack {
diff := 0
for j := range needle {
if arr[j] != needle[j] {
diff++
}
}
if i == 0 || diff < currentDiff {
currentDiff = diff
currentIndex = i
}
}
return currentIndex
}
func main() {
idx := FindLeastDifferent(
[]float64{2.05080E6, 29400, 420},
[][]float64{
{2.05080E6, 29400, 0},
{2.05080E6, 9800, 420},
{1.715E6, 24500, 280},
{2.05080E6, 29400, 140},
{2.05080E6, 4900, 7},
{2.05080E6, 29400, 420},
},
)
fmt.Println(idx)
}
就像你说的那样O(n * m)
其中n
是针阵列中元素的数量,m
是大海捞针中的数组数。
如果你没有提前知道大海捞针,那么你可能做的并不多。但是,如果您将此列表存储在数据库中,我认为您对字符串搜索的直觉具有一定的潜力。例如,PostgreSQL支持字符串相似性索引。 (这里是对正则表达式的类似想法的解释:http://swtch.com/~rsc/regexp/regexp4.html)
另一个想法:如果你的数组非常大,你可以计算模糊哈希值(http://ssdeep.sourceforge.net/),这会使你的n
更小。