当前位置: 首页 > news >正文

上海学做网站嘉兴做网站seo

上海学做网站,嘉兴做网站seo,企业网站的推广形式有哪些,专业网站开发公司地址并查集原理 在一些应用问题中#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时#xff0c;每个元素自成一个 单元素集合#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询一 个元素归属于那个集合的运算。适合于描述这类…并查集原理    在一些应用问题中需要将n个不同的元素划分成一些不相交的集合。开始时每个元素自成一个 单元素集合然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询一 个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。 一般可以用数组来表示并查集数据的下标就是每个数据的编号对应的值如果是负数那么就代表它自成一个集合也就是一个根结点。如图初始值一般都是负数也就是每个元素都自成一个集合如果一个元素是根那么负数的绝对值则代表这个树有多少结点如果不是负数那么则说明这个元素不是根且对应的值存的是父亲结点的下标。 实际应用中也可以通过加入哈希表来设置更多的映射关系这样的话可以将数组的下标作为key值然后可以存人名这些。 所以并查集其实也是多棵树组成的森林。 用并查集表示就是 元素之间可以合并并且可以制定合并规则。集合与集合之间也可以合并。 综上我们可以知道并查集可以解决以下问题 1.查找某个元素属于哪个集合。沿着数组表示的树形关系向上可以一直找到根。 2.查看两个元素是否属于同一个集合。可以看找到的根是否相同以此来判断是否属于同一个集合。 3.可以将两个集合归并成一个集合。 4.求集合的个数。其实也就是根的个数可以遍历数组记录下标为负数的元素即是集合的个数。 并查集简单实现 #pragma once#include vector//可以设计成模板加入哈希表来存放更多的映射关系class UnionFindSet { public:UnionFindSet(int size):_set(size, -1){}~UnionFindSet(){}size_t FindRoot(int x){int root x;while (_set[root] 0)root _set[root]; // 向上找到根while (_set[x] 0) // 向上遍历依次修改父亲的父亲结点使其变为根结点的儿子。// 路径压缩{int parent _set[x];_set[x] root;x parent;}return root;}void Union(int x1, int x2){int root1 FindRoot(x1);int root2 FindRoot(x2);if (abs(_set[root1]) abs(_set[root2])) // 小优化每次合并都合并到结点更多的树中可以减少层数std::swap(_set[root1], _set[root2]);if (root1 ! root2) // 如果相等说明在一个集合内没必要合并{_set[root1] _set[root2];_set[root2] root1; // 这里默认合并到root1}}int SetCount() // 找根结点个数{size_t count 0;for (size_t i 0; i _set.size(); i){if (_set[i] 0)count;}return count;} private:std::vectorint _set; };void TestUFS() {UnionFindSet u(10);u.Union(0, 6);u.Union(7, 6);u.Union(7, 8);u.Union(1, 4);u.Union(4, 9);u.Union(2, 3);u.Union(2, 5);std::cout u.SetCount() std::endl; }另外说下压缩路径的问题当并查集的数据非常大时我们要找到这个元素的根可能就需要向上找很久有一种解决方案就是在每次查找的时候如果它的父亲结点不是根结点的话就将它放到根结点的儿子结点。这样就能减少遍历的次数。 并查集虽然是一种数据结构但是有时候又可以是一种解决问题的思路。 比如这道题可以直接手搓一个简单的并查集很容易就秒掉。 class Solution { public:int findCircleNum(vectorvectorint isConnected) {int n isConnected.size();vectorint set(n,-1);auto findRoot [set](int x){while(set[x] 0)x set[x];return x;};for(int i 0; i n; i){for(int j 0; j n; j){if(isConnected[i][j] 1){int root1 findRoot(i);int root2 findRoot(j);if(root1 ! root2){set[root1] set[root2];set[root2] root1;}}}}int count 0;for(auto x : set){if(x 0)count;}return count;} }; 总结并查集的特点 1.一个位置的值是负数那么它就是树的根这个负数的绝对值就是这个树结点的个数。 2.一个位置的值是正数那么这个正数就是它父亲结点的下标。
http://www.zqtcl.cn/news/260296/

相关文章:

  • 长春做网站推广的公司公司要做个网站吗
  • 天水 网站建设招聘个人网站建设的国外文献综述
  • 什么网站做推广最好建行网站用户名是什么
  • 网站建设和维护需要学的东西服务器学生
  • 电子工厂网站建设企业管理咨询报告
  • 敖汉旗网站建设网站建设班级通讯录
  • 把手机做网站服务器做网站商丘
  • 婚恋咨询网站运营做速卖通代码的网站
  • 网站建设流程有哪七步c语言做的网站有什么优缺点
  • 树在线网页制作网站邢台中北世纪城网站兼职
  • 备案网站建设方案模板怎么看网站域名
  • asp iis设置网站路径效果好网站建设哪家好
  • 河南做外贸网站的公司大连在哪个省的什么位置
  • 网站架构怎么做wordpress e-commerce themes
  • 哪些网站微信支付平台经营管理系统
  • 教育教学成果展示网站建设桂林网站开发公司
  • 唐山房产网站建设asp.net 网站压缩
  • 卫浴网站设计大型网站建设的必须条件
  • 肇庆制作企业网站seo网站建设课程
  • 没有公司自己做网站wordpress lms插件
  • 申请一个网站需要怎么做北京网络公司信息
  • 珠海市建设局网站分销系统价格多少
  • 杭州建网站企业seo营销工具
  • php旅游类网站开发wordpress 文章内
  • 企业管理外贸企业网站优化
  • 免费图纸网东莞百度快照优化排名
  • 南宁网站建设培训学校青海网站建设加q5299丶14602做词
  • 鱼台做网站多少钱wordpress pot
  • 招聘网站建设维护人员怎样自己开发一款软件
  • 上海网站制作怎么选泰安网红人物