[英]Swapping array with the XOR operator doesn’t work in Python
我试图在Python中编写Quicksort代码(请参阅问题末尾的完整代码),在分区函数中,我应该交换数组的两个元素(称为x
)。 我使用以下代码进行基于xor运算符的交换:
x[i]^=x[j]
x[j]^=x[i]
x[i]^=x[j]
我知道它应该工作,因为xor运算符的nilpotence(即x^x=0
),我已经在Java和C中完成了一百万次而没有任何问题。 我的问题是:为什么它在Python中不起作用? 当x[i] == x[j]
(也许i = j
?)时,它似乎不起作用。
x = [2,4,3,5,2,5,46,2,5,6,2,5]
print x
def part(a,b):
global x
i = a
for j in range(a,b):
if x[j]<=x[b]:
x[i]^=x[j]#t = x[i]
x[j]^=x[i]#x[i] = x[j]
x[i]^=x[j]#x[j]=t
i = i+1
r = x[i]
x[i]=x[b]
x[b]=r
return i
def quick(y,z):
if z-y<=0:
return
p = part(y,z)
quick(y,p-1)
quick(p+1,z)
quick(0,len(x)-1)
print x
至于为什么它不起作用,它真的应该不重要1 ,因为你不应该首先使用这样的代码, 特别是当Python给你一个非常好的'原子交换'功能时:
x[i], x[j] = x[j], x[i]
我一直认为所有程序最初都应该首先针对可读性进行优化,只有在明确需要和明显优势的情况下才能实现性能或存储改进(在一些非常小的数据之外,我从未见过XOR技巧)环境就像一些嵌入式系统)。
即使在不提供这种漂亮功能的语言中,使用临时变量也更具可读性并且可能更快:
tmp = x[i]
x[i] = x[j]
x[j] = tmp
1然而,如果你真的想知道为什么它不起作用,那是因为这个技巧可以交换两个不同的变量,但是当你使用同一个变量时不太好,这就是你在尝试时会做的事情当i
等于j
时,用x[j]
交换x[i]
。
它在功能上等同于以下内容,添加了print
语句,以便您可以看到整个事物分崩离析的地方:
>>> a = 42
>>> a ^= a ; print(a)
0
>>> a ^= a ; print(a)
0
>>> a ^= a ; print(a)
0
对比两个不同的变量,哪个工作正常:
>>> a = 314159; b = 271828; print(a,b)
314159 271828
>>> a ^= b; print(a,b)
61179 271828
>>> b ^= a; print(a,b)
61179 314159
>>> a ^= b; print(a,b)
271828 314159
问题是这个技巧的工作原理是逐渐在两个变量之间传递信息(类似于狐狸/鹅/豆之谜)。 当它是相同的变量时,第一步并没有那么多传递信息,因为它会破坏它。
Python的'原子交换'和临时变量的使用都将完全避免这个问题。
我正在审查这个事实,例如,您可以像下面的表达式一样表达xor:
a xor b = (a or b) - (a & b)
所以,基本上,如果你用b替换a,哇! xDD你会得到它,零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.