// // Created by joe on 4/12/15. // #include "rankaccu.h" using namespace std; const double offset = 1; void ranksort(int l,int r,vector &rank,const vector &ref1,const vector &ref2) { int i=l,j=r,k; double mid1=ref1[rank[(l+r)>>1]],mid2=ref2[rank[(l+r)>>1]]; while (i<=j) { while (ref1[rank[i]]>mid1 || (ref1[rank[i]]==mid1 && ref2[rank[i]]>mid2)) ++i; while (ref1[rank[j]]l) ranksort(l,j,rank,ref1,ref2); if (i &C,vector &rank,const vector &ref1,const vector &ref2) { if (l==r) return; int i=l,j=((l+r)>>1)+1; rankmerge(i,j-1,C,rank,ref1,ref2); rankmerge(j,r,C,rank,ref1,ref2); vector stage_r((unsigned long)r-l+1),stage_c((unsigned long)r-l+1); int cnt=0; int k=0; while (i<=((l+r)>>1) && j<=r) { if (ref1[rank[i]]>ref1[rank[j]] || (ref1[rank[i]]==ref1[rank[j]] && ref2[rank[i]]>ref2[rank[j]])) { stage_c[k] = C[i]; stage_r[k++] = rank[i++]; ++cnt; } else{ stage_c[k] = C[j]+cnt; stage_r[k++] = rank[j++]; } } while (i<=((l+r)>>1)) { stage_c[k] = C[i]; stage_r[k++] = rank[i++]; } while (j<=r) { stage_c[k] = C[j]+cnt; stage_r[k++] = rank[j++]; } for (i=l;i<=r;++i) { C[i]=stage_c[i-l]; rank[i]=stage_r[i-l]; } } void rank_accu(RidList &D,const vector pred) { unsigned long n = D.getSize(); vector orig_rank(n),pred_rank(n),C(n); vector orig(n); int i,j; for (i=0;i pred,CMC & cmc) { unsigned long n = D.getSize(); vector pred_rank(n); vector orig(n); int i,j; for (i=0;i0) { LOG(INFO)<<"qid:"<