在分类矢量上扩展二元搜索逻辑以进行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;
}
答案 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向量求和,给出了要搜索的值所在的部分。