我有一组变量 S ,以及在 S 上定义的布尔函数 f ,如下所示:
f (x 1 ,x 2 ,... x n )= true iff f (x i ,x j )=真∀1≤i≤ n ∀1≤j≤ n , n > 1,否则为假。
f (a,b)已知且 f (a,a)为True∀a,b S 。
我很感激在设计快速算法方面提供了一些帮助,该算法可以返回 f 返回True的所有 S 子集。
例如,让 S = [a,b,c]和 f (a,b)= f (b, c)= f (a,c)=真。然后该算法应返回[[a,b],[a,c],[b,c],[a,b,c]]。
我想到了四种改进暴力搜索的策略:
1) f 的参数顺序无关紧要。
2)使用 f (a,a)为真且 f (x i ,x j < / sub>)= f (x j ,x i )所以只有i&lt; j需要检查。
2)使用 f (x 1 ,x 2 ,... x n < / em> +1 )= f (x 1 ,x 2 ,... x n )∧( f (x i ,x n +1 ) ∀1≤i≤ n )其中∀表示迭代连接。
3)注意2)暗示如果 f (x 1 ,x 2 ,... x n )返回False,然后 f (x 1 ,x 2 ,... x n +Δ)也可以减少解空间。
4)如果 f (x i ,x j )对于某些i,j为假,则返回False。 / p>
如果你想编写一些代码,如果你能在python中给它,我将不胜感激。
非常感谢。
答案 0 :(得分:5)
双参数函数f(a, b)
可以看作S上的对称,自反关系,可以看作是无向图。
如果f(x1, ..., xn)
形成一个完整的子图,{x1, ..., xn}
为真。
从那里开始,你最终到了clique problem,遗憾的是,这是NP完全的。换句话说,快速算法不太可能存在。