算法:字母和信封配对

时间:2014-01-04 21:50:28

标签: algorithm matching bipartite

免责声明:这不是任何一种功课,在我浏览所有圣诞卡时,我的脑海中浮现出这个问题

问题如下:我们有M个信封和N个字母,每个字母被描述为一对正整数。信封和字母都是矩形的,显然可以旋转。如果两个尺寸都小于或等于信封的尺寸,则字母会放入信封中。目标是找到最大的信封 - 字母匹配。

问题很容易转换为最大的二分匹配问题,在O(sqrt(M+N) * MN)中运行的算法存在(Hopcroft-Karp,转换在O(MN)中平凡运行)。我试图想出一个贪婪算法或动态方法,但我还没找到。

你知道更快的解决方案吗?

3 个答案:

答案 0 :(得分:0)

以下"贪婪"型方法可能会有所帮助。

将m [i]定义为包络i的两个整数中的最小值。

mins = distinct values of m[i], in increasing order
letters_to_match = all letters
for min in mins:
    envs = envelopes i with m[i] == min
    match letters_to_match with envs
    remove matched letters from letters_to_match

答案 1 :(得分:0)

在我的脑海中,我认为我有一个简单的算法可以提供最佳解决方案,但它不一定是效率最高的。

(1)按区域的降序对信封进行排序。 (2)每个信封   (A)找到适合的所有字母。   (B)选择面积最大的那个。

除非我弄错了,否则这只是O(M *(N + 1))。 2A和2B不必是单独的运行,因为每个包络(2B)的最大面积字母可以在2A的过程中确定。

这里的要点是"大O"并不总是衡量如何解决问题的最佳方法。这只是一个非常粗略的估计。

因此,如果需要1000行代码来按摩您的数据,那么只需要几个步骤(O(M *(N + 1))的算法就可以成为比O(MN)更好的实用解决方案。 "更高效的大O" MN。

(后来补充说:我没有得到"大O"就在那里,但这并不是最有效的解决方案,只是找到最佳解决方案的解决方案简单地说,它并没有。正如Peter Petrovic用他的反例所指出的那样。)

答案 2 :(得分:0)

这不等于最大二分匹配吗?

即假设您有一个针对此问题的算法,那么您可以解决最大二分匹配问题。

给定二分图,我们可以为每个节点分配包络和字母(即两个正整数)......