bool CSearchKeyRanking::RemoveGoodsByForceAndFB(const string& query, vector<SResult>& vRes,vector<SResult>& force_vect) { force_vect.clear(); int pid = 0; int docId_max = 0; int pid_flag = 0; vector<long long> pid_vect; vector<int> docId_vect; if(vRes.empty()|| query.empty()) { return false; } //判断是否有反馈 HASHVECTOR hvect = m_key2Pid[query]; cout<<"size is "<<hvect.count<<endl; if(hvect.count>0) { //取得反馈pid pid_vect.reserve(hvect.count); for(int j=0;j<hvect.count;j++) { memcpy(&pid,hvect.data+j*hvect.size,sizeof(int)); pid_vect.push_back((long long)pid); } //将pid转化为docId pid_flag = GetFieldId("product_id"); m_funcGetDocsByPkPtr(m_pSearcher,pid_flag,pid_vect,docId_vect); docId_max = GetMaxValFromVect(vRes); //装入BITMAP CBitMap bitMap(docId_max+1); for(size_t i=0; i<docId_vect.size(); i++) { if(docId_vect[i]<0 || docId_vect[i]>docId_max) continue; bitMap.SetBit(docId_vect[i]); } //调整force_vect的大小 force_vect.reserve(pid_vect.size()); //遍历vect,修改其强制pid对应的权重,另其最大 for(size_t j=0; j<vRes.size(); j++) { if(vRes[j].nDocId>docId_max || vRes[j].nDocId<0) continue; if(bitMap.TestBit(vRes[j].nDocId)) { //删除,打散后再强制置顶 force_vect.push_back(vRes[j]); SwapVectElem(vRes[j],vRes[vRes.size()-1]); vRes.pop_back(); } if(force_vect.size() >= pid_vect.size()) break; } docId_vect.clear(); pid_vect.clear(); } return true; }
int main(){ freopen("in.txt","r",stdin); int len_int2bit=sizeof(int)*8; int totalNum = 20000;//测试数据集 int blockSize= 2000; int blockNum=totalNum/blockSize; std::vector<int> block(blockNum,0); int bit_len=blockSize/len_int2bit+1;//位图的大小 std::vector<int> bitMap(bit_len,0); int val; while(cin>>val) ++block[val/blockSize]; fclose(stdin); int start=-1; //找出那一块少数据: for(int i=0;i<blockNum;i++){ if(block[i]<blockSize){ start=i*blockSize; break; } } freopen("in.txt","r",stdin); cin.clear(); while(cin>>val){ if(val>=start && val<start+blockSize){ val-=start; bitMap[val/len_int2bit] |= 1<<val%len_int2bit; } } fclose(stdin); for(int i=0;i<bit_len;i++){ for (int j = 0; j < len_int2bit; ++j) { if((bitMap[i] & (1<<j))==0){ cout<<i*len_int2bit+j+start; } } } return 0; }