示例#1
0
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;
}
示例#2
0
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;
}