Python二进制搜索查找所有不重复的数字

Python二进制搜索查找所有不重复的数字,python,algorithm,Python,Algorithm,我一直在尝试编写一个二进制搜索函数来查找列表中所有唯一的数字。我知道我必须找到列表的中间值,并根据数字的大小将其与第一个和最后一个元素进行比较。但我看不出所有元素是如何相互检查以找到非重复项的。 我可以轻松地使用len(set(list))删除所有重复项,但不确定如何在二进制搜索中使用它 非常感谢您的帮助。如果列表先按顺序排序,就很有可能做到这一点。这就是它的工作原理:(引自各种网络资源) 这里显示的示例只是尝试查找单个重复编号 它可以在O(logn)时间内完成。观察结果如下: 在所需索引之前的

我一直在尝试编写一个二进制搜索函数来查找列表中所有唯一的数字。我知道我必须找到列表的中间值,并根据数字的大小将其与第一个和最后一个元素进行比较。但我看不出所有元素是如何相互检查以找到非重复项的。 我可以轻松地使用len(set(list))删除所有重复项,但不确定如何在二进制搜索中使用它


非常感谢您的帮助。

如果列表先按顺序排序,就很有可能做到这一点。这就是它的工作原理:(引自各种网络资源) 这里显示的示例只是尝试查找单个重复编号

它可以在O(logn)时间内完成。观察结果如下:

在所需索引之前的所有数字第一次出现在偶数索引(0,2,…),下一次出现在奇数索引(1,3,…)。并且在所需元素之后的所有元素第一次出现在奇数索引中,下一次出现在偶数索引中

  • 找到中间的索引,说“mid”
  • 如果“mid”为偶数,则比较[mid]和[mid+1]。如果两者相同,则“mid”后面的必需元素在mid之前
  • 如果'mid'为奇数,则比较[mid]和[mid–1]。如果两者相同,则“mid”后面的必需元素在mid之前
  • 让我们用一些代码片段来演示想法/步骤:

    
    def二进制搜索(A、l、h):
    #l:低,h:高h:返回无
    如果l==h:返回一个[l]
    #中点
    mid=(h+l)//2
    #如果mid是偶数。。。
    如果中间%2==0:
    如果A[mid]==A[mid+1]:
    返回二进制搜索(A,mid+2,h)
    其他:
    返回二进制搜索(A、l、mid)
    其他:
    如果A[mid]==A[mid-1]:#mid是奇数
    返回二进制搜索(A,mid+1,h)
    其他:
    返回二进制搜索(A、l、mid-1)
    #测试代码
    A=[1,1,3,4,4,5,5]
    单=二进制搜索(A,0,len(A)-1)
    打印(f'唯一编号为{single}')
    

    请包含您当前的代码。列表的二进制搜索仅在列表已排序的情况下有效,并且只有在您查找单个值时才有意义。如果您有一个已排序的列表,并且希望对其进行重复数据消除,则只需沿直线遍历它,而不是对每个元素进行二进制搜索。也许你可以澄清更多关于这个列表的信息,以及为什么你特别尝试使用二进制搜索来解决这个问题。如果你有三个1呢?只有当数字被精确复制两次时,这才是一个聪明的方法,但如果不知道更多,很难说这是否是一个有效的答案@疯狂的物理学家-那么这个案例应该被修改。代码/解释只是为了回答二进制搜索如何适用于该案例。我相信《华盛顿邮报》做到了这一点。对吗?请参阅@Samwise之前关于查找多个唯一数字的评论。@Daniel Hao。非常感谢你的回答。这一点非常清楚。@Daniel Hao。已接受,但由于声誉低于15,无法提升投票。
     Output:
            3