找到PHP,Node和Golang中两个数组之间的区别

时间:2015-02-13 09:11:05

标签: javascript php arrays node.js go

这是我需要做的典型例子

$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填充)并有效地对每个字符的序数值进行异或,但是已经认为这可能是一个相当坚果的事情。做。

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

也许这里的某个人可能会指出我不太常行的方式来实现这一点 - 即不仅仅是array_diff端口。

1 个答案:

答案 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更小。