Arrays 寻找整数数组子集是否存在的有效算法,其所有元素的异或是否为给定值?
我有一个正整数数组- {1,5,8,2,10}和给定值7。 我需要找出数组的一个子集是否存在,以使其元素的XOR值为7。 在这种情况下,子集是{5,2},因为5XOR 2是7。 一个简单的解决方案是找到所有的子集并检查是否存在一个解决方案。我想要一些比简单算法更好的算法。Arrays 寻找整数数组子集是否存在的有效算法,其所有元素的异或是否为给定值?,arrays,algorithm,subset-sum,bitwise-xor,Arrays,Algorithm,Subset Sum,Bitwise Xor,我有一个正整数数组- {1,5,8,2,10}和给定值7。 我需要找出数组的一个子集是否存在,以使其元素的XOR值为7。 在这种情况下,子集是{5,2},因为5XOR 2是7。 一个简单的解决方案是找到所有的子集并检查是否存在一个解决方案。我想要一些比简单算法更好的算法。 注:-我只需要找到解是否存在。我不需要找到子集。这归结为用两个元素(GF(2))求解有限域上的线性方程组。按位异或在这里相当于添加两个向量。样本输入对应于这样的向量 1: 0001 5: 0101 8: 1000 2:
注:-我只需要找到解是否存在。我不需要找到子集。这归结为用两个元素(GF(2))求解有限域上的线性方程组。按位异或在这里相当于添加两个向量。样本输入对应于这样的向量
1: 0001
5: 0101
8: 1000
2: 0010
10: 1010
7: 0111
系统看起来是这样的
[0 0 1 0 1] [a] [0]
[0 1 0 0 0] [b] [1]
[0 0 0 1 1] [c] = [1]
[1 1 0 0 0] [d] [1]
[e]
下面的Python代码使用并使用逐位操作实现。对于固定宽度的整数,它以线性时间运行。请原谅我没有再解释高斯消去法,因为互联网上已经有一百万种更好的治疗方法了
#!/usr/bin/env python3
def least_bit_set(x):
return x & (-x)
def delete_zeros_from(values, start):
i = start
for j in range(start, len(values)):
if values[j] != 0:
values[i] = values[j]
i += 1
del values[i:]
def eliminate(values):
values = list(values)
i = 0
while True:
delete_zeros_from(values, i)
if i >= len(values):
return values
j = i
for k in range(i + 1, len(values)):
if least_bit_set(values[k]) < least_bit_set(values[j]):
j = k
values[i], values[j] = (values[j], values[i])
for k in range(i + 1, len(values)):
if least_bit_set(values[k]) == least_bit_set(values[i]):
values[k] ^= values[i]
i += 1
def in_span(x, eliminated_values):
for y in eliminated_values:
if least_bit_set(y) & x != 0:
x ^= y
return x == 0
def main():
values = [1, 5, 8, 2, 10]
eliminated_values = eliminate(values)
print(eliminated_values)
x = int(input())
print(in_span(x, eliminated_values))
if __name__ == '__main__':
main()
#/usr/bin/env蟒蛇3
def最小位设置(x):
返回x&(-x)
def从(值,开始)中删除0:
i=开始
对于范围内的j(开始,len(值)):
如果值[j]!=0:
值[i]=值[j]
i+=1
del值[i:]
def消除(值):
值=列表(值)
i=0
尽管如此:
从(值,i)中删除0
如果i>=len(值):
返回值
j=i
对于范围内的k(i+1,len(值)):
如果最小比特集(值[k])<最小比特集(值[j]):
j=k
值[i],值[j]=(值[j],值[i])
对于范围内的k(i+1,len(值)):
如果最小比特集(值[k])==最小比特集(值[i]):
值[k]^=值[i]
i+=1
def在_范围内(x,消除的_值):
对于y(在U值中):
如果最小位设置(y)&x!=0:
x^=y
返回x==0
def main():
值=[1,5,8,2,10]
消除值=消除(值)
打印(已消除的值)
x=int(输入())
打印(单位:x,消除的值)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
“高效”。。。?时间、记忆、理论复杂性?@mounaim你是说数字>7不能成为解决方案的一部分吗?错了,我想他是在积极地工作integers@mounaim还有。。。?15 xor 8也是7,两者都大于7(显示的数组没有15和8,但它应该适用于任何数组和数字,对吗?)GF(2)上的高斯消去将是线性时间(有点欺骗,因为我将32视为常数)。当我们知道数组中任何数字的最大位数只能达到10位时,有没有更好的方法?有没有像子集求和问题一样的递归解决方案?这段代码能告诉我们是否存在解决方案,如果有,那么有多少个解决方案?@SahilArora对第一个问题是,对第二个问题不是。修改是每次删除非枢轴元素的零时,将解的数量乘以2。