2015-04-02 51 views
0

擴展二進制搜索邏輯,用於在排序的矢量的搜索進制,我試圖所述代碼與n-1個值below.Comparing並選擇相應的左和right.I已經做當矢量的大小小於n時的線性搜索。我如何使用並行化?排序後的數組上進制搜索使用OpenMP

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

這是我第一次太問題。 – 2015-04-02 14:29:34

+0

您之前是否使用OpenMP進行過一些簡單循環? – 2015-04-02 15:39:36

+0

是OMP的#pragma爲平行,但我不能使用這個直接在這裏我得到不正確的結果。 – 2015-04-02 16:43:36

回答

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; 

} 

這裏是我的解決方案,我所做的是採取初始化爲1鍵(元-1)。如果密鑰K 的大小數量key_values載體是磨碎機比元素被搜索,第i是由0。因此求和的索引在對應1這個key_values矢量給我在其中要搜索的值位於的部分。