繁体   English   中英

使用XOR运算符交换数组在Python中不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM