如何构造约束满足问题?

时间:2019-06-30 14:50:39

标签: algorithm compression constraints constraint-programming lossless-compression

这是我的问题的继续:https://math.stackexchange.com/questions/3278359/figuring-out-the-underlying-construction-of-a-final-set

要以更CS的方式重新发布问题,如果仅给出A,您将如何找到B

$ A = [ 1, 5, 10 ]
$ B = f(A)
$ B == [ 1, 5, 6, 10, 11, 15, 16 ]
(true)
$ B == { 1, 5, 10, 5+1, 10+1, 10+5, 10+5+1 }
(true)
$ solve(B)
[ 1, 5, 10 ]

f()从所有非空组合中找到唯一值的集合。

由于A始终是B的子集,因此我认为可能存在一种蛮力方法,您可以在其中尝试B中元素的每种组合(不是全部 B元素),直到您解决了整个集合。但是,这将是极其低效的。 (我在想像阶N因数...)由于存在多种解决方案,因此您需要计算整个集合,或者在确定阈值之后停止。

经过评论中的一些讨论,我认为这是一个约束满足问题。如何组织? (伪代码可以。)

对于超级奖励积分:如果我们假设A不是B的子集,怎么解决呢?

例如:

$ B = [15, 16, 15.5, .5, 10.5]
$ solve(B)
[.5, 1, 5, 10]

解决此问题的另一种方法:找到最小基值集的无损压缩算法会是什么样? (基本值和输出数据之间的映射可以忽略。)

1 个答案:

答案 0 :(得分:0)

如果A中的元素数为n,则B的元素数将为(2 ^ n)-1。
这意味着B中的元素数量等于A的所有可能子集的数量。

例如

如果A = {a,b,c}
 那么B = {a,b,c,a + b,a + c,b + c,a + b + c}

要获取B的所有元素,我们可以从1迭代到(2 ^ n)-1。
 现在,根据每个数字,我们将计算B的不同元素。

  

让我们
         A = {a,b,c}。
         n = 3,A中的元素数

   For each i from 1 to 2^n-1, we will check each bit(j) of i from 0 to n-1.
   if jth bit is 1, we will take jth element of A for finding ith element of B.
   Such way we will add some number from A for finding ith element such that
   their index's bit in i is 1.

例如,

1   001     B[0]=a
2   010     B[1]=b
3   011     B[2]=a+b
4   100     B[3]=c
5   101     B[4]=a+c
6   110     B[5]=b+c
7   111     B[6]=a+b+c

所以总复杂度为n * 2 ^ n。

伪代码:

b=[]
for i in (from 1 to 2^n-1):
   ith=0
   for j in(from 0 to n-1)
       if(jth bit in i is 1)
           ith+=A[j]
   #inner_loop_end
   b.append(ith)