要以更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]
解决此问题的另一种方法:找到最小基值集的无损压缩算法会是什么样? (基本值和输出数据之间的映射可以忽略。)
答案 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)