使用openmp对排序数组进行nary搜索
nary search on a sorted array using 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;
}
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向量可以得到要搜索的值所在的部分。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 在C++中搜索嵌套多映射值
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 向量上的线性搜索
- 如何在动态数组上使用搜索函数
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- cmake:添加要搜索头文件的目录
- 使用C++创建特殊的二叉搜索树
- 在C++的字符串中搜索和删除某些字符
- std::unordered_map 搜索算法是如何实现的?
- 使用不变量来确定二分搜索中的边界条件
- 二叉搜索如何比线性搜索更快?
- 按边长度递归搜索图中所有可行路径
- QStackWidget - 按名称搜索
- 在递归二叉搜索树中搜索
- 使用openmp对排序数组进行nary搜索