如何在给定约束的情况下找到数组的最大子集?

时间:2016-08-24 14:57:26

标签: arrays algorithm graph heap

有一个数组A [1 ........ N]。如何找到数组的最大子集,使得子集的任何两个不同元素的乘积不是完美的立方体。 N的上限是100000。

示例:

For A = 1 2 4 8. Answer will be  {1, 2} or {1, 4} or {8, 2} 0r {8, 4}.

1 and 8无法在解决方案中聚集在一起。 同样2 and 4

我的方法。

  • 检查给定数组的所有子集并返回满足约束的最大长度子集。需要O(N*N*2^N)。
  • 从给定数组中创建一个图形。如果产品是完美的立方体,则将连接图中的两个节点。我们的主要任务是删除最小数量的节点,使图中没有剩余边缘(当我们删除任何节点时,与节点关联的所有边缘都将消失)。这里的主要问题是空间(图表的表示)。在最坏的情况下,图表的大小将为O(N*N)。

请帮忙。

2 个答案:

答案 0 :(得分:2)

说明

考虑每个数字的因子分解如下:

A[i] = x^3.y^2.z

即。我们首先找到分割的最大立方体(并称之为x),然后是最大的正方形(并称之为y),然后调用留在z上的任何东西。

当且仅当Y = z且Z = y时,A[i]与另一个A[j]=X^3.Y^2.Z的乘积将是一个立方体。

因此,如果您考虑具有相同y ^ 2.z值的数字组,则这些组形成对,其中对于每对,您不能从两个链接组中获取元素。

显然,最好的情况是从每对中最大的组中取出所有元素。

有一种特殊情况,其中y ^ 2.z等于1.在这种情况下,组中的任何数字都是完美的立方体,不能与同一组中的另一个数字配对。因此,您可以从完美的立方体集中添加一个数字。

实施例

假设我们的数组是(表示为素数分解):

A[0] = 2^3
A[1] = 3^3
A[2] = 2^2.3.5^3
A[3] = 2^2.3.7^3
A[4] = 2.3^2.13^3

我们首先将这些分组:

Value 1 = Group A (2^3, 3^3)
Value 2^2.3 = Group B (2^2.3.5^3, 2^2.3.7^3)
Value 2.3^2 = Group C (2.3^2.13^3)

A组与自身配对,而B组与C组配对。

因此,我们可以从A组和整个B组中取一个元素,在最后一个子集中总共有3个元素。

答案 1 :(得分:0)

你可以将其表述为最大的集团问题。

创建一个图形,每个数字作为顶点,如果它们的产品不是立方体,则连接两个顶点。

现在找到图表中最大的集团。见https://en.wikipedia.org/wiki/Clique_problem#Finding_maximum_cliques_in_arbitrary_graphs