[英]Using XOR operator to determine if there are duplicates in a list of integers
我有一个数字列表:
a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124, ...]
#this is an abbreviated version of the list
我需要确定列表中是否有重复项,或者不使用XOR(“ ^”)运算符。
谁能给我任何提示? 我是新手,从未遇到过此问题,也从未使用过XOR运算符。
我尝试了几种方法(这些方法在黑暗中相当于盲目的刺伤)。 最后一个是这样的:
MyDuplicatesList = [1,5,12,156,166,2656,6,4,5,9] #changed the list to make it easer
for x in MyDuplicatesList:
if x^x:
print("True")
我意识到我可能会问这样一个开放性的问题,从而违反了协议,但我完全感到困惑。
为什么要异或?
# true if there are duplicates
print len(set(a)) != len(a)
好的,这是pythonic。 它找到所有重复项并列出它们。
a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124,1]
b = [a[i] for i in range(len(a)) for j in range(i+1,len(a)) if i ^ j > 0 if a[i] ^ a[j] < 1]
print b
达伦的想法的简化版本:
a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124,1]
def simplifyDalen(source):
dup = 0
for x in source:
for y in source:
dup += x ^ y == 0
return dup ^ len(source) > 0
result = simplifyDalen(a)
if result:
print "There are duplicates!"
else:
print "There are no duplicates!"
到目前为止,我的位索引想法是最快的(因为我想这是一次通过算法,所以不是很多对很多)
当您对两个相同的数字进行异或运算时,您将获得0。应该知道。
from operator import xor
def check (lst):
dup = 0
for x in lst:
for y in lst:
dup += xor(x, y)!=0
l = len(lst)
return dup!=(l**2 -l)
c = check([0,1,2,3,4,5,4,3,5])
if c:
print "There are duplicates!"
else:
print "There are no duplicates!"
顺便说一句,这是非常愚蠢的方式。 XORing速度很快,但是O(n ** 2)(始终贯穿整个集合)是不必要的损失。 一方面,遇到第一个重复项时应停止迭代。 另外,这实际上应该使用set()或dict()完成。 但是您可以理解。
同样,使用xor()函数代替按位运算符'^'会使事情变慢。 为了使代码清晰,我将其复杂化了。 因此人们知道它是替代品。
这是一个如何做得更好的例子。 这是Organis在注释中建议的代码的略微修改。
def check (lst):
l = len(lst)
# I skip comparing first with first and last with last
# to prevent 4 unnecessary iterations. It's not much, but it makes sense.
for x in xrange(1, l):
for y in xrange(l-1):
# Skip elements on same position as they will always xor to 0 :D
if x!=y: # Can be (if you insist): if x^y != 0:...
if (lst[x] ^ lst[y])==0:
return 1 # Duplicate found
return 0 # No duplicates
c = check([0,1,2,3,4,5,4,3,5])
if c:
print "There are duplicates!"
else:
print "There are no duplicates!"
重复一遍,至少在高级编程语言中,不将XOR用于比较。 出于某种原因,您可能需要在汇编中使用类似的东西,但是eq在任何地方都可以很好地工作。 如果我们在这里简单地使用==,那么我们将能够检查列表中是否包含重复项,而不仅仅是任何整数。
XOR非常适合用于其他用途,例如普通的bitwising(屏蔽,取消屏蔽,更改位...),因此适用于加密系统和类似的东西。
XOR采用数字的二进制表示形式,然后将其与另一个进行逐位比较,如果两位不同,则输出1,否则输出0。 示例:1 ^ 2 = 3,因为在二进制数1中是01,而2在10中,因此逐位比较得出11或3。对数字与自身进行异或运算总是得到0,因此我们可以使用此属性检查两个数字是相同的。 与使用XOR相比,还有很多更好的方法来检查列表中的重复项,但是如果您希望/需要这样做,希望以上信息可以让您了解从何处开始。
好吧,让我们使用列表项作为位索引:
def dupliXor(source):
bigs = 0
for x in source:
b = 1<<x
nexts = bigs ^ b
# if xor removes the bit instead
# of adding it then it is duplicate
if nexts < bigs:
print True
return
bigs = nexts
print False
a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124,1]
dupliXor(a) # True
a = [1,2,3,4,5,19,22,25,17,6,73,72,71,77,899,887,44,124]
dupliXor(a) # False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.