当前位置: 首页 > 知识库问答 >
问题:

在重叠的类别中,有什么比蛮力分离物品更好的算法?

谷梁云瀚
2023-03-14

我有一组任意的项目(下面的点),一些数量的类别以任意的方式重叠(下面的A-C)。测试的目的是确定是否有可能将每一个项目分配到一个单独的类别中,在它已经属于的类别中,这样每个类别结束时至少有一定数量的项目。

例如,我们可能要求A、B和C可以各自要求一个项目。如果我们给出了下面所有的4个点,那么证明这是可能的就很容易了:只需将所有的项目贴在一个列表中,循环遍历类别,并让每个类别移除一个它也可以访问的项目,只要每个类别能够移除一个项目,我们就通过了测试。

现在假设我们移除蓝点并重复测试。很明显,我们可以把黄色分配给A,红色分配给B,绿色分配给C,我们再次通过。但是很难对这个解决方案进行编码:如果我们遵循前面的方法(同样没有蓝点),那么假设A从删除绿点开始。现在,如果B移除黄点,我们将不通过测试(因为C不能移除红点),而如果B移除红点,C仍然可以接受黄点并通过。

一个人可以通过对每一个可能的项到类别的分配进行迭代来解决这个问题,检查每一次迭代是否满足条件,但这不能很好地扩展到任意数量的项和类别,我觉得有一种更聪明或更有效的方法。

我不知道这个问题叫什么名字,所以很难研究。它有最优解吗?如果是这样,我能期望解决方案有什么样的复杂性?

共有1个答案

宗政法
2023-03-14

你指出这是一个分配问题是对的,因此,它可以用图论的经典算法来解决。

您可以将您的问题解释为:

一侧的节点表示类别,另一侧的节点表示项目。你想找到一个最大匹配。这个问题可以归结为在二部图中求最大流。

 类似资料:
  • 我首先使用蛮力解决了这个问题,如下面的代码所示。 我认为这种方法是低效的,因为它运行算法的次数明显超过了必要的次数。任何一个数,如果是前一个数的Collatz序列的一部分,实际上已经确定了它的序列,所以你最终要计算每一个数的序列,每次它出现在Collatz序列中。 我决定最好把每个数字一出现在一个Collatz序列中就存储在一个地图中,这样你只需要计算一次。为此,我使用了一个TreeMap,其中数

  • 问题内容: 我主要使用jQuery库,并且刚开始使用AngularJS。我已经阅读了一些有关_如何_使用Angular的教程,但是不清楚为什么使用它或何时使用它,或者与仅使用jQuery相比,我会发现什么好处。 在我看来,Angular使您想到MVC,这也许意味着您将网页视为模板+数据组合。只要有动态数据,就可以使用。然后,Angular将为您提供一个$scope处理程序,您可以静态地填充它,也可

  • 问题内容: 我刚刚提交了Java作业,需要在其中作为游戏的一部分在屏幕上随机绘制一些圆圈。给我们的挑战之一是确保所有圈子都不重叠。我最终采用了一种奇怪的方法(因为我想:D),该方法基本上只是使用trig从屏幕中央创建了一个图案,这很有趣。尽管此方法中的圆永远不会重叠,但这并不是理想的方法…圆的分布在屏幕中间相当密集,在角落的空间很小。 我还创建了一种(注释掉的)蛮力方法,如果拟议的圆的x,y坐标与

  • 本文向大家介绍CNN为什么比DNN在图像识别上更好相关面试题,主要包含被问及CNN为什么比DNN在图像识别上更好时的应答技巧和注意事项,需要的朋友参考一下 参考回答: DNN的输入是向量形式,并未考虑到平面的结构信息,在图像和NLP领域这一结构信息尤为重要,例如识别图像中的数字,同一数字与所在位置无关(换句话说任一位置的权重都应相同),CNN的输入可以是tensor,例如二维矩阵,通过filter

  • 正如你从标题中所看到的,我正在努力对因子为2个素数的大整数进行强制因子分解。我想知道是否有一种方法可以在for循环中使用for循环。我知道这是一种很糟糕的方式,但无论如何我都愿意这样做。(我本来打算使用费马分解定理,但如果没有一些额外的方法/库,你就不能求大整数,我无法做到这一点),所以请尝试一下,看看你是否可以帮助我。大致如下: 显然,这太可怕了,我知道你不能通过说i.nextPossibleP