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

Java:设计问题-集合之间的最小对,java,graph,priority-queue,minimum-spanning-tree,Java,Graph,Priority Queue,Minimum Spanning Tree,我有两套动物对象。动物之间的距离是通过一种特定的算法来定义的,该算法考虑动物的特征。我试图设计一种方法,从两个集合(每个集合一个)中找到一对,从而最小化距离 我有一个想法:创建一个参数化的Tuple类来配对动物。使用比较器创建一个PriorityQueue,根据两个成员之间的距离对元组进行排序。然后,从PriorityQueue中选择第一对 这个设计好还是浪费?我相信它将在O(m+n)时间内运行,其中m和n是每个集合的大小 如果Tuple是一个参数化的类,那么在它上面使用一个只对动物起作用的比较

我有两套
动物
对象。动物之间的距离是通过一种特定的算法来定义的,该算法考虑动物的特征。我试图设计一种方法,从两个集合(每个集合一个)中找到一对,从而最小化距离

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

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

如果
Tuple
是一个参数化的类,那么在它上面使用一个只对
动物
起作用的比较器是如何工作的呢

我想用这个
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已经被录取了。看看它是怎么工作的


这就是我最后做的。注释?

实际上,您需要创建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)

实际上,您需要创建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)

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

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

如果你想找到集合1和集合2之间所有可能元组之间的距离,我认为你可能会陷入嵌套循环,导致O(m*n)。我认为没有任何方法可以得到O(m+n)

如果我没记错的话,在找到最小生成树之前,需要一个完整的图。看起来这个图有O(V^2)条边(因为每对动物之间都有一段距离),所以如果你使用Prim的算法来寻找最小生成树,你可能需要使用Fibonacci堆和邻接列表(即O(E+V log(V)))


如果你想找到集合1和集合2之间所有可能元组之间的距离,我认为你可能会被嵌套循环所困扰,结果是O(m*n)。我认为没有任何方法可以得到O(m+n)

如果我没记错的话,在找到最小生成树之前,需要一个完整的图。看起来这个图有O(V^2)条边(因为每对动物之间都有一段距离),所以如果你使用Prim的算法来寻找最小生成树,你可能需要使用Fibonacci堆和邻接列表(即O(E+V log(V)))


您不需要为集合a和集合B中的每个元素组合创建一个元组吗?那样的话,你需要n!元组(假设n=m),从那里我不知道PQ得到了什么。也许我误解了?数据集有多大?看起来你在试图设置某种贪婪算法。定义动物之间距离的确切规格是什么?这里可能有一个捷径。如果是每组一只,那么就只有n*M了。你能添加一个简单的例子,比如说每组三只动物,并解释想要的结果吗?从您的描述来看,这听起来像是一个非常简单的问题,但可能在您最初的帖子中没有遇到一些问题。您不需要为集合a和集合B中的每个元素组合创建一个元组吗?那样的话,你需要n!元组(假设n=m),从那里我不知道PQ得到了什么。也许我误解了?数据集有多大?看起来你在试图设置某种贪婪算法。定义动物之间距离的确切规格是什么?这里可能有一个快捷方式。如果每个集合都有一个快捷方式,那么您可以添加一个简单的示例吗