如何使用Binary Search计算排序数组中唯一数字的数量?

问题描述

我正在尝试使用二进制搜索来计算排序数组中唯一数字的数量。我需要获得从一个数字到下一个数字的变化的优势。我当时正在考虑不使用递归来执行此操作。有迭代的方法吗?

def unique(x):
    start = 0
    end = len(x)-1
    count =0
    # This is the current number we are looking for
    item = x[start]

    while start <= end:
        middle = (start + end)//2
        
        if item == x[middle]:
            start = middle+1
            
        elif item < x[middle]:
            end = middle -1
        
        #when item item greater,change to next number
        count+=1

    # if the number
    return count
    
unique([1,1,2,5,5])

谢谢。

编辑:即使o(n)忽略了运行时好处,我的二进制搜索缺少什么?当不寻找实际项目时,这很令人困惑。我该如何解决

解决方法

利用二进制搜索的工作代码(在给定的示例中返回3)。

如评论中所述,复杂度约为O(k*log(n)),其中k是唯一项的数量,因此与n相比,当k小时效果很好,并且可能会变得比线性差扫描k ~ n

def countuniquebs(A):
    n = len(A)
    t = A[0]
    l = 1
    count = 0
    while l < n - 1:
        r = n - 1
        while l < r:
            m = (r + l) // 2
            if A[m] > t:
                r = m
            else:
                l = m + 1
        count += 1
        if l < n:
            t = A[l]
    return count

print(countuniquebs([1,1,2,5,5]))
,

我不会称其为“使用二进制搜索”,但是这种二进制的分治算法可以在O(k * log(n)/ log(k))的时间内工作,这比重复操作要好二进制搜索,并且永远不会比线性扫描更糟糕:

def countUniques(A,start,end):
    len = end-start
    if len < 1:
        return 0
    if A[start] == A[end-1]:
        return 1
    if len < 3:
        return 2
    mid = start + len//2
    return countUniques(A,mid+1) + countUniques(A,mid,end) - 1

A = [1,3,4,5]
print(countUniques(A,len(A)))