算法 - 如何有效地配对块

时间:2018-02-06 11:06:22

标签: algorithm multidimensional-array data-structures 2d cube

比方说,我们有两个3X3的立方体,在单元格中具有不同的高度。每个单元格值表示该单元格的高度。例如,在下面的第1块中,cell (1,1)的高度为1,cell(1,2)的高度为2,依此类推。

块-1,

1 2 3
1 3 2
3 1 2

块-2,

4 3 2
4 2 3
2 4 3

给出两个这样的块,如何有效地检查是否可以连接两个块,使得没有单元不匹配,并且两个块一起产生cuboid

例如,上面的block-1 + block-2可以被连接,并且结果块将是一个完美的长方体高度5.结果将是,

5 5 5
5 5 5
5 5 5

问题的扩展:给定{4}这样的4X4块的集合(size >= 50K)如何连接块对并产生最终的长方体高度和?您只能采用匹配的块全高,以最大化总高度总和。不匹配的块将被忽略。每个单元格高度最多可达20个单位。

问题的进一步扩展:可以通过旋转方式给出块,使其与其他方式成对,以最大化生成的长方体高度总和。

有任何线索吗?

1 个答案:

答案 0 :(得分:4)

您可以通过两个步骤解决问题(1)找到连接的所有块对(构建一个长方体)和(2)找到最大化总高度的最佳配对。

查找连接对

为此,我将(a)为每个块构建一个表面表示,(b)通过它们的表面表示来对块进行散列,以及(c)通过查找连接表面模型来搜索每个块的所有连接块。

(a)建立表面模型

基本思想是通过表面表示每个块。为此,您只需从矩阵中的每个条目中减去矩阵中的最小条目

block-1的表面表示将是

1 2 3   -1   0 1 2       
1 3 2   -->  0 2 1
3 1 2        2 0 2

并且块2的表面表示将是

4 3 2   -2    2 1 0
4 2 3   -->   2 0 1
2 4 3         0 2 1

(b)散列块

现在,您可以通过曲面表示来对块进行散列

(c)寻找连接对

然后,对于每个块,您可以通过获取曲面表示中的最大值并从中减去矩阵中的条目来计算连接曲面模型,

对于block-1,这将产生

    0 1 2     2 1 0     
2 - 0 2 1  =  2 0 1   
    2 0 2     0 2 0

可以使用哈希表找到具有此表面表示的块(请注意,块2的表面表示将匹配)。

注意:当您允许轮换时,您将必须在哈希表上执行4次查询,并进行所有可能的轮换。

寻找最佳配对

要找到最佳配对(最大化连接块的总和),我会使用Hungarian Algorithm。为了做到这一点,你将不得不建立一个矩阵,其中条目(i,j)包含两个块i和j连接时块的高度,否则为0。

修改

我认为第二步(找到最佳配对)可以通过贪婪地连接成对的匹配块来更有效地完成(连接首先产生最高块的对)。

对此的直觉是:当你有两个块ab并且它们都具有相同的表面模型时。然后,他们将连接到另一个块c,或者他们都无法连接到c。考虑到这一点,在&#34;找到连接对&#34;步骤你将得到成对的块组(X i ,Y i ),其中X i 的每个块连接到每个块的ÿ<子> I 。如果两个组X i 和Y i 具有相同的大小,那么我们可以以任何我们想要的方式连接,并且将始终获得相同长度的相同总和。如果其中一个组(wlog Y i )包含的元素较少,那么我们希望避免连接到X i 中的最小块。因此,我们可以从最大的块开始贪婪地连接,这样做可以避免连接到最小的块。

因此算法可以如下工作:

  1. (根据表面表示对每个块进行哈希处理。排序 具有相同表面表示的块按照下降 它们的偏移量(块的高度减去表面表示)

  2. 每个块按照偏移量递减的顺序处理块:搜索 要连接具有最高偏移的块cBlock,请连接两者 阻止,从哈希表和处理中删除cBlock 管道

  3. 总的来说,这应该在 O(n log n)

    中可行