【问题标题】:What is the time complexity of this code Union Of two Arrays using set_union?这段代码使用 set_union 合并两个数组的时间复杂度是多少?
【发布时间】:2020-11-20 09:14:19
【问题描述】:
#include<iostream>
#include<bits/stdc++.h>

using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, m;
        cin >> n >> m;
        vector<int> v1(n);
        vector<int> v2(m);
        for (int i = 0; i < n; i++) {
            cin >> v1[i];
        }
        for (int i = 0; i < m; i++) {
            cin >> v2[i];
        }
        set<int> s1(v1.begin(),v1.end());
        set<int> s2(v2.begin(), v2.end());
        set<int> s3;
        set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s3, s3.begin()));
        for (auto i : s3) cout << i;
    }
}

这段代码需要两个向量并将它们联合起来? 例如:如果输入是 5,4,3,2,1 和 5,4,6 输出将是 1,2,3,4,5,6

我对它的时间复杂度感到困惑?从向量创建集合的时间复杂度是多少?使用 set_union 函数的时间复杂度是多少?

【问题讨论】:

  • set_union 假定已排序数组 - 在您的示例中无法保证。在这个假设下,它的线性复杂度为 O(N+M),其中 N 和 M 是数组的大小。
  • @StPiere 实际上保证这些是排序数组,因为这是一个无序集合,所以它在插入时会自动排序(我不知道如何,如果你也能解释一下)。好的,所以这条线的时间复杂度 set s1(v1.begin(),v1.end());是线性的??因为我在集合中读取的插入需要 O(logn),因为它是在 RB 树的帮助下实现的。
  • 啊抱歉 - 监督您正在使用 set。但只是一个概念:如果您先对向量进行排序,您也可以使用向量而不是集合
  • @StPiere 你能看一下编辑后的评论吗!!但是如果我使用向量然后排序,时间复杂度将是 O(nlogn)
  • 从向量构造集合也具有 Nlog(N) 复杂度(如果向量尚未排序 - 否则设置构造线性复杂度)。无论哪种方式,最终都会得到 Nlog(N) 的总复杂度来排序(直接或通过插入集合),然后是联合的线性复杂度。

标签: c++ vector data-structures set


【解决方案1】:

在您的代码中,您使用的是std::set。不幸的是,在 C++ 标准库中,std::set有序的(我们有 std::unordered_set)。因此,代码中的大部分“艰苦工作”实际上是将向量转换为有序集合;这需要 O(n log(n) + m log(m)) 时间。正如@StPiere 建议的那样,联合几乎可以肯定是线性的,因此需要额外的 O(n+m) 时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-26
    • 2015-03-31
    • 2022-11-14
    • 2022-01-13
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多