【问题标题】:comparing vectors in a large data set比较大型数据集中的向量
【发布时间】:2018-10-10 10:04:51
【问题描述】:

我有一个整数类型的二维向量,其中包含大量向量(即18000 及以上),并且该池中有大量重复向量。我想要做的是检测相似的向量并删除其中一个。 我目前正在做的是使用以下函数将每个向量与整个池进行比较:`

bool compareVectors(vector<int> a, vector<int> b)
{
    if (a.size() != b.size())
    {
        return false;
    }
    sort(a.begin(), a.end());
    sort(b.begin(), b.end());
    return (a == b);
}

但这并不能有效地完成这个过程,大概是由于我正在进行大量比较。有没有可能有效的方法来做到这一点?

【问题讨论】:

  • 当大小不同时,你会做一个无用的复制。
  • 你不能先对每个向量排序一次吗?然后对向量的向量进行排序并在其上运行std::unique
  • 您可以在主体中进行尺寸检查。如果它们相等,您确实需要复制到该函数。
  • 你真的不关心元素的顺序来确定两个向量“相等”吗?
  • 另外,如果性能是问题,按值传递向量可能是不可取的。通过引用传递它们并制作本地排序副本会更有效,因为如果大小不同,您首先会避免所有复制。

标签: c++ vector comparison large-data


【解决方案1】:

准备工作:

  1. 首先根据大小将向量分类到存储桶中。
  2. 只有一个向量的桶意味着该向量是唯一的,可以输出和删除。
  3. 对剩余桶中的所有剩余向量进行排序

从 i = 0 开始

递归算法:

对于每个桶:

  1. 根据 v.(i) 将向量分类到桶中
  2. 只有一个向量的桶意味着该向量是唯一的,输出和删除
  3. 使用 i=i+1 递归到每个存储桶

【讨论】:

    【解决方案2】:

    从您的(子)向量的规范化(此处为排序)版本中构建 setunordered_set。然后您可以在 O(mn log m log n) 时间内找到所有重复项,其中 mn 分别是数据的外部和内部维度。

    您可能需要一个映射来代替,例如,存储每个等价类的第一个代表的索引。您可以使用reserveunordered_set 运行时间中删除日志m

    【讨论】:

      猜你喜欢
      • 2020-02-22
      • 1970-01-01
      • 2014-05-28
      • 2013-10-16
      • 1970-01-01
      • 2020-09-28
      • 2013-09-18
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多