确定最小互质子集的算法

时间:2013-10-20 18:30:30

标签: algorithm

  

给定n个正整数的集合A,确定非空子集B.   由尽可能少的元素组成,使得它们的GCD为1并输出其大小。

     

例如:
5
6 10 12 15 18

     

产生“3”的输出,而:

     

5
2 4 6 8 10

     

等于“NONE”,因为无法确定子集。

所以它看起来很基本,但我仍然坚持下去。我对它的看法如下:我们知道在集合中已经存在一些数字的倍数是没用的,因为它们的除数是某个因子k的相同时间而我们正在寻找最小的子数。因此,对于每个n i ,我们删除任何kn i ,其中k是进一步计算中的正int。

但是,这就是我被卡住的地方。接下来我该怎么办?如果已经存在一些2元素子集,然后是3元素,那么我只能想到一种愚蠢,蛮力的尝试方法,依此类推。我应该以更聪明的方式检查以确定它?

2 个答案:

答案 0 :(得分:1)

假设每个A,B(两个元素)我们计算它们最大的共同点 除数D.然后我们将这些D值存储在某个地方作为形式的映射: A,B - > d 假设我们也存储了反向地图 D - > A,B

如果至少有一个D = 1那么我们去 - 答案是2。 假设现在没有这样的D,D = 1。 如果答案是3,应该满足什么条件? 我想这个: 存在两个D值,例如D1和D2,使得GCD(D1,D2)= 1。 对? 所以现在我们把问题转化为了,而不是As和Bs 在所有D的集合上存在相同的问题,我们已经改变了选项 答案的2个答案3答案。正确?

我不是100%肯定只是大声思考。

但这个转变的问题更糟糕了 我们必须存储更多的价值观。 (N元素等级2的组合)。

不确定,你提出这个问题似乎很难 问题给我。如果存在,我会感到惊讶 比蛮力更好的方法 并有兴趣了解它。

你需要思考(和寻找)的是: 有没有办法表达GCD(a1,a2,... aN) 如果你知道他们成对的GCD。如果有的话 你可以简化一些方法或公式 你的搜索(最小的子集匹配 期望的标准)。

另见此链接。也许它会有所帮助。

https://cs.stackexchange.com/questions/10249/finding-the-size-of-the-smallest-subset-with-gcd-1

答案 1 :(得分:1)

问题绝对是一个难以解决的问题。我无法看到任何计算有效的算法,可以保证在合理的时间内找到解决方案。

一种方法是: 形成有序集的列表,其中包含原始集中每个元素的素因子。

现在您需要找到交叉点为零的最小集合数。

为此,首先在列表中对这些集进行排序,以便与其他集具有最少交叉点数的集合朝向开头。现在什么是“最少数量的交叉点”?

这是启发式发挥作用的地方。它可以是:
1.设置与其他元素的MIN交点数较少 2.设置与其他元素的最小交叉数量 3.任何其他更合适的定义。

现在您需要通过递归来昂贵地迭代所有组合以确定解决方案。