找到表格中的最小距离

时间:2012-06-07 11:05:34

标签: algorithm minimum

我有一张尺寸为m * n的表,如下所示

2    6    9    13
1    4    12   21
10   14   16   -1

关于此表的几个限制:

  1. 每行中的元素按递增顺序排序(自然 排序)。
  2. A -1表示该单元格无意义 计算,即那里没有元素。
  3. -1之后的行中不会出现任何元素。
  4. 所有单元格都可以有0到N之间的正数 a -1。
  5. 没有两个单元具有相同的正数,即可以出现-1 多次,但没有其他数字可以。
  6. 问题:我想从表格中找到一组n个数字,其中每个集合必须只包含一行数字,并且最大值(S) - 最小值(S)尽可能小。

    例如上表给出了S = 12,13,14。

    如果能解决这个问题我真的很感激。我的解决方案很复杂,需要O(m^n),这太过分了。我想要一个最佳解决方案。

2 个答案:

答案 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)

  1. 将每行的所有第一个元素的位置放入优先级队列(min-heap)。
  2. 从队列中删除最小元素,并将其替换为同一行中的下一个元素。
  3. 重复步骤2,直到某些行中不再有与“-1”不同的元素。计算每次迭代的最大值(S) - 最小值(S),如果它小于任何先前值,则更新最佳最佳集合S.
  4. 时间复杂度为O(m * n * log(m))。