精华内容
下载资源
问答
  • 集合算法

    2011-07-10 01:16:56
    http://topic.csdn.net/u/20110610/13/d1924231-0a45-4826-ac2a-7bbcfcb9fc93.html
    展开全文
  • 6. 常用集合算法6.1 set_intersection6.2 set_union6.3 set_difference 6. 常用集合算法   学习目标: 掌握常用的集合算法。   算法简介: set_intersection    // 求两个容器的交集 set_union    // 求两...

    C++系列内容的学习目录\rightarrowC++学习系列内容汇总

    6. 常用集合算法

      学习目标: 掌握常用的集合算法。

      算法简介:

    • set_intersection    // 求两个容器的交集
    • set_union    // 求两个容器的并集
    • set_difference    // 求两个容器的差集

      例如,有容器v1和容器v2,其中v1中有元素0、1、2、3、4、5、6、7、8、9;v2中有元素5、6、7、8、9、10、11、12、13、14。v1和v2的交集、并集和差集如下图所示。

    在这里插入图片描述

    6.1 set_intersection

      功能描述: 求两个容器的交集。

      函数原型: set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
            // 求两个集合的交集
            // 注意:两个集合必须是有序序列
            // beg1 容器1开始迭代器
            // end1 容器1结束迭代器
            // beg2 容器2开始迭代器
            // end2 容器2结束迭代器
            // dest 目标容器开始迭代器

      实例如下所示。

    #include<iostream>
    using namespace std;
    #include<vector>;
    #include<algorithm>
    
    //常用集合算法:set_intersection
    
    void myPrint(int val)
    {
    	cout << val << " ";
    }
    
    void test01()
    {
    	vector<int>v1;
    	vector<int>v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);  //0~9
    		v2.push_back(i + 5);  //5~14
    	}
    	cout << "v1:";
    	for_each(v1.begin(), v1.end(), myPrint);
    	cout << endl;
    	cout << "v2:";
    	for_each(v2.begin(), v2.end(), myPrint);
    	cout << endl;
    
    	//目标容器(需要提前开辟空间,最特殊情况为大容器包含小容器,开辟空间取小容器的size即可)
    	vector<int>vTarget;
    
    	vTarget.resize(min(v1.size(),v2.size()));  //开辟空间(取小容器的size,可能会比交集的size大一些)
    
    	//获取交集
    	cout << "v1和v2的交集:";
    	vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    
    	for_each(vTarget.begin(), itEnd, myPrint);  //结束迭代器选择求交集得到的结束迭代器,而不是目标容器的结束迭代器,因为目标容器的size可能会比交集的size偏大一些
    	cout << endl;
    }
    
    int main()
    {
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    v1:0 1 2 3 4 5 6 7 8 9
    v2:5 6 7 8 9 10 11 12 13 14
    v1和v2的交集:5 6 7 8 9

      总结: 1. 求交集的两个集合必须是有序序列;
          2. 目标容器开辟空间需要从两个容器中取小值
          3. set_intersection返回值是交集中最后一个元素的位置。

    6.2 set_union

      功能描述: 求两个集合的并集。

      函数原型: set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
            // 求两个集合的并集
            // 注意:两个集合必须是有序序列
            // beg1 容器1开始迭代器
            // end1 容器1结束迭代器
            // beg2 容器2开始迭代器
            // end2 容器2结束迭代器
            // dest 目标容器开始迭代器

      实例如下所示。

    #include<iostream>
    using namespace std;
    #include<vector>;
    #include<algorithm>
    
    //常用集合算法:set_union
    void myPrint(int val)
    {
    	cout << val << " ";
    }
    
    void test01()
    {
    	vector<int>v1;
    	vector<int>v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);  //0~9
    		v2.push_back(i + 5);  //5~14
    	}
    	cout << "v1:";
    	for_each(v1.begin(), v1.end(), myPrint);
    	cout << endl;
    	cout << "v2:";
    	for_each(v2.begin(), v2.end(), myPrint);
    	cout << endl;
    
    	//目标容器(需要提前开辟空间, 最特殊情况为两个容器没有交集,开辟空间取两个容器的size之和)
    	vector<int>vTarget;
    
    	vTarget.resize(v1.size() + v2.size());  //开辟空间(取两个容器的size之和,可能会比并集的size大一些)
    
    	//获取并集
    	cout << "v1和v2的并集:";
    	vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    
    	for_each(vTarget.begin(), itEnd, myPrint);  //结束迭代器选择求并集得到的结束迭代器,而不是目标容器的结束迭代器,因为目标容器的size可能会比并集的size偏大一些
    	cout << endl;
    }
    
    int main()
    {
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    v1:0 1 2 3 4 5 6 7 8 9
    v2:5 6 7 8 9 10 11 12 13 14
    v1和v2的并集:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

      总结: 1. 求并集的两个集合必须是有序序列;
          2. 目标容器开辟空间需要将两个容器相加
          3. set_union返回值既是并集中最后一个元素的位置。

    6.3 set_difference

      功能描述: 求两个集合的差集。

      函数原型: set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
            // 求两个集合的差集
            // 注意:两个集合必须是有序序列
            // beg1 容器1开始迭代器
            // end1 容器1结束迭代器
            // beg2 容器2开始迭代器
            // end2 容器2结束迭代器
            // dest 目标容器开始迭代器

      实例如下所示。​

    #include<iostream>
    using namespace std;
    #include<vector>;
    #include<algorithm>
    
    //常用集合算法:set_difference
    void myPrint(int val)
    {
    	cout << val << " ";
    }
    
    void test01()
    {
    	vector<int>v1;
    	vector<int>v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);  //0~9
    		v2.push_back(i + 5);  //5~14
    	}
    	cout << "v1:";
    	for_each(v1.begin(), v1.end(), myPrint);
    	cout << endl;
    	cout << "v2:";
    	for_each(v2.begin(), v2.end(), myPrint);
    	cout << endl;
    
    	//目标容器(需要提前开辟空间, 最特殊情况为两个容器没有交集,开辟空间取大容器的size即可)
    	vector<int>vTarget;
    
    	vTarget.resize(max(v1.size(), v2.size()));  //开辟空间(取大容器的size,可能会比差集的size大一些)
    
    	//获取差集
    	cout << "v1和v2的差集:";
    	vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    
    	for_each(vTarget.begin(), itEnd, myPrint);  //结束迭代器选择求差集得到的结束迭代器,而不是目标容器的结束迭代器,因为目标容器的size可能会比差集的size偏大一些
    	cout << endl;
    
    	cout << "v2和v1的差集:";
    	itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
    	for_each(vTarget.begin(), itEnd, myPrint); 
    	cout << endl;
    }
    
    int main()
    {
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    v1:0 1 2 3 4 5 6 7 8 9
    v2:5 6 7 8 9 10 11 12 13 14
    v1和v2的差集:0 1 2 3 4
    v2和v1的差集:10 11 12 13 14

      总结: 1. 求差集的两个集合必须的有序序列;
          2. 目标容器开辟空间需要从两个容器取较大值
          3. set_difference返回值既是差集中最后一个元素的位置。

    展开全文
  • 常用集合算法 set_intersection set_union set_difference 常用集合算法 学习目标: 掌握常用的集合算法 算法简介: set_intersection // 求两个容器的交集 set_union // 求两个容器的并集 set_...

    这里有C++STL——全面总结详细教程(附案例解析)(持续更新中)


     

    目录

    常用集合算法

    set_intersection

    set_union

    set_difference


    常用集合算法

    学习目标:

    • 掌握常用的集合算法

    算法简介:

    • set_intersection // 求两个容器的交集
    • set_union // 求两个容器的并集
    • set_difference // 求两个容器的差集

    set_intersection

    功能描述:

    • 求两个容器的交集

    函数原型:

    • set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    • // 求两个集合的交集
    • // 注意:两个集合必须是有序序列
    • // beg1 容器1开始迭代器// end1 容器1结束迭代器// beg2 容器2开始迭代器// end2 容器2结束迭代器// dest 目标容器开始迭代器
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    class myPrint {
    public:
    	void operator()(int val) {
    		cout << val << " ";
    	}
    };
    
    void test01() {
    	vector<int>v1;
    	vector<int>v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    		v2.push_back(i + 5);
    	}
    	vector<int>vTarget;
    	vTarget.resize(min(v1.size(), v2.size()));
    	set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    	for_each(vTarget.begin(), vTarget.end(), myPrint());
    	cout << endl;
    }
    int main() {
    	test01();
    
    	system("pause");
    	return 0;
    }

    看结果有很多0.

    这是因为我们给他定义空间过大,而重复的元素并没有那么多。所以自动补零。

    我们可以返回目标元素最后一个元素的迭代器地址,进行for_each。

    更改如下:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    class myPrint {
    public:
    	void operator()(int val) {
    		cout << val << " ";
    	}
    };
    
    void test01() {
    	vector<int>v1;
    	vector<int>v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    		v2.push_back(i + 5);
    	}
    	vector<int>vTarget;
    	vTarget.resize(min(v1.size(), v2.size()));
    
    	vector<int>::iterator itEnd=
    	set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    
    	for_each(vTarget.begin(), itEnd, myPrint());
    	cout << endl;
    }
    int main() {
    	test01();
    
    	system("pause");
    	return 0;
    }

    这样我们输出的就只有重复的元素了。

    总结:

    • 求交集的两个集合必须的有序序列
    • 目标容器开辟空间需要从两个容器中取小值
    • set_intersection返回值既是交集中最后一个元素的位置

     

    那我们可以看到如果不返回目标容器的最后一个元素的迭代器地址。就会有补0的情况发生。

    后面就不再赘述。

     

    set_union

    功能描述:

    • 求两个集合的并集

    函数原型:

    • set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    • // 求两个集合的并集
    • // 注意:两个集合必须是有序序列
    • // beg1 容器1开始迭代器// end1 容器1结束迭代器// beg2 容器2开始迭代器// end2 容器2结束迭代器// dest 目标容器开始迭代器
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    class myPrint {
    public:
    	void operator()(int val) {
    		cout << val << " ";
    	}
    };
    
    void test01() {
    	vector<int>v1;
    	vector<int>v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    		v2.push_back(i + 5);
    	}
    	vector<int>vTarget;
    	vTarget.resize(v1.size() + v2.size());
    
    	vector<int>::iterator itEnd=
    	set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    
    	for_each(vTarget.begin(), itEnd, myPrint());
    	cout << endl;
    }
    int main() {
    	test01();
    
    	system("pause");
    	return 0;
    }

    总结:

    • 求并集的两个集合必须的有序序列
    • 目标容器开辟空间需要两个容器相加
    • set_union返回值既是并集中最后一个元素的位置

     

     

    set_difference

    功能描述:

    • 求两个集合的差集

    函数原型:

    • set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    • // 求两个集合的差集
    • // 注意:两个集合必须是有序序列
    • // beg1 容器1开始迭代器// end1 容器1结束迭代器// beg2 容器2开始迭代器// end2 容器2结束迭代器// dest 目标容器开始迭代器
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    class myPrint {
    public:
    	void operator()(int val) {
    		cout << val << " ";
    	}
    };
    
    void test01() {
    	vector<int>v1;
    	vector<int>v2;
    	for (int i = 0; i < 10; i++)
    	{
    		v1.push_back(i);
    		v2.push_back(i + 5);
    	}
    	vector<int>vTarget;
    	vTarget.resize(max(v1.size(), v2.size()));
    
    	vector<int>::iterator itEnd=
    	set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    
    	for_each(vTarget.begin(), itEnd, myPrint());
    	cout << endl;
    }
    int main() {
    	test01();
    
    	system("pause");
    	return 0;
    }

    总结:

    • 求差集的两个集合必须的有序序列
    • 目标容器开辟空间需要从两个容器取较大值
    • set_difference返回值既是差集中最后一个元素的位置

     

     

     

     

     

     

    展开全文
  • 集合算法求差集——set_difference

    千次阅读 2019-07-06 19:15:45
    集合算法求差集——set_difference 功能描述: 求两个集合的差集 函数原型: set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的差集 // 注意:两个...

    集合算法求差集——set_difference

    功能描述:

    • 求两个集合的差集

    函数原型:

    • set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

      // 求两个集合的差集

      // 注意:两个集合必须是有序序列

      // beg1 容器1开始迭代器
      // end1 容器1结束迭代器
      // beg2 容器2开始迭代器
      // end2 容器2结束迭代器
      // dest 目标容器开始迭代器

    测试代码

    #include <iostream>
    
    using namespace std;
    
    #include <vector>
    #include <algorithm>
    
    class myPrint
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
    
    void test01()
    {
    	vector<int> v1;
    	vector<int> v2;
    	for (int i = 0; i < 10; i++) {
    		v1.push_back(i);
    		v2.push_back(i+5);
    	}
    
    	vector<int> vTarget;
    	//取两个里面较大的值给目标容器开辟空间
    	vTarget.resize( max(v1.size() , v2.size()));
    
    	//返回目标容器的最后一个元素的迭代器地址
    	cout << "v1与v2的差集为: " << endl;
    	vector<int>::iterator itEnd = 
            set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    	for_each(vTarget.begin(), itEnd, myPrint());
    	cout << endl;
    
    
    	cout << "v2与v1的差集为: " << endl;
    	itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
    	for_each(vTarget.begin(), itEnd, myPrint());
    	cout << endl;
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    测试结果

    在这里插入图片描述
    总结

    • 求差集的两个集合必须的有序序列
    • 目标容器开辟空间需要从两个容器取较大值
    • set_difference返回值既是差集中最后一个元素的位置
    展开全文
  • 集合算法求交集——set_intersection

    千次阅读 2019-07-06 19:11:40
    集合算法求交集——set_intersection 功能描述: 求两个容器的交集 函数原型: set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的交集 // 注意:...
  • 集合算法就并集——set_union 功能描述: 求两个集合的并集 函数原型: set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的并集 // 注意:两个集合必须是...
  • Java集合算法大全

    2015-10-31 15:51:49
    集合框架定义了可以被应用到集合和映射的几种算法。 这些算法被定义为集合类中的静态方法。有几个方法可以抛出ClassCastException,当它试图比较不兼容的类型时,或者一个UnsupportedOperationException,当它试图...
  • 转载:三种实现集合求子集合算法

    千次阅读 2017-12-08 10:30:50
    以下内容转载自:ITeye narutolby 的日志 略有调整,不影响主体内容,仅供参考学习。题目:给定一个集合,求该集合的所有子集合,如集合{1,2}的子集合有... 算法思想:给定一个集合,求子集合过程可分为以下两个步骤:
  • from sklearn import ensemble
  • 面试中的集合算法

    千次阅读 2020-03-02 15:11:13
    1.使用Set 确保集合元素的唯一性 public void test(){ Set <Integer>set =new HashSet<>(); while(set.size()!=10) { int a =(int)(Math...
  • STL常用算数生成与常用集合算法

    千次阅读 2020-06-20 18:27:38
    常用算数生成算法 accumulate算法 计算容器元素累计总和 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param value累加值 accumulate(iterator beg, iterator end, value) fill算法 向容器中添加...
  • 有关集合算法的实现一些学习笔记

    千次阅读 多人点赞 2012-01-12 08:57:07
    前言:手机太烂不好意思在地铁上拿出来玩,于是看了会算法与数据结构,想看看以前在学校没好好学的一些东西,于是乎今天看了集合这一块,以前没好好学,工作后也没用到,最近有个想法想做个东西出来,貌似要用到集合...
  • Web应用中,对记录集的Tag运算中 找出同时符合多个tag条件的记录集合算法,SQL 语句解决方案。
  • 几个集合算法

    千次阅读 2010-10-07 21:55:00
    上有相应的详细算法,我这里只写出了适用于普通指针的算法,思路和书上的一样。1. 交集void set_intersection(int a[], size_t al, int b[], size_t bl) { size_t i = 0, j = 0; while (i b[j]) j++; ...
  • clf = RandomForestClassifier(min_samples_split=10) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print("训练集得分:", clf.score(X_train, y_train)) print("测试集得分:", clf.score(X_test, y_...
  • Java 集合框架 算法

    千次阅读 2018-03-14 10:32:13
    Java平台提供的绝大多数算法都是在列表实例上操作的,但是其中一些算法是在任意的集合实例上操作的。本节简要介绍以下算法: 排序 洗牌(打乱顺序) 常规数据操作 搜索 构成 找到极值 排序 排序算法重新排序一个...
  • 集合交集算法挑战

    2018-10-06 07:08:20
    给出两个集合 (如集合 A = {1, 2, 3} 和集合 B = {2, 3, 4}), 而数学术语 "对等差分" 的集合就是指由所有只在两个集合其中之一的元素组成的集合(A △ B = C = {1, 4}). 对于传入的额外集合 (如 D = {2...
  • Python实现贪心算法集合覆盖问题
  • 集合竞价算法

    千次阅读 2010-09-17 12:36:00
    <br /> 按照网上的一些股票交易说明:集合竞价关键是对两个列表,买单列表(价格从高到低,时间先后顺序)和卖单(价格从低到高,时间先后顺序)的撮合。关键是确定成交价。 成交价的规则是: (1)...
  • ACM超级经典算法集合

    千次下载 热门讨论 2013-08-19 19:35:36
    ACM超级经典算法集合。大家都知道acm大赛对计算机专业的大学生说是很有用的
  • 算法视频集合

    千次阅读 2017-11-16 14:26:52
    1.麻省理工学院公开课:算法导论(在线):http://edu.51cto.com/lesson/id-2236.html 语言是英文的,不过字幕已经被翻译为中文...这个主要是描述问题,然后如何用程序实现,没有巧妙的算法,但是解决问题的方法还可以。 3
  • 集合乱序算法shuffle

    千次阅读 2017-12-04 17:27:11
    引言 最近在看underscore.js的源码,看到shuffle函数,想起Java集合工具中也有这么个函数,就顺便仔细研究了一下,思路非常简单:一个迭代下标i从后往前移动,每次取0~i之间的一个随机下标rand,将其对应元素和i...
  • Java集合分组算法

    千次阅读 2013-07-10 14:41:45
    在实际开发中,可能会遇到这么一种情况:对集合进行分组,这里使用Collection集合。所谓分组,笔者是指对集合中有相同特征的元素进行归纳,用例中使用map表示,将相同特征做为Key,将具有此特征的元素作为一个List的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,885
精华内容 18,754
关键字:

集合算法