大规模二维整数向量集重复检测与去重技术咨询
高效的二维向量去重方案
嘿,针对你要处理18000+二维整数向量去重的需求,目前用逐一比对的O(n²)方法确实会在数据量上来后变得非常慢——毕竟18000个元素的话,要做超过3亿次比对,效率太低了。这里给你两个实用且高效的实现思路,帮你解决这个问题:
方案一:排序后去重(最易实现,稳定性高)
这个方法的核心是先把整个向量集合排序,让重复的向量相邻,然后只保留每个重复组的第一个元素。时间复杂度是O(n log n),对于18000个元素来说,计算量非常小,完全能快速完成。
而且C++里的vector<int>默认支持字典序比较,所以排序和去重的代码写起来特别简单:
#include <vector> #include <algorithm> using namespace std; vector<vector<int>> deduplicateVectors(vector<vector<int>> vecs) { if (vecs.empty()) return {}; // (可选)如果你的向量是无序的,比如{1,2}和{2,1}算重复,先对每个向量内部排序 for (auto& vec : vecs) { sort(vec.begin(), vec.end()); } // 对整个集合排序,让重复向量相邻 sort(vecs.begin(), vec.end()); // 移除连续的重复元素 auto lastUnique = unique(vecs.begin(), vecs.end()); vecs.erase(lastUnique, vecs.end()); return vecs; }
这个方案的优势是:
- 实现简单,不需要自定义哈希或比较逻辑
- 没有哈希冲突的风险,结果稳定
- 对于18000的量级,运行时间几乎可以忽略
方案二:哈希集合去重(平均O(n)时间,性能更优)
如果想追求极致的性能,可以用哈希集合来记录已经出现过的向量。平均情况下时间复杂度是O(n),但需要为vector<int>自定义哈希函数(因为C++标准库没有默认的哈希实现)。
固定长度二维向量(比如每个向量只有两个int)
如果你的向量都是固定长度2的,可以直接用pair<int, int>作为哈希键,因为标准库对pair有默认的哈希支持(C++11及以后):
#include <unordered_set> #include <vector> #include <utility> using namespace std; vector<vector<int>> deduplicateVectors(const vector<vector<int>>& vecs) { unordered_set<pair<int, int>> seen; vector<vector<int>> result; for (const auto& vec : vecs) { // 假设每个向量长度为2 auto key = make_pair(vec[0], vec[1]); if (seen.find(key) == seen.end()) { seen.insert(key); result.push_back(vec); } } return result; }
可变长度向量
如果向量长度不固定,需要自定义哈希函数和相等判断:
#include <unordered_set> #include <vector> using namespace std; // 自定义向量哈希函数 struct VectorHash { size_t operator()(const vector<int>& v) const { size_t hash = 0; for (int num : v) { // 组合哈希值,避免碰撞 hash ^= hash << 13; hash ^= hash >> 17; hash ^= hash << 5; hash ^= num; } return hash; } }; // 自定义向量相等判断(直接用vector的==运算符即可) struct VectorEqual { bool operator()(const vector<int>& a, const vector<int>& b) const { return a == b; } }; vector<vector<int>> deduplicateVectors(const vector<vector<int>>& vecs) { unordered_set<vector<int>, VectorHash, VectorEqual> seen; vector<vector<int>> result; for (const auto& vec : vecs) { // (可选)如果向量无序,先排序再插入哈希集合 vector<int> sortedVec = vec; sort(sortedVec.begin(), sortedVec.end()); if (seen.find(sortedVec) == seen.end()) { seen.insert(sortedVec); result.push_back(vec); } } return result; }
方案选择建议
- 如果只是解决当前问题,优先选排序去重方案,代码简单易维护,没有额外的复杂度
- 如果数据量持续增长(比如到百万级),或者对性能有极致要求,再考虑哈希集合方案
内容的提问来源于stack exchange,提问作者leena.ahmed
相关产品推荐
相关产品推荐

