将最相似的元素组合在一起

时间:2010-10-26 21:35:32

标签: java algorithm

我有一个二维的整数数组,例如:

int [][] board=
{
{23,17,3,29,12,10},
{17,4,11,12,10,19},
{32,33,25,25,28,35},
{27,29,24,25,23,37},
{29,40,34,26,24,39},
{23,37,29,36,31,3}
}

我根本不想改变这个数组的列;但是,我想交换行,以便将最相似的行组合在一起。在这种情况下类似意味着大多数相等的元素。

编辑:类似的行意味着,如果一行有1,2,3,4,5,6而另一行有1,2,3,4,9,10 他们有4个相似之处。

最好的方法是什么?

注意:我在数组中拥有的行数大约为100,每行中的元素数量最多为10,因此复杂性与指出的一样重要!

2 个答案:

答案 0 :(得分:6)

这个问题减少了旅行商问题。如果您将每一行视为一个城市,然后定义一个距离函数来计算两行之间的距离。问题是如何对行进行排序以使距离最小化。这个问题是NP-Complete,并且在100行的合理时间内无法解决。对此的暴力解决方案需要O(N!)计算。有一些启发式算法(接近最佳答案的算法)将在合理的时间内解决这个问题。

Traveling Salesman Problem (Wikipedia)

一个例子是使用贪心算法。随机选择一行,这是第1行。然后选择最接近第1行的行作为第2行。然后选择最接近第2行的行作为第3行。运行直到选择所有行。这不是一个非常理想的解决方案。

答案 1 :(得分:0)

我不是证明算法的专家,但我会帮助你。此外,我还没有测试过这个解决方案,或者给出了超过15分钟的思考,但我认为它会起作用或至少让你接近。请记住,启发式算法不是100%正确:)我将承担低于3K的风险:

对每一行进行排序,因此排序后粘贴的表格如下所示:

3,  10, 12, 17, 23, 29
4,  9,  10, 11, 12, 17
25, 25, 28, 32, 33, 35
23, 24, 25, 27, 29, 37
24, 26, 29, 34, 39, 40
3,  23, 29, 31, 36, 37

现在按每行第一列中的值对每个进行排序,结果如下:

3,  10, 12, 17, 23, 29
3,  23, 29, 31, 36, 37
4,  9,  10, 11, 12, 17
23, 24, 25, 27, 29, 37
24, 26, 29, 34, 39, 40
25, 25, 28, 32, 33, 35