【问题标题】:How do you find the largest subset of an array of integers that xor to zero如何找到异或为零的整数数组的最大子集
【发布时间】:2017-03-18 17:55:35
【问题描述】:

为了澄清,数组的最大子集:[0,1,4,5,6,8] xor 到 0 将是 [0,1,4,5],因为 0^1^4^5= 0(其中 ^ 是异或)。我知道这可以通过蛮力在指数时间内完成,但我想知道下限是什么,以及在那段时间内解决它的算法。

我正在实现 Rational 筛算法。除了wikipedia article,算法上的资源相当稀缺。为了完成有理筛,你试图找到一组数组的一个子集,这样当把相应的元素相加时,得到的数组只有偶数。例如:

[2,3,4,5]+[4,3,4,3]=[6,6,8,8] 这将是一个有效的解决方案,前提是这些数组存在于更大的集合中。

根据那篇维基百科文章,这可以使用线性代数来解决,但我对线性代数了解的不够多。

就算法而言,空子集没有用处。

我简化了问题,说数组只能有 0 和 1,并将数组放入单个数字中,以便可以使用单个运算符计算总和,否则它们是相同的问题。

【问题讨论】:

  • 仅连续子集?
  • 不,您可以使用任何非空子集。 @גלעדברקן
  • 其实我想不出一个次指数的解决方案。
  • 您可以对所有数字进行异或运算,然后找到异或等于该数字的最小子集并将其从解决方案中删除。复杂性仍然相同,但您正在尝试找到一些小而不是大的东西。

标签: arrays algorithm subset linear-algebra


【解决方案1】:

是的,它可以表述为线性优化问题。假设整数是k 位并且其中有n,您可以将它们表示为k * n 矩阵A,其中列表示整数,列n 的行r 是@ 987654327@-整数i的第位。

然后整数的选择和异或可以表示为A * x,其中x 是大小为n 的向量,在选定整数的位置具有1-s。这必须超过 GF(2),所以乘法是标准的,加法是 XOR。所以你正在解决maximize(|x|)主题Ax = 0

【讨论】:

  • 我认为这个答案很好,我会尽快标记它,但有一些地方我需要弄清楚。你知道这个算法的最差或平均性能是什么吗?
  • 恐怕GF(2)中没有有效的线性优化通用算法。也许这个特殊的问题有一些捷径,它看起来不是 NP 难的。简而言之:我不知道:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多