[英]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。
编辑
我认为通过贪婪地连接成对的匹配块(首先连接成对最高的块),可以更有效地完成第二步(寻找最佳配对)。
直觉是:当您有两个块a
和b
且它们都具有相同的曲面模型时。 然后它们要么都连接到另一个块c
要么都不连接到c
。 考虑到这一点,在“查找连接对”步骤之后,您将最终获得成对的块组(X i ,Y i ),其中X i的每个块都连接到Y i的每个块。 如果两组X i和Y i的大小相等,则我们可以按照任何需要的方式进行连接,并且总得到的长方体的高度总和相同。 如果其中一组(wlog Y i )包含的元素较少,那么我们要避免连接到X i中最小的块。 因此,我们可以从最大的块开始贪婪地连接,而这样做避免连接到最小的块。
因此该算法可以按以下方式工作:
(根据块的表面表示形式对每个块进行哈希处理。将具有相同表面表示形式的块按照其偏移量(块的高度减去表面表示形式)降序排列
对于每个块,按偏移量降序处理块:搜索具有最大偏移量的连接块cBlock,连接两个块,从哈希表和处理管道中删除cBlock。
总的来说,这应该在O(n log n)中可行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.