我有一张尺寸为m * n的表,如下所示
2 6 9 13
1 4 12 21
10 14 16 -1
关于此表的几个限制:
问题:我想从表格中找到一组n个数字,其中每个集合必须只包含一行数字,并且最大值(S) - 最小值(S)尽可能小。
例如上表给出了S = 12,13,14。
如果能解决这个问题我真的很感激。我的解决方案很复杂,需要O(m^n)
,这太过分了。我想要一个最佳解决方案。
答案 0 :(得分:3)
以下是我可以证明有效的强力O((m*n)^2 * nlog(m))
算法:
min <- INFINITY
For each 2 numbers in different rows, let them be a,b
for each other row:
check if there is a number between a and b
if there is a matching number in every other row:
min <- min{min,|a-b|}
<强>说明:强>
检查a和b之间是否有数字可以使用二进制搜索完成,并且O(logm)
a,b。
O((n*m)^2)
种不同的可能性
这个想法是彻底检查产生最大差异的对,并检查它是否给出了“可行”解决方案(此解决方案中的所有其他元素都在[a,b]范围内),并得到最小化的对所有“可行”解决方案之间的区别。
编辑:删除了我提出的第二个解决方案,这是贪婪和错误。
答案 1 :(得分:2)
时间复杂度为O(m * n * log(m))。