- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定一个大小为 N 的集合 S。计算 S 的所有子集,其中子集的元素的累积 XOR 小于 K。
我可以想到蛮力方法来生成 S 的所有子集并计算累积 XOR 元素小于 k 的子集。我正在寻找优化的解决方案而不生成 S 的所有子集,我可以找到所有这样的子集
Example:
S = {1,2}
K = 4
U = {{},{1},{2},{1,2}}
Answer is 4 As
cumulative XOR values are 0 for {}, 1 for {1}, 2 for {2}, 3 for {1,2}.
最佳答案
根据问题的限制,有几种可行的方法来解决它:
O(2^N)
中所有可能的子集将产生预期的结果。让我们看一下 S 中数字的二进制表示,例如数字 17、5、20、14 将是:
10001 17
00101 5
10100 20
01110 14
对于 K 也一样,例如让我们取 K=11: 01011 11
如果我们想计算有多少子集与恰好 K 异或,我们可以将问题表示为一个模 2 的线性方程组,其中的变量与 S 中的数字一样多,并且许多方程式,因为我们的数字中有有意义的位。更具体地说,让第 i 个等式表示约束“S 的子集中第 i 位数字的 XOR 应等于 K 中的第 i 位”。 (请注意,XOR 运算等效于求和模 2)。例如,对于最小(最右边)的位,我们有以下内容:x1 * 1 + x2 * 1 + x3 * 0 + x4 * 0 = 1 (mod 2)
,其中 x_j 为 0 或 1,具体取决于我们是否在子集中包含第 j 个数。
请注意,这个方程组可能有 0 个、1 个或多个解。在多解的情况下,每个自变量可以取0或1,因此解的个数为2^(自变量)。
我们可以使用在 O(n^3)
中运行的高斯消元检测线性方程组的自变量数量和可解性对于大小为 n
的方阵- 在你的情况下,矩阵不是正方形的,所以我们可以使用 (|S|, log(max(S))
中较大的一个估计复杂性。
太好了,现在我们可以遍历从 0 到 K-1
的所有 K' ,分别解决问题,并对结果求和。然而,这并不比动态规划解决方案更好,而且在运行时只是伪多项式。让我们进行另一个将产生多项式解的观察:我们只对 O(logK)
感兴趣不同的方程组计算有多少子集 XOR 小于 K
.
让我们表示 K
中的最高非零位位置作为 B。如果 B 以上的所有位和 B 位在我们采用的子集的 XOR 中都等于 0,那么显然它将小于 K
。 .因此,我们的第一个方程组可以只写出上述位,而忽略 B 以下的所有内容。
现在让我们看看如果我们允许第 B 位等于 1 会发生什么。如果在数字 K
中在第 B 个位置之后有一个或多个零位,它们在结果 XOR 中也必须全部为 0。如果第一个后续非零位 B2 在我们的 XOR 中设置为 0,那么它将小于 K。我们可以将此观察编码为第二个方程组,说“B 以上的所有位都是 0,位 B 是1,B和B2之间的位全部为0,B2位为0",计算其解的个数。
如果我们继续这样直到 K
中的最小二进制位置, 我们最多需要构建 logK
方程组,得到我们想要的结果。
这种方法的复杂度类似于 O(logK * max(n, logK)^3)
,尽管根据实现方式,高斯消去法对于非方矩阵的工作速度要快得多。
关于algorithm - 计算累积 XOR 小于 k 的子集数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090764/
XOR 的各个部分如何命名? A xor B = C A和B叫什么 对于分部,它是: A / B = C A = 除数,B = 被除数,C = 商 对于和(和 XOR 与和一样对称)它是 A + B
我在算法方面遇到了问题。 我有一个用于 IO 的字节,可以使用称为 XorAndXor 的方法设置其中的某些位。该算法的工作原理如下: newValue = (((currentValue XOR x
我很惊讶地看到一个 BPMN 图,其中一个异或决策(“XOR-Split”)用相同的网关符号“关闭”。 我真的想知道证明这种方法合理的原因是什么。在我看来,这是多余的。 事实似乎是,XOR-Join
我在查看 XOR 链接列表的实现时多次遇到这段代码,但似乎没有一个人正确解释了这一行(或者也许我错过了一些东西) - struct node* XOR (struct node *a, struct
这应该是一个简单的问题。我是 Coq 的新手。 我想在 Coq 中定义exclusive or in Coq(据我所知,这不是预定义的)。重要的部分是允许多个命题(例如 Xor A B C D)。 我
我试图记住数学是如何计算出来的,以计算循环冗余检查中 XOR 算法的剩余部分,以验证网络消息的剩余位。 我不应该扔掉那本教科书。 这在代码中很容易完成,但是如何手工完成呢? 我知道它看起来有点像标准除
给定一个数字 N 和一个整数数组(所有整数都小于 2^15)。 (A 是数组 100000 的大小) 从数组中找到 N 和整数的最大 XOR 值。 Q是查询次数(50000)和开始,停止是数组中的范围
这更像是一个有趣的问题。我正在研究 SC61860 CPU,它是 8 位 CPU,用于 1987 年的 Sharp PC-1360 掌上电脑(也用于 PC-1401 和 1403)。它的指令集实际上并
我正在尝试在 c 中进行某种异或文件加密,并在 javascript 中进行解密(使用 this 作为基础,现在我遇到了以下问题: 例如我想在 C 中执行 73^122,结果是 57,但在 javas
我的任务是计算数组中字节的异或和: X = char1 XOR char2 XOR char3 ... charN; 我正在尝试将其并行化,改为对 __m128 进行异或运算。这应该提供加速因子 4。
我有一系列错误或 View ( Seq[Xor[Error,View]] ) 我想将其映射到第一个错误(如果有)或 View 序列的异或 ( Xor[Error, Seq[View]] ) 或者可能只
这是我想做的一个例子:假设我有 5 个类,我想表达这样的约束,即我们可以将类“B”或/和“C”的实例链接到“A”,如果是这样,我们就不能拥有其他任何东西,如果我们不这样做没有这些类的任何实例,我们只能
因此我们可以确定异或距离度量是一个真实的度量(它是对称的,满足三角不等式等) 在阅读 Kademlia 及其 k-buckets 之前,我在想每个节点都会简单地找到自己的 id 并存储其最近的 k 个
该函数用于计算一个32位整数的异或 int xor32int(int x, int y) { int res = 0; // Initialize result // Assuming
我是加密新手,我正在尝试解释以下代码。即, 是什么?什么意思? 我有一个 secret_key key 。我也有一个 unique_id。我使用下面的代码创建垫。 pad = hmac.new(sec
我正在尝试将一些 javascript 代码复制到 python 中,由于某种原因,javascript 中的 XOR 运算符 (^) 给我的值与 python 中的 XOR 运算符 (^) 不同。我
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这个问题在这里已经有了答案: Does Typescript support mutually exclusive types? (7 个答案) 关闭 3 年前。 我怎么说我希望一个接口(inter
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是: xor al, al add esp, 8 cmp byte ptr [ebp+
我得到了以下卡诺图,但我仍然无法从每个表中计算 XOR 的表达式。 Table 1 -------
我是一名优秀的程序员,十分优秀!