C 寻找一个月递增然后递减的数字

C 寻找一个月递增然后递减的数字,c,algorithm,binary-search,C,Algorithm,Binary Search,可以在O(logn)中求出一个序列中的最大值或最小值,该序列先单调增加,然后单调减少 然而,如果我想检查这样一个序列中是否存在一个数字,这也可以在O(logn)中完成吗 我认为这是不可能的。考虑这个例子:1,4,5,6,7,10,8,3,2,0。 在本例中,如果我需要确定序列是否包含“2”,我没有任何条件将搜索空间划分为原始搜索空间的一半。在最坏的情况下,它将是O(n),因为当我们试图搜索2时,您需要检查两个部分 我想知道,如果在O(logn)时间内完成此搜索?如您所述,您可以在O(logn)时

可以在O(logn)中求出一个序列中的最大值或最小值,该序列先单调增加,然后单调减少

然而,如果我想检查这样一个序列中是否存在一个数字,这也可以在O(logn)中完成吗

我认为这是不可能的。考虑这个例子:1,4,5,6,7,10,8,3,2,0。 在本例中,如果我需要确定序列是否包含“2”,我没有任何条件将搜索空间划分为原始搜索空间的一半。在最坏的情况下,它将是O(n),因为当我们试图搜索2时,您需要检查两个部分


我想知道,如果在O(logn)时间内完成此搜索?

如您所述,您可以在O(logn)时间内找到最大值(及其位置)。然后你可以在每个部分做一个二进制搜索,也就是O(logn)

在上面的示例中,您可以在位置5处找到最大值10。 然后在子序列[0..5](1,4,5,6,7,10)中进行二进制搜索。 由于找不到2,您继续在另一部分(10、8、3、2、0)中进行二进制搜索


要找到O(logn)中的最大值,请查看中心的两个元素:7<10。所以我们仍然在增加部分,必须在序列的右半部分寻找最大值:(10,8,3,2,0)。看8和3,继续看左边的部分(10,8)。

因为我记得对元素顺序依次递增和递减的数组的最佳搜索是斐波那契搜索算法。

这里是python的一个草图。简而言之,我们的目标是找到一个元素,该元素与递增和递减区域相邻(我们检查两个条件来检查相邻元素)。在找到这个元素之前,我们一直像标准的二进制搜索一样跳跃。希望有帮助

def get_max(arr):
    if len(arr) == 1:
         return arr[0]
    if len(arr) in [0,2]:
        return None
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left+right) // 2
        #increasing region
        if arr[mid+1] >  arr[mid] and arr[mid] > arr[mid-1]:
            left = mid + 1
        #decreasing region
        elif arr[mid+1] < arr[mid] and arr[mid] < arr[mid-1]:
            right = mid - 1
        elif arr[mid+1] < arr[mid] and arr[mid-1] > arr[mid]:
            return arr[mid-1]
        else:
            return arr[mid]
    return -1
def get_max(arr):
如果len(arr)==1:
返回arr[0]
如果[0,2]中的len(arr):
一无所获
左,右=0,透镜(arr)-1
而左arr[mid]和arr[mid]>arr[mid-1]:
左=中+1
#递减区
elif arr[mid+1]arr[mid]:
返回arr[mid-1]
其他:
返回arr[mid]
返回-1

请继续上面的示例,在上面的顺序中找到2。并在O(logn)Hmmm中导出一个解。。。这里的问题是找到O(logn)中的最大值。其余的都和你一样mentioned@AndyStowAway我认为这是很清楚的。编辑了我的答案。请注意顺序是单调的。因此,可能存在重复。因此,用你的逻辑寻找最大值是行不通的。