C++ 使用set_Union对两个数组进行代码并集的时间复杂度是多少? #包括 #包括 使用名称空间std; int main(){ int t; cin>>t; 而(t--){ int n,m; cin>>n>>m; 向量v1(n); 矢量v2(m); 对于(

C++ 使用set_Union对两个数组进行代码并集的时间复杂度是多少? #包括 #包括 使用名称空间std; int main(){ int t; cin>>t; 而(t--){ int n,m; cin>>n>>m; 向量v1(n); 矢量v2(m); 对于(,c++,vector,data-structures,set,C++,Vector,Data Structures,Set,使用set_Union对两个数组进行代码并集的时间复杂度是多少? #包括 #包括 使用名称空间std; int main(){ int t; cin>>t; 而(t--){ int n,m; cin>>n>>m; 向量v1(n); 矢量v2(m); 对于(int i=0;i>v1[i]; } for(int i=0;i>v2[i]; } 设置s1(v1.begin(),v1.end()); 设置s2(v2.begin(),v2.end()); 设s3; set_union(s1.begin()、

使用set_Union对两个数组进行代码并集的时间复杂度是多少?
#包括
#包括
使用名称空间std;
int main(){
int t;
cin>>t;
而(t--){
int n,m;
cin>>n>>m;
向量v1(n);
矢量v2(m);
对于(int i=0;i>v1[i];
}
for(int i=0;i>v2[i];
}
设置s1(v1.begin(),v1.end());
设置s2(v2.begin(),v2.end());
设s3;
set_union(s1.begin()、s1.end()、s2.begin()、s2.end()、inserter(s3、s3.begin());

对于(AutoI:S3)CUT

在您的代码中,您使用的是<>代码:STD::SET/COM>。在C++标准库中,不幸的是,<代码> STD::SET/COD> >是有序的(并且我们有<代码> STD::unOrdEdEdSuff)。因此,代码中的大部分“硬功”实际上是将向量转换成有序集合;时间。正如@StPiere所建议的,并集几乎肯定是线性的,因此额外的O(n+m)时间。

set\u并集假设排序数组,这在您的示例中是不保证的。在这种假设下,它的线性复杂度为O(n+m)其中N和M是数组的大小。@StPiere实际上可以保证这些数组是已排序的数组,因为这是一个无序集,所以插入时它会自动排序(我不知道如何排序,如果你也能解释的话)。好的,那么这行集的时间复杂度s1(v1.begin(),v1.end());是线性的??因为我读到的集合中的插入是O(logn),因为它是在RB树的帮助下实现的。啊,对不起-监督你正在使用集合。但只是一个概念:如果你对向量排序,你也可以使用向量而不是集合 first@StPiere你能看一下编辑后的评论吗!!但是如果我使用vector然后排序,时间复杂度将是O(Nlog)从vector构造集合也有Nlog(N)复杂度(如果向量还没有排序,否则集合构造线性复杂度)。这样你就得到了总的Nlog(N)复杂度来排序(直接或通过插入集合)然后是并集的线性复杂度。
#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;
    }
}