java - 有效地比较两组对象

时间:2014-07-17 17:12:50

标签: algorithm comparison

我有两组对象,每组由4个对象组成。目标是计算两组之间的相似程度。两个对象之间的比较产生一个int数。该数字越低,对象越相似。具有该组的这些对象的顺序与组相等无关。

所以我必须要做的是将组1的每个对象与组2的每个对象进行比较,这将给出16个对象之间的不同比较结果。我将它们存储在名为costs的4x4 int表中。

int[][] costs= new int[4][4];
for(int i=0;i<4;i++){
     for(int j=0;j<4;j++){
         costs[i][j]=compare(objectGroup1[i],objectGroup2[j]);
      }
 }

现在我有4组4个比较结果,我必须从每个组中选择一个结果,以便添加它们并计算组之间的总距离度量。这是我被卡住的地方。 我必须尝试所有四种组合并得到最小数量,但只有一次使用对象的消耗。

示例:如果要添加的四个值中的第一个是objectGroup1 [1] - objectGroup2 [1]之间的比较结果,那么我不能在这个四人组中使用任何其他使用objectGroup1 [1]和对于objectGroup2 [1]也是如此。

有效示例:group1 [1] -group2 [2],group1 [2] -group2 [1],group1 [3] -group2 [3],group1 [4] -group2 [4] ----&gt ;每个组中的每个对象只出现一次

我可以在这里使用哪种算法?

1 个答案:

答案 0 :(得分:0)

听起来你正试图找到第1组permutation的项目,这些项目会在关闭项目时将其与组2的项目最相似。

Eric Lippert在producing permutations上有很多博客文章。因此,基本上你所要做的就是迭代它们,通过配对项目来计算得分,并返回最佳得分。基本上只是Zip-ing和MinBy-ing:

groupSimilarity =
    item1.Groups

    // (you have to implement Permutations)
    .Permutations()

    // we want to compute the best score, but we don't know which permutation will win
    // so we MinBy a function computing the permutation's score
    .MinBy(permutation =>
        // pair up the items and combine them, using the Similarity function
        permutation.Zip(item2.Groups, SimilarityFunction)
        // add up the similarity scores
        .Sum()
     )

上面的代码是C#,用“Linqy”函数样式编写(如果你不熟悉那就很抱歉)。 MinBy是来自MoreLinq的有用函数,Zip是标准的Linq运算符。