基于并查集的六度分隔理论的验证与实现
1.六度分隔理论
世界上任何两个互不相识的人,最多只需要通过6个中间人,就可以建立联系。
哈佛大学的社会心理学家米尔格兰姆于1967设计了一个连锁信件实验。他将一套连锁信件随机发送给居住在内布拉斯加州奥马哈的160个人,信中放了一个波士顿股票经纪人的名字,并要求每名收信人把这封信寄给自己认为是比较接近这名股票经纪人的朋友。这位朋友收到信后,再把信寄给他认为更接近这名股票经纪人的朋友。最终,大部分信件都寄到了这名股票经纪人手中,每封信平均经手6次到达。
例如你认识老王,老王认识李大爷,李大爷又认识某人,如此关联,你和奥巴马之间,最多只差6个人介绍就可以加微信好友啦。
2.引发思考
如果我现在知道了所有人的通讯录好友,我想知道我到底能不能认识老奥,怎么验证呢?
全球有77亿人口,每个人的好友圈也有几百上千,这样的数据量是很大的,简单的一个一个的查找是行不通的。
那么问题来了,人口普查哪家强,四川成都找老王。。。
所有的信息数据如下表:
转换成图的形式会比较直观。如果把2个互相认识的人用线连接起来,问题就转化成:你和老奥之间能否找到一条通路(暂不考虑最短是不是不超过6个人)。
3.问题建模
假设朋友的朋友都是朋友,朋友的敌人也是朋友(或者敌人的朋友还是朋友,whatever...)。
我们把所有直接认识的,或者能间接认识的都放到一个大集合中,建立一个大朋友圈。
问题就变成:老奥在不在我们的大朋友圈里?
如果你的大朋友圈里面有人认识川普,那就要把川普的朋友圈里面的所有人都加进来,形成一个新的朋友圈。
相信敏锐的你已经发现问题的本质,这里面只有2个重要的操作,来跟我一起大声朗读,并...查...。这就需要一种能高效处理集合的合并与查找的算法,并查集就是专门为这种场景量身定制。
4.算法理论
并查集本质是一个森林,里面有很多树。
每个树有一个根,以不同的根代表不同的集合。如下,root1,root2代表两个集合。
如初始时,每个元素都属于一个独立的集合,该元素作为根。每个根指向一个虚拟根-n,代表权重(表示该集合有n个元素)。
更新合并
将权重小的集合的根指向权重大的集合的根(此操作是为尽量降低树的深度)。
查找
判断2个元素是否属同一集合,只需向上查找根,再判断是否相同。
过程中做路径压缩,加快下一次查找速度。
5.代码实现
5.1 查找
int findFather(int s) {int root = s, temp;// 查找s的最顶层根while (father[root] >= 0) {root = father[root];}// 路径压缩,提高后续查找效率while (s != root) {temp = father[s];father[s] = root;s = temp;}return root;
}
5.2 合并
void unionSet(int s, int e) {int rootS = findFather(s);int rootE = findFather(e);int weight = father[rootS] + father[rootE];// 将结点数少的集合作为结点数多的集合的儿子节点if (father[rootS] > father[rootE]) {father[rootS] = rootE;father[rootE] = weight;} else {father[rootE] = rootS;father[rootS] = weight;}
}
例题
poj1182,poj1308,poj1456,poj1611
关注我,涨知识,公众号:几何思维
基于并查集的六度分隔理论的验证与实现相关推荐
- 小世界效应:从凯文·贝肯到六度分隔理论(1)
斯坦福的老师很喜欢用一些生活的小案例来引入课题,小的Project也不例外. 凯文·贝肯是好莱坞的大牌明星,这次Project也得从他说起.虽然贝肯在娱乐圈可谓呼风唤雨,人气也是相当的高,但他与奥斯卡 ...
- 什么是社会性网络?什么是六度分隔理论?
2007年05月23日 星期三 下午 03:13 根据维基百科的解释,"社会网络(Social Networking:SN)"是指个人之间的关系网络. 据一些不系统的分析,社会网络 ...
- Python实现“维基百科六度分隔理论“之基础爬虫
预备阅读:Python的urllib高级用法 Python中Beautiful Soup的用法 Python中的正则表达式模块re 前言 前面学习了urllib和beautifulsoup来进行数 ...
- mst算法matlab_基于并查集+Kruskal算法的matlab程序及最小生成树绘图
学了一天最小生成树,稍稍总结一下,这是第一篇 kruskal算法 关于kruskal算法已有大量的资料,不再赘述,算法流程为: 得到邻接矩阵和权值: 初始化,连接距离最小的两点: 连接距离次小的两点, ...
- 基于并查集的kruskal算法
#include <iostream> //并查集的kruskal算法using namespace std;const int max_ve=1005,max_ed=15005;int ...
- 基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树
目录 一.Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边.这里的关键就是如何判断"将它 ...
- 关系和纽带:六度分割理论【存疑2处】
查资料的时候看到"六度分割理论",之前就听说过,只知道是什么意思,但没详细了解过. 维基百科上说"六度分割理论"(也叫"六度空间理论"或&q ...
- 从六度分隔到无尺度网络
1. 随机网络 现在我们来思考一个关于SNS形成的问题:我的朋友是从那里来的? 大约的故事是这样的: 从前,有个叫 mxwu的小孩出生在了中国某个二线城市的小院子里.他不知道为什么上帝没有把他安排在美 ...
- SNS背后的科学(1)从六度分隔到无尺度网络
http://socialbeta.com/t/the-wisdom-of-sns-part-one.html 此系列Blog连载于我的Blog和SocialBeta.欢迎各位关注SNS,社会化媒体的 ...
- 【原创】并查集之扩展域与边带权
[前言] 并查集是一种可以动态维护若干个不重叠的集合,并支持合并于查询的数据结构. 并查集的基本概念很简单,但是这样一种思想的用途十分广泛. 个人理解:这是一种很巧妙的,可以很好的处理对象之间关系的数 ...
最新文章
- Linux终端C语言实现图片拷贝
- SharePoint 2010自定义母版页小技巧——JavaScript和CSS引用
- java comp env 区别_加和不加java:comp/env/前缀有什么区别?
- android第五天晚:surfaceView
- 岳翔南京大学计算机,基于组合IIS路径抽取的组合线性混成系统有界可达性分析-中国科学.PDF...
- linux c++ 多进程初步01
- shell 中浮点数和整数的比较
- 机器人建模中移动关节如何建立坐标系_机器人标准DH建模法
- TensorFlow 学习(十一)—— 正则(regularizer)
- 8254跑马灯c语言程序,C语言笔记-基于C语言实现的流水跑马灯
- PyTorch——手写数字识别
- 牛客网在线编程Javascript输入输出
- 让电脑自动开机、关机以及取消开机密码
- 如何写一个简单的时钟表盘(qt)
- 致大学计算机老师的一封信,致大学老师的一封信
- 综述阅读:人工智能在肺癌影像基因组学方面的研究与进展
- 微服架构基础设施环境平台搭建 -(一)基础环境准备
- 华为视频会议TE40
- count在python中的作用,Python中这个count用法是啥
- 电子学会2022年6月青少年软件编程(图形化)等级考试试卷(二级)答案解析
热门文章
- ZPanel-开源免费的虚拟主机在线管理系统
- Chrome浏览器占用CPU资源过高(Software Reporter Tool)
- 最完整的PS快捷键大全(绝对经典)
- linux huge模式设置,Linux 下 Hugepages的配置
- 利用随机数生成器生成固定概率生成器
- Mac -- 插入移动硬盘后没有显示
- I2C中的10bit地址读写
- 现代密码学之对称加密-DES及AES算法
- fisco bcos 调用接口报错WeBASE-Node-Manager user not logged in 版本:v1.5.2
- Eclipse下载安装配置使用