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

nary search on a sorted array using openmp

本文关键字:nary 搜索 数组 openmp 排序 使用      更新时间:2023-10-16

扩展二进制搜索逻辑以在排序向量上进行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;
        }
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向量,该向量初始化为大小为键数(ary-1)的1。如果键Ki比要搜索的元素大,则索引i处对应的1为0。因此,求和这个key_values向量可以得到要搜索的值所在的部分。