我有一个数字池,从这些数字中,X与所有其他数字进行了异或。从这些比较中,最小XOR值以排序格式存储在列表中。
如何检索X?
e.g。
# create example data
x = read.table(header = TRUE, stringsAsFactors = FALSE, text =
"Taxon B Tip
Nitrosotalea_devanaterra 1 Methanothermobacter_thermautotrophicus
Nitrososphaera_gargensis 1 Methanobacterium_beijingense
Nitrososphaera_sca5445 1 Methanobacterium_bryantii
Nitrososphaera_sca2170 1 Methanosarcina_mazei
Methanobacterium_beijingense 1 Persephonella_marina
Methanobacterium_bryantii 1 Sulfurihydrogenibium_azorense
Methanothermobacter_thermautotrophicus 1 Balnearium_lithotrophicum
Methanosarcina_mazei 1 Isosphaera_pallida
Koribacter_versatilis 1 Methanobacterium_beijingense
Acidicapsa_borealis 1 Parachlamydia_acanthamoebae
Acidobacterium_capsulatum 1 Leptospira_biflexa")
# Data management part
x1 = data.frame(A = x$Taxon,B = x$B)
x2 = data.frame(A = x$Tip,B = x$B)
x$B[which(x$Taxon == anti_join(x1,x2))] = 0
可能不只是一个X甚至没有X.当我们不知道它的初始值和结果时,有没有办法恢复XOR的过程但只是它的比较值?如果我们知道整个数字池,怎么能有效地解决这个问题?
答案 0 :(得分:1)
你可能不会。
XOR是一项非常特殊的操作。它的特性使得不可能只给出一个操作数或结果。
如果A xor B == C
,那么我们有其他五个表达式:
C xor A == B
B xor C == A
C xor B == A
A xor C == B
B xor A == C
如果你看到这一点,你应该知道从另一个人那里获得一个价值是不可能的。第三个总是需要两个。
答案 1 :(得分:1)
这在很大程度上取决于你的输出。问题可能是不受约束的,给出了许多可能的X值。或者它可能是不可能的(没有X满足约束条件)。
一种方法是配对仅在最重要位中不同的值。如果每对中较小的一个出现在较大的之前,则MSB必须为0;如果较大的首先出现,则MSB必须为1.
根据这些知识,我们可以考虑仅在前两位有所不同的对,依此类推。
答案 2 :(得分:0)
如果输出中的某些条件为真,则可以相当有效地确定X的值。
例如: 如果值15在输出数组中,那么您将知道X是其他数字之一的二进制补码。此外,如果值0在输出数组中,您将知道这是X与其自身进行异或的结果。
然而,具有有效时间复杂度的通用算法将是困难的。