Java:设计问题 - 集合之间的最小对

时间:2009-11-03 19:55:42

标签: java graph priority-queue minimum-spanning-tree

我有两组Animal个对象。使用查看其特征的特定算法来定义动物之间的距离。我正在尝试设计一种方法,从两组(每组一组)中找到最小化距离的对。

我有一个想法:创建一个参数化Tuple类来配对Animals。使用比较器创建PriorityQueue,根据两个成员之间的距离对Tuple<Animal>进行排序。然后,从PriorityQueue中选择第一对。

这是好的设计,还是浪费?我相信它会在O(m + n)时间运行,其中m和n是每个集合的大小。

如果Tuple是参数化类,那么如何在其上使用仅适用于Animal的Comparator?

我想使用这个findMinimalPair方法创建一个生成树,最小化Animal个对象图形的距离。如果我通过不断弹出PriorityQueue对,检查以确保每对仍然包含每个集合中的一个成员,该怎么办?

这是一个基本的例子。这是距离:

     A0     A1     A2     A3
A0   0      20     33     8
A1   20     0      102    73
A2   33     102    0      6
A3   8      73     6      99

假设集合是:

A0

A1,A2,A3

这是元组的排序顺序,按距离:

(A0, A3) - 8 
(A0, A1) - 20 
(A0, A2) - 33

所以我们看到A3是最接近的。然后将A3移入第一个集合:

A0,A3

A1,A2

同样,我们检查最小的一对:

(A3, A2) - 6
(A0, A1) - 20 
(A0, A2) - 33
(A3, A1) - 73

现在采取A2。看看它是如何工作的?

这就是我最终要做的事情。评论

3 个答案:

答案 0 :(得分:1)

实际上,您需要创建m * n元组才能拥有所有可能的元组,这将占用O(mn)。你需要对最小为O(mn * log(mn))的元组列表进行排序,因此复杂度为O(mn * log(mn)) - 即使有优先级队列(你将有mn个插入,带有O) (log(mn))每个人的复杂性。

修改

刚刚看到上述解决方案中的错误 - 如果您只想找到最小对,实际复杂度为O(mn),因为您需要在所有对上使用一条路径。如果要获得按其距离排序的所有对的列表,以便拥有最小生成树,则它为O(mn * log(mn))。无论如何,它不是O(m + n)

答案 1 :(得分:0)

我的建议是你使用会产生u O(n.m)(不是O(n + m))的元组。然后使用桶排序算法bucket sort,其中每个桶将是一个元组..所以你将得到O(n.m)你的问题。 (根据我对你的问题的理解,你可以使用桶排序,否则你将不得不使用O(nlogn)算法)

答案 2 :(得分:0)

如果你想找到第1组和第2组之间所有可能元组之间的距离,我想你可能会遇到嵌套循环,导致O(m * n)。我认为你无法获得O(m + n)。

如果我没记错,您需要一个完整的图表才能找到最小生成树。看起来图形将具有O(V ^ 2)边(因为每对动物之间存在距离),因此如果您使用Prim算法来查找最小生成树,则可能需要使用Fibonacci堆和邻接列表(即O(E + V log(V)))。

http://en.wikipedia.org/wiki/Prim%27s_algorithm