在从大数据中获取候选集的任务中原本使用set以及set的find操作进行去重,但是在大数据量的情况下发现find操作耗时非常严重;优化过程中也尝试了多种数据结构及方式,如:unordered_set,unordered_map,map,以及bitset。速度上都没有提升,最后不抱希望的尝试直接先将候选集全部放进vector中,再对其进行排序、去重,没想到效果比之前的都要好,下面贴出排序+去重三步曲:
- 首先将vector排序
- 然后使用unique算法,unique返回值是重复元素的开始位置
- 最后使用unique算法,删除后面的那段重复部分
#include <algorithm>
#include <iostream>
#include <vector>
int main(int argc, char* argv[]){
vector<_int64> vCandidateDoc;
......
//SortFunc函数可根据需求进行重载
sort(vCandidateDoc.begin(),vCandidateDocc.end(),SortFunc);
//unique将同样的元素排至vector末位,返回首个重复元素地址
vCandidateDoc.erase(unique(vCandidateDoc.begin(),vCandidateDoc.end(),UniqueFunc),vCandidateDoc.end());
}