实施将盖子与正确大小的罐子匹配的算法

问题描述 投票:-1回答:1

问题:我们得到了一个罐子列表和一个盖子(相同大小)列表。每个罐子至少有一个匹配的盖子,反之亦然。在给出的列表中,盖子和罐子都是随机打乱的。我想找到一种有效的算法来返回匹配的盖子和罐子对。

我的策略:使用高效算法对两个集合进行排序(log(n),n =罐子的数量=盖子的数量)。然后,我们可以将它们两两匹配成对,然后将它们添加到将作为结果输出的列表中。

仅限制:将罐子[[不能与罐子进行比较,将盖子不能与罐子进行比较。可以对罐子和盖子进行比较(jar.compareTo(lid)或lid.compareTo(jar))。

Idea:(QuickSort)选择一个可旋转的广口瓶并将盖子分成三组:1)对于所选参考盖来说太小的盖,2)与该盖匹配的盖(至少有一个这样的盖),3)对于所选枢轴而言太大的盖。不建议为这些子组创建新列表(就像在QuickSort中一样),因此我们通过连续的交换对盒盖进行分区(集合具有交换方法)。

我相信,我们可以选择一个随机的枢轴盖以类似的方式分隔罐子。现在,我认为递归可能是对我们形成的子列表进行排序的一种可能性。

尽管听起来很简单,但事实证明这种实现并不那么简单。我什至不知道从哪里开始。我是否需要为子列表中的递归调用单独使用方法?不使用f.ex怎么办所有这些工作。 copyOfRange(即复制给定列表的子集)?是否有一个相关的图形理论问题,已经有一个现有的实现?

谢谢您!

java matching
1个回答
0
投票
This site在解释如何实现QuickSort方面做得很好。它甚至包含一个实现。

网站上的一些要点是:

您的分区方法只会对您指定的数组部分进行分区,因此您无需使用copyOfRange进行复制。开始时,您将对整个数组进行分区,然后使用递归对枢轴之前和之后的部分进行分区。

© www.soinside.com 2019 - 2024. All rights reserved.