【发布时间】: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