免责声明:这不是任何一种功课,在我浏览所有圣诞卡时,我的脑海中浮现出这个问题
问题如下:我们有M个信封和N个字母,每个字母被描述为一对正整数。信封和字母都是矩形的,显然可以旋转。如果两个尺寸都小于或等于信封的尺寸,则字母会放入信封中。目标是找到最大的信封 - 字母匹配。
问题很容易转换为最大的二分匹配问题,在O(sqrt(M+N) * MN)
中运行的算法存在(Hopcroft-Karp,转换在O(MN)
中平凡运行)。我试图想出一个贪婪算法或动态方法,但我还没找到。
你知道更快的解决方案吗?
答案 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)
这不等于最大二分匹配吗?
即假设您有一个针对此问题的算法,那么您可以解决最大二分匹配问题。
给定二分图,我们可以为每个节点分配包络和字母(即两个正整数)......