Java 比较数组之间的相似性

Java 比较数组之间的相似性,java,arrays,algorithm,similarity,Java,Arrays,Algorithm,Similarity,我试图找到一种有效的方法来比较表示客户端服务质量的给定数组和两个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 Q

我试图找到一种有效的方法来比较表示客户端服务质量的给定数组和两个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
   }

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

警告


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

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

计算数组“相似性”的方法很多

这里是Golang的实现:

//委托SimilarityPreCheck验证给定数组的大小是否正确
函数相似性复查(a,b[]浮点64)布尔{
如果len(a)==0 | | len(b)==0{
log.Println(“余弦相似性|零输入数据”)
返回错误
}
如果len(a)!=len(b){
log.Printf(“余弦相似性|输入向量大小不同”)
返回错误
}
返回真值
}
//余弦相似性用于计算给定数组的余弦相似性
函数余弦相似性(a,b[]浮点64)浮点64{
如果!相似性重新检查(a,b){
返回-1
}
//计算分子
变量分子浮点数64
对于i:=范围a{
分子+=a[i]*b[i]
}
//Caluclate分母第一项
var den1浮动64
对于i:=范围a{
den1+=math.Pow(a[i],2)
}
den1=math.Sqrt(den1)
//Caluclate分母第二项
var den2浮动64
对于i:=范围b{
den2+=数学功率(b[i],2)
}
den2=数学.Sqrt(den2)
结果:=分子/(den1*den2)
返回结果
}
//欧几里德距离被委托计算给定数组的欧几里德距离
func欧几里德距离(v1,v2[]浮点64)浮点64{
如果!相似性重新检查(v1、v2){
返回-1
}
var欧几里德浮点数64
对于i:=范围v1{
欧几里德+=数学功率(v1[i]-v2[i],2)
}
返回math.Sqrt(欧几里德)
}
//指定ManhattandInstance来计算给定数组的曼哈顿范数
函数曼哈顿站(v1,v2[]浮动64)浮动64{
如果!相似性重新检查(v1、v2){
返回-1
}
var出租车浮动64
对于i:=范围v1{
出租车+=数学Abs(v2[i]-v1[i])
}
回程出租车
}

客户端QOS值可以在0-5之间变化,因此可能类似于(3,5,2),它没有加权值。请看一看基于哈希的近似重复检测-它非常高效。预期的输出是什么?我的意思是该方法应该返回什么。@grrrrrr,正如您在该方法的语句中看到的,它的int[]。最相似的ArrayNice,我认为这应该很好:)我不需要更复杂的东西,因为我可以使用一个小数据库为我提供最相似的Web服务,给定一个客户群。你描述的方法叫做曼哈顿距离:)谢谢你提醒我当你说比较算法时?这不是我首先要找的吗?没错,你就是。首先,您需要封装它。然后您可以遵循TDD实践并创建一个“明显的实现”。显而易见的实现示例:两个数组中相似的数字数量。只要你的问题有几个正确答案,封装就可以允许在一个JVM的范围内同时使用几个启发式方法。我认为这种方法对于比带int的数组更复杂的对象非常有用,但我想我抓住了“几个正确答案”的要点,非常感谢