【问题标题】:Divide and conquer solution for finding the majority element in the given input [closed]在给定输入中找到多数元素的分而治之的解决方案[关闭]
【发布时间】:2021-01-09 06:27:20
【问题描述】:

我正在使用分而治之的策略来解决多数问题。 如果重复超过 n/2 次,则表示占多数的元素,其中 n 是输入中给定的元素数。 如果存在多数元素,则返回 1,否则返回 0。

这是我正在使用的算法:- -> 我们将继续将数组分成两半,直到我们达到一个大小为 2 的数组,我们将比较每个数组的两个元素。 -> 如果它们相同,则它们是该数组的多数元素,我们将返回它们的值。 -> 如果它们不相同,我们将返回一个特殊字符来表示没有多数元素。 -> 递归地向上移动数组,我们将检查从两个子数组/一半中获得的值。与上面的基本情况一样,如果元素相同,则返回它们,否则返回特殊字符(特殊字符在下面的代码中为-1)。

//Function to count the number of occurences of an element in the input in linear time
    ll simple_count(vector<ll>&v,ll p){
        ll count = 0;
        for(ll i=0;i<v.size();i++){
            if(v[i]==p)
                count++;
        }
        return count;
    }
    //Function to find the majority element using the above algorithm
    ll majorityElement(vector<ll>&v,ll left, ll right){
        if(left==right)
            return v[left];
        if(left+1==right){
            if(v[left]==v[right])
                return v[left];
            return -1;
        }
        ll mid = left+(right-left)/2;
        ll p = majorityElement(v,left,mid);
        ll q = majorityElement(v,mid+1,right);
        if(p!=-1&&q==-1)
            {
                if(simple_count(v,p)>((ll)v.size()/2))
                    return p;
                return -1;
            }
        else if(p==-1&&q!=-1)
            {
                if(simple_count(v,q)>((ll)v.size()/2))
                {
                    return q;
                }
                return -1;
            }
        else if(p!=-1&&q!=-1){
            ll p_count = simple_count(v,p);
            ll q_count = simple_count(v,q);
            if(p_count>q_count&&p_count>v.size()/2)
                return p;
            else if(q_count>p_count&&q_count>v.size()/2)
                return q;
            return -1;
        }
        else if(p==q&&p!=-1)
            {
            if(simple_count(v,p)>(ll)v.size()/2)
                return p;
            return -1;
            }
        else if(p==q)
            return -1;
    }
    int main(){
        ll n;
        cin>>n;
        vector<ll>v(n);
        for(ll i=0;i<n;i++)
            cin>>v[i];
        ll k = majorityElement(v,0,v.size()-1);
        if(k==-1)
            cout<<0;
        else
            cout<<1;
        return 0;
    }

我面临的问题是这段代码给了我一些输入的 Time Limit Exceeded(TLE) 错误(Coursera 分级机不共享我们收到错误的输入)我相信我的代码的时间复杂度是 O(nlogn)。请帮我优化代码,这样这个程序就不会给我TLE了。

输入格式:第一行包含一个整数 n,后跟 n 个非负整数 (a1,a2....an) 。 1

【问题讨论】:

  • 输入格式是什么?数组是默认排序的吗?
  • "... Time Limit Exceeded(TLE) 错误..." 我从未听说过标准 c++ 中出现此类错误。
  • @PapaifromBEKOAIL 第一行包含一个整数 n,后跟 n 个非负整数 (a1,a2....an) 。 1
  • 这不是O(n log n)算法吗(修复bug后)?

标签: c++ recursion divide-and-conquer


【解决方案1】:

没有分裂。 v 始终是完整的数组。 simple_count 不使用任何除数索引来减少搜索位置。

因此,您在每次调用 majorityElement 时都会进行完整的线性计数。

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 2020-01-07
    • 1970-01-01
    • 2020-05-31
    • 2015-10-24
    • 2019-09-27
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多