在主题二分搜索下的 InterviewBit 问题中,在 C++ 中的旋转排序数组中搜索超过了时间限制

Posted

技术标签:

【中文标题】在主题二分搜索下的 InterviewBit 问题中,在 C++ 中的旋转排序数组中搜索超过了时间限制【英文标题】:Time Limit Exceeded for search in rotated sorted array in C++ in InterviewBit problem under topic Binary Search 【发布时间】:2020-04-13 18:33:51 【问题描述】:

问题是在 C++ 中搜索已排序、旋转数组中的元素。 我使用的方法是找到枢轴元素索引/最小元素索引,然后从 a[pivot......end] 或 a[beg,....pivot] 使用二进制找到键搜索。

找到最小元素索引的时间复杂度是 O(log n),然后找到元素也是 O(log n),因此总体时间复杂度将是 O(log n)

但我收到超过时间限制错误 这是我的代码:

int find_pivot(std::vector<int> a, int beg, int end)

    while(beg<=end)
    
        int mid=(beg+end)/2;
        if(mid>0 && a[mid]<a[mid-1])
            return mid;
        else if(a[mid]>a[end])
            beg=mid+1;
        else
            end=mid;
    


int search_element(std::vector<int> a, int key, int beg, int end)

    int pivot = find_pivot(a,0,a.size()-1);
    if(key>=a[pivot] && key<=a[end])
        beg=pivot;
    else
        end=pivot;
    while(beg<=end)
    
        int mid=(beg+end)/2;
        if(key==a[mid])
            return mid;
        else if(key>a[mid])
            beg=mid+1;
        else
            end=mid-1;
    
    return -1;


int Solution::search(const vector<int> &A, int B) 
    int n = A.size();
   int i = search_element(A, B, 0, n-1); 

    if (i != -1) 
    return i;
    else
    return -1;

【问题讨论】:

if (i != -1) return i; else return -1;return i; 的更复杂的版本 注意!但我认为这不会影响时间复杂度。 SO 最近被这些在线测验问题所淹没。如果有的话,这个问题属于CodeReview。 没关系。它只是让阅读更轻松、更快捷。 但我超过了时间限制——这可能意味着你进入了一个无限循环。测试数据在哪里?如果您声称这是进行二进制搜索,那么不应该存在时间限制问题。即使有十亿个元素,你也必须探测不超过 31 次。因此我看到的唯一结论是你的代码有问题。 【参考方案1】:

检查您的 find_pivot 函数,假设数组通常按 [1,2,3,4,5] 排序。 现在,当您调用 find_pivot 函数时,将会出现 beg=0 和 end =1 的时间。

现在,由于 mid=(beg+end/2)=0,您的函数将更改 end=mid,这意味着 end 也变为 0。

现在你的 beg=0 和 end=0,现在当循环再次开始时 Mid = 0+0/2 并且这将继续重复。

进行一些更改,我认为问题在于数组何时正常排序或 end=begin。

【讨论】:

是的,当输入已排序但未旋转时,程序会陷入死循环。我没有添加输入时不旋转的条件(因为问题清楚地表明输入已排序和旋转)。

以上是关于在主题二分搜索下的 InterviewBit 问题中,在 C++ 中的旋转排序数组中搜索超过了时间限制的主要内容,如果未能解决你的问题,请参考以下文章

在HEXO主题中添加站内搜索

算法题解:二分查找算法(循环/递归)

markdown https://www.interviewbit.com/problems/prettyprint/

数据结构二分搜索树详解

LeetCode 题集:二分搜索

如何使用伪代码开发线性搜索和二分搜索算法。?