【问题标题】:Finding the minimum distance in a table查找表格中的最小距离
【发布时间】:2012-06-11 10:23:53
【问题描述】:

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

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

关于这张表的一些限制:

  1. 每行中的元素按升序排序(自然 订购)。
  2. A -1 表示该单元格对于 计算,即那里不存在任何元素。
  3. -1 之后的行中不能出现任何元素。
  4. 所有单元格可以有一个介于 0 和 N 之间的正数或 一个 -1。
  5. 没有两个单元格具有相同的正数,即 -1 可以出现 多次,但没有其他号码可以。

问题:我想从表中找到一组包含 n 个数字的 S,其中该集合必须只包含每一行中的一个数字,并且 max(S) - min(S) 尽可能小。

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

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

【问题讨论】:

  • 空间、时间或准确性方面的最佳解决方案?或所有这些。
  • 就时间而言的最佳解决方案。准确是必须的(即我想要突出显示的东西并且对此没有妥协)
  • @dharam:这是一个有趣的问题。你为什么要解决它?它是如何产生的?
  • @Tom:我是一个更大问题的一部分......问题是在字符串中找到出现一系列字符的最小窗口......示例:考虑一个字符串“abzyxcdcbgahjkcbabghjcbja " 并且我想以任何顺序找到序列 "abc"。唯一的标准是窗口应该有最小长度。对于本例,窗口长度为 3,序列按 cba 顺序发生

标签: algorithm minimum


【解决方案1】:

这是我可以证明有效的蛮力 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)
O((n*m)^2) a,b 有不同的可能性。

这个想法是彻底检查产生最大差异的对,并检查它是否给出了“可行”的解决方案(该解决方案中的所有其他元素都在范围 [a,b] 内),并得到最小化的对所有“可行”解决方案之间的区别。


编辑:删除了我提出的第二个解决方案,这是贪婪和错误的。

【讨论】:

  • 您好,感谢您的回复。请参阅我的方法:对于第一行中的元素 e1,我在第 2 行中找到元素 e2,这样 |e1-e2|是最小值。然后对于 e2 找到第 3 行中的元素 e3 使得 |e2-e3|是最小值。对第 1 行中的所有元素重复此操作,您将得到各组 n 个数字。在每组中检查值 max(s) - min(s)。所有这些值中的最小值就是您的答案。但是如何在程序中转换它是我的实际问题。
  • @dharam:这个解决方案绝对是错误的:line1=5,-1,... ;第 2 行 = 3,6,-1,...;第 3 行 = 2,8,-1,...;第 4 行=1,10,-1,...;建议的解决方案将返回 {5,6,8,10},而最佳解决方案是 {5,3,2,1}。对于这种情况,我建议的第二个解决方案也失败了(我将删除第二个解决方案)。
  • 我们不考虑-1。
  • @dharam:我知道,看看这个例子——它没有考虑到它,它是提议算法的一个反例。
  • 得到了你。你是绝对正确的。我的解决方案在这种情况下不起作用。我正在尝试编写您的解决方案,但我很难。 :(
【解决方案2】:
  1. 将每行的所有第一个元素的位置放入优先队列(最小堆)。
  2. 从队列中移除最小的元素,并将其替换为同一行中的下一个元素。
  3. 重复第 2 步,直到某行中不再有与“-1”不同的元素。计算每次迭代的 max(S) - min(S),如果它小于任何先前的值,则更新迄今为止最好的集合 S。

时间复杂度为 O(m*n*log(m))。

【讨论】:

  • 谢谢.. 这个解决方案非常适合我处理过的几个测试用例。谢谢你。编码真的很容易。
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
相关资源
最近更新 更多