我有两组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。看看它是如何工作的?
这就是我最终要做的事情。评论
答案 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)))。