【问题标题】:Find the unique elements of a vector C++查找向量 C++ 的唯一元素
【发布时间】:2019-09-25 18:29:15
【问题描述】:

有没有一种快速的方法可以在元素向量中找到所有单个元素(仅出现一次)?向量中的所有元素要么是单一的,要么是双重的(出现两次)。我的答案是对所有元素进行排序,然后删除重复出现的元素。有什么更快的方法吗?

【问题讨论】:

  • 是的,如果允许额外的空间。我们可以使用key as single elements and occurrence as value 构建地图,然后遍历地图以查找在您的情况下其值应为 1 的单个元素。
  • 所以你想要一个像集合而不是向量的东西?
  • 这些元素是什么类型的? int、string 还是用户定义的类型?
  • 您输入的预期大小是多少?你的向量持有什么数据类型?你有任何内存限制吗?答案取决于所有这些,尤其是第一个。
  • 输入数字的范围是多少?如果它很小,假设您想从数组中找到唯一数字,其中每个数字都在1 to 100 之间,那么您可以创建另一个数组并在索引位置分配标志,例如。 seen[ arr [i] ] = 1 然后从1 to 100 遍历seen 数组,然后打印所有元素if seen[ i ] is 1

标签: c++ algorithm c++11 c++14 c++17


【解决方案1】:

因此对于足够小的 n (std::sort() 和 std::unique)方法仍然比哈希表快。

示例代码:O(n log n)

vector<int>A = {1,2,3,1,2,5};
    sort(A.begin(),A.end());
    A.erase(unique(A.begin(),A.end()),A.end());
    for(int&x:A)
        cout<<x<<" ";

【讨论】:

  • 是这样吗?有一个转折点,在时间上使用哈希表比使用排序要好。根据定义,最佳性能取决于输入的大小(以及所使用的哈希和排序算法)。
  • @JoelCornett 是的,但实际上我们可能不会达到这一点,使用 1e7 元素执行此操作仍然比哈希表快,因为 1e8 元素哈希表已经需要太多内存来适应我的内存。
  • 使用布隆过滤器 ;)
  • 1e9 元素怎么样?如果元素尺寸很大怎么办?两者都没有足够的内存。为了使您的答案正确,您需要使用 for small enough n... 对其进行限定
  • 没错,虽然指出限制是好的,但请避免施加原始问题中未要求的约束或假设限制。
【解决方案2】:

如果您的元素是可散列的,您可以使用std::unordered_map&lt;T, int&gt; 来存储每个元素的计数,这将花费线性时间:

template<typename T>
std::vector<T> uniqueElements(const std::vector<T>& v) {
    std::unordered_map<T, int> counts;
    for(const auto& elem : v) ++counts[elem];
    std::vector<T> result;
    for(auto [elem, count] : counts)
        if(count == 1)
            result.push_back(elem);
    return result;
}

对于小型列表,排序然后进行线性传递可能仍然更快。 另请注意,这会复制您的元素,在某些情况下也可能很昂贵

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2017-07-20
    • 2014-05-21
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多