0

我试图找到一种有效的方法来比较表示客户端服务质量的给定数组与两个 Web 服务的 QOS,并选择与给定 QOS 最相似的数组。

  int[] arrayCompare(int[] clientQOS){

      int[] service1QOS=new int[]{3,1,4};
      int[] service2QOS=new int[]{1,3,3};

      //I want to compare clientQOS     with  S1 QOS       and S2 QOS

      return  mostSimilarArray
   }
4

3 回答 3

1

循环遍历每个目标的源数组,将计数器增加增量(值之间的正差)。最小的增量和是最接近的匹配。

注意事项

如果您认为数值更接近更相似,并且不同值之间的比例相等,这应该是正确的。

于 2012-10-16T22:05:37.330 回答
1

我会制作一个自定义对象而不是数组并实现接口 Comparable。通过这种方式,您可以封装比较算法并稍后在其他地方重用它。

于 2012-10-16T22:06:32.617 回答
0

有很多计算数组“相似度”的方法。

这里是 Golang 的实现:

// SimilarityPreCheck is delegated to verify that the given array have the correct size
func SimilarityPreCheck(a, b []float64) bool {
    if len(a) == 0 || len(b) == 0 {
        log.Println("CosineSimilarity | Nil input data")
        return false
    }

    if len(a) != len(b) {
        log.Printf("CosineSimilarity | Input vectors have different size")
        return false
    }

    return true
}

// CosineSimilarity is delegated to calculate the Cosine Similarity for the given array
func CosineSimilarity(a, b []float64) float64 {
    if !SimilarityPreCheck(a, b) {
        return -1
    }

    // Calculate numerator
    var numerator float64
    for i := range a {
        numerator += a[i] * b[i]
    }

    // Caluclate first term of denominator
    var den1 float64
    for i := range a {
        den1 += math.Pow(a[i], 2)
    }
    den1 = math.Sqrt(den1)

    // Caluclate second term of denominator
    var den2 float64
    for i := range b {
        den2 += math.Pow(b[i], 2)
    }
    den2 = math.Sqrt(den2)

    result := numerator / (den1 * den2)
    return result
}

// EuclideanDistance is delegated to calculate the euclidean distance for the given array
func EuclideanDistance(v1, v2 []float64) float64 {
    if !SimilarityPreCheck(v1, v2) {
        return -1
    }
    var euclidean float64
    for i := range v1 {
        euclidean += math.Pow(v1[i]-v2[i], 2)
    }
    return math.Sqrt(euclidean)
}

// ManhattanDistance is delegated to calculate the Manhattan norm for the given array
func ManhattanDistance(v1, v2 []float64) float64 {
    if !SimilarityPreCheck(v1, v2) {
        return -1
    }
    var taxicab float64
    for i := range v1 {
        taxicab += math.Abs(v2[i] - v1[i])
    }
    return taxicab
}


于 2019-11-09T15:35:49.997 回答