我应该使用什么类型的算法?

时间:2012-08-25 17:12:26

标签: algorithm graph nodes

假设我有四个小组

  

A [0,4,9]

     

B [2,6,11]

     

C [3,8,13]

     

D [7,12]

现在我需要每个组中的一个数字(即一个新组)E [A的数量,B的数量,C的数量,D的数量],以便E中的最大数量与最小数量之间的差值为E应该是最低的。这是什么类型的问题?哪种图形算法能更好地解决这类问题? 提前谢谢。

P.S:我正试图在java中解决这个问题,并对未指定的标题表示抱歉。

编辑: 最后,我找到了我实际需要的内容http://rcrezende.blogspot.in/2010/08/smallest-relevant-text-snippet-for.html

2 个答案:

答案 0 :(得分:4)

  1. 将每个组的内容合并为一个数组。数组的每个元素都应该是一对(数字,组名)。
  2. 按数字排序此数组。
  3. 一个接一个地推进两个迭代器。当不是每个组的元素都在这些迭代器之间时,移动第一个迭代器。当这些迭代器之间存在每个组的元素时,移动第二个迭代器。有关详细信息,请参阅this question
  4. 迭代器之间的最小距离确定最佳结果组(当只有同一组的多个代表时,您只需要删除不需要的元素)。

  5. 其他算法:

    1. 对每个组的元素进行排序(如果尚未排序)。
    2. 将每个组中最小元素的对(编号,组名)放入优先级队列(min-heap,priority = number)。
    3. 从队列中删除最小元素,并将其替换为同一组中的下一个元素。
    4. 重复步骤3,直到某些组中没有剩余元素。计算每次迭代的最大(队列) - 最小(队列),如果它小于任何先前的值,则更新最佳结果组。

答案 1 :(得分:2)

我认为你可以做一次详尽的搜索,快速终止,它没有看起来那么糟糕。

例如,如果你从A和B中选择一个数字,你可以从C中选择两个最接近这两个数字的数字,使用任何其他数字都不能产生更好的结果。

  • 对于A的每个元素:将其称为a,您正在寻找接近间隔的数字(a,a)
  • 现在为每个组选择最接近的数字(您可以使用二进制搜索来完成)。现在您有了一个新的搜索间隔,(a,b1)或(b2,a)

示例:

  • 从A中选择4,搜索接近(4,4)
  • A)从B中选择2,搜索接近(2,4)
  • ....从C中选择3,它在间隔中。搜索接近(2,4)
  • ....从D中选择7,间隔为(2,7),距离为5。
  • B)从B中挑选6,搜索接近(4,6)
  • ....