使用openmp对已排序的数组进行nary搜索

时间:2015-04-02 14:28:20

标签: c++ openmp

在分类矢量上扩展二元搜索逻辑以进行n元搜索,我尝试了下面的代码。与n-1值进行比较并选择合适的左右。当矢量的大小较小时,我进行了线性搜索比n。我如何使用并行化?

int nary_search(vector<int> a,int key,int ary){
int l=0,r=a.size()-1;
while((r-l)>ary-1){
    //cout<<"left is "<<l<<" right is "<<r<<endl;
    int step=(r-l+1)/ary;
    int var=l+step;
    for(;var<=r;var+=step){
        if(key<=a[var])
        {
            r=var;
            l=var-step;
            break;
        }
        else{
            l=var;
        }
    }

}
//cout<<"left is "<<l<<"right is "<<r<<endl;
for(int i=l;i<=r;i++){
    if(a[i]==key)
        return i;
}
return -1;
}

此外,break语句对openmp不起作用,所以我尝试将其更改为。

if(l<=key && key<=a[var])
        {
            r=var;
            l=var-step;

        }
        else{
            l=var+1;
        }

1 个答案:

答案 0 :(得分:0)

int nary_search(vector<int> a,int key,int ary){
int l=0,r=a.size()-1;
while((r-l+1)>ary){
    int step=(r-l+1)/ary;
    vector<int>key_values(ary-1,1);
    int var;
    #pragma omp parallel for private(var) shared(l)
    for(int cnt=0;cnt<ary-1;cnt++){

        var=l+step*(cnt+1);
        //cout<<var<<" "<<cnt<<" ";
        if(key<=a[var])
        {
            key_values[cnt]=0;
        }   

    }
    int sum=0;
    #pragma parallel for reduction (+:sum)
    for(int j=0;j<key_values.size();j++)
    {
        sum+=key_values[j];         
    }
    if(sum!=ary-1){
        r=l+step*(sum+1);
        l=r-step;
    }
    else {
        l=l+(step*sum);
    }


    //cout<<"left is "<<l<<" right is "<<r<<endl;
}
for(int i=l;i<=r;i++){
    //cout<<"in ehre";
    if(a[i]==key)
        return i;
}
return -1;

}

这是我的解决方案,我所做的是将key_values向量初始化为1个大小的密钥数(ary-1)。如果密钥K i 比要搜索的元素更大,索引i的对应1为0.因此,对这个key_values向量求和,给出了要搜索的值所在的部分。