繁体   English   中英

使用XOR运算符确定整数列表中是否存在重复项

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

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