繁体   English   中英

算法-如何有效地配对块

[英]Algorithm - How to pair blocks efficiently

可以说,我们有两个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

给两个这样的块如何高效地检查两个块是否可以以这样的方式连接:不会出现单元格不匹配的情况,两个块一起产生一个长方体

例如,可以连接上面的块1 +块2,结果块将是完美的长方体高度5。

5 5 5
5 5 5
5 5 5

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

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

有什么线索吗?

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

查找连接对

为此,我将(a)为每个块构建一个表面表示,(b)通过其表面表示对哈希进行哈希处理,并且(c)通过查找连接表面模型来搜索所有连接块的每个块。

(a)建立表面模型

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

块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)寻找连接对

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

对于块1,这将产生

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

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

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

寻找最佳配对

为了找到最佳配对(最大化连接块的总和),我将使用匈牙利算法 为此,您将必须构建一个矩阵,其中当两个块i和j连接时,项(i,j)包含该块的高度,否则为0。

编辑

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

直觉是:当您有两个块ab且它们都具有相同的曲面模型时。 然后它们要么都连接到另一个块c要么都不连接到c 考虑到这一点,在“查找连接对”步骤之后,您将最终获得成对的块组(X i ,Y i ),其中X i的每个块都连接到Y i的每个块。 如果两组X i和Y i的大小相等,则我们可以按照任何需要的方式进行连接,并且总得到的长方体的高度总和相同。 如果其中一组(wlog Y i )包含的元素较少,那么我们要避免连接到X i中最小的块。 因此,我们可以从最大的块开始贪婪地连接,而这样做避免连接到最小的块。

因此该算法可以按以下方式工作:

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

  2. 对于每个块,按偏移量降序处理块:搜索具有最大偏移量的连接块cBlock,连接两个块,从哈希表和处理管道中删除cBlock。

总的来说,这应该在O(n log n)中可行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM