在多项式大小布尔表达式中表达事实

时间:2012-02-22 11:48:37

标签: algorithm complexity-theory boolean-logic boolean-expression reduction

如果我有布尔变量a_1,a_2,..,a_n。如何使用多项式大小布尔表达式来表达设置为true的布尔变量的数量大于某些k的事实? (指数很容易 - 只需编写牛顿(n,k)表达式)。

2 个答案:

答案 0 :(得分:1)

使用任何排序网络对您的布尔值进行排序。然后只需取(k + 1)'排序位,即可得到结果。

由于每个排序网络的元素都代表一对逻辑运算,因此您可以将此网络解释为逻辑表达式。通过良好的排序网络,这将为您提供O(N * log 2 (N))操作的表达式。

答案 1 :(得分:0)

让t [i] [j]表示将元素a_1,..,a_i,j中的元素设置为true。 现在我们可以清楚地看到

    t[i][j] => (t[i-1][j] or (t[i-1][j-1] and a_i). 

(因为已经在a_1,..,a_(i-1)或a_i中设置了变量,并且a_1,..,a_(i-1)中存在j-1个变量。 这是多项式大小表达式(大约n * k个变量t [i] [j],对于每个表达式,如我上面所写的那个)。然后,如果t [n] [k]为真,我们得到n个变量至少为k是真的。

对Evgeny的回答, 为了按排序顺序获取变量(首先是trues,然后是falses),我们查看序列 t [n] [1],t [n] [2],.. t [n] [n]。