我一直试图将xor-swap扩展到两个以上的变量,比如说n
个变量。但我没有比3*(n-1)
更好的了。
对于两个整数变量x1
和x2
,您可以像这样交换它们:
swap(x1,x2) {
x1 = x1 ^ x2;
x2 = x1 ^ x2;
x1 = x1 ^ x2;
}
因此,假设您x1
... xn
的值为v1
... vn
。很明显,你可以"旋转"连续应用swap的值:
swap(x1,x2);
swap(x2,x3);
swap(x3,x4);
...
swap(xm,xn); // with m = n-1
您最终会得到x1 = v2
,x2 = v3
,...,xn = v1
。
哪些费用n-1
互换,每个费用3
xors,只留下(n-1)*3
xors。
是一种更快的算法,只使用xor和赋值而不知道其他变量吗?
答案 0 :(得分:2)
作为部分结果,我尝试了强力搜索N = 3,4,5,所有这些都与你的公式一致。
Python代码:
from collections import *
D=defaultdict(int) # Map from tuple of bitmasks to number of steps to get there
N=5
Q=deque()
Q.append( (tuple(1<<n for n in range(N)), 0) )
goal = (tuple(1<<( (n+1)%N ) for n in range(N)))
while Q:
masks,ops = Q.popleft()
if len(D)%10000==0:
print len(D),len(Q),ops
ops += 1
# Choose two to swap
for a in range(N):
for b in range(N):
if a==b:
continue
masks2 = list(masks)
masks2[a] = masks2[a]^masks2[b]
masks2 = tuple(masks2)
if masks2 in D:
continue
D[masks2] = ops
if masks2==goal:
print 'found goal in ',ops
raise ValueError
Q.append( (masks2,ops) )