在 O(lg n) 领带复杂度的排序数组中查找多数元素

Find Majority element in a sorted array in O(lg n) tie complexity

本文关键字:数组 排序 查找 元素 复杂度 lg      更新时间:2023-10-16

我正在处理这个问题,在查看一些帖子时,我得到了一个使用摩尔投票算法的时间复杂度为 O(n( 的解决方案。多数元素是出现大于数组大小除以 2 的元素。对于 o(lg n( 时间,以下是我的代码,请建议它是否在 o(lg n( 中。我欢迎建议,因为我对编程很陌生。

#include <bits/stdc++.h>
#include <algorithm>
using namespace std ;
int binarySearch(vector <int> a, int l, int h){
        if(l - h < a.size() / 2)
            return -1;
        int mid = (l+h)/2;
        int temporaryLow = mid;
        int temporaryHigh = mid;
        while(temporaryLow > 0 && a[temporaryLow] == a[mid])
            temporaryLow--;
        while(temporaryHigh < a.size() && a[temporaryHigh] == a[mid])
            temporaryHigh++;
        if((temporaryHigh -1) - (temporaryLow+1) +1 >= a.size()/2){
            return a[mid];
        }else{
            return max(binarySearch(a,0,temporaryLow),binarySearch(a,temporaryHigh,h));
        }
    }
 int findMajority(vector <int> numbers){
        return binarySearch(numbers , 0, numbers.size());
    }

    int main()
    {
        int n ;     
        vector <int> a ;
    while ((cin >> n) && n != 9999)
    a.push_back(n);
        int majority = findMajority(a);
        cout << majority ;
    }

不,它不是 O(log n(。二叉搜索的想法是每次将搜索空间减少一半,而您的代码没有这样做。

如果数组是有序的,则多数值可以是中间值。若要验证这一点,请将 mid 作为中间值。

查找中间检查的lower_bound和upper_bound,如果差异大于数组大小的一半。

法典:

#include <vector>
#include <algorithm>
int majorityElement(const std::vector<int> &array) {
    auto size = array.size();
    if (!size)
        throw std::runtime_error("no majority element");
    auto mid = array[size/2];
    // These run in O(lg N) because array is sorted
    auto low_index = std::lower_bound(array.cbegin(), array.cend(), mid);
    auto upp_index = std::upper_bound(array.cbegin(), array.cend(), mid);
    if ((upp_index - low_index) > size/2) 
        return mid;
    throw std::runtime_error("no majority element");
}