You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大规模二维整数向量集重复检测与去重技术咨询

高效的二维向量去重方案

嘿,针对你要处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:48:22