我有一组整数,我希望找到元素之间以特定方式不相互关联的最大子集。例如,如果任何元素乘以13的子集,则结果不在子集中。
我的第一个想法是迭代所有可能的子集,过滤掉那些不符合条件然后找到最大的子集,但这太慢了,我不知道如何生成所有可能的子集。
答案 0 :(得分:0)
我将回答这个问题(来自评论)。一般来说,任何“相关”都没有好的解决方案
关系如下:如果您将子集中的任何元素乘以某个数字,则得到的数字不必位于子集中。
如果您的电话号码为m
您可以生成所有链x
,x*m
,x*m*m
,....,以便链中的所有数字都在集合中,x/m
不是< / p>
从原始集中删除每个第二个元素,即x*m^2
,x*m^4
。剩下的元素是你的目标集。
答案 1 :(得分:0)
更好的方法是构建一个图形并找到具有最多边的顶点并将其移除直到摆脱所有边缘。复杂性约为O(N ^ 2)。
这是一个详细的算法:
for each possible pair (x, y) from the source set
begin
if x = y * 13 or y = x * 13 then make edge between x and y
end
while graph has edges
begin
let V = find: a vertex with maximum count of edges (it can be 1 or 2)
remove V from the graph
end
result: the remaining vertexes in the graph