算法系列讲解之:社交网络之共同好友模型讲解

简介: 算法系列讲解之:社交网络之共同好友模型讲解

我们知道社交网络经常会看到共同好友,共同好友目前资料也非常的多,也有代码实现,可以依然很多老铁不知道它是怎么实现的,或则说比较模糊。这里给大家介绍下找共同好友的算法。


社交共同好友图



为什么感觉难度大:我们看下图:


1be3d426c943f442965dc88e2ce7e213.jpg

上面图示展示了好友之间的关系,那么我们的共同好友,该如何找到。面对如此复杂的图谱,我们只要认真分析,其实可以捋顺其中关系。


逻辑推理、解析


既然是共同好友,那么肯定是两个人,才算共同好友。也就是说我们面对如此复杂的图谱,我们只要以两个人为研究对象,然后找到两个人的共同好友,其它依次类推,找到更多的两个人的共同好友。


那么这个共同好友,我们该如何实现。


将业务需求转换为程序



两个人的共同好友,我们需要转换为我们的程序,这也是我们程序员的价值,也是我们跟非编程人员的价值区别。那么两个人我们可以转换为两个用户,这两个用户,我们可以通过用户id来表示。相信这个大家都能理解。


两个人我们使用两个用户id,那么这两个用户其实是有非常多好友的。既然有非常多的好友,那么这些好友其实也是用户,所以好友也可以使用用户id来表示。

那么我们可以这样表示了


逻辑图:



下面我们看到两个用户,互为好友,他们分别都有自己的好友。对于下面逻辑图,我们自己就可以找到好友。但是如果想通过程序该如何实现。


6f2bcd1da2c6802b8161571360d0017a.png程序图


这里我们把他转换为实现图,或则程序图

2b466ac1120528ad76754f17b722d398.png


我们将上面的逻辑关系,转换为底层的关系。


程序图转换为程序


上面图已经有了,可是我们该如何转换为程序结构,所以这里我们需要进一步转换为程序。该如何通过程序找到他们的共同好友。


我们人工可以找到他们的共同好友,那么程序该如何找到这些数据的共同好友。


数据在程序中,是需要装起来的。那么该如何装下这些数据,这时候我们就需要想到数据结构了。这时候就涉及到了我们的专业知识,都有哪些数据结构。比如有数组,list,map,树等,其实我们就用比较简单的数据结构即可。我们使用map。这时候就有key和value。


key其实就是我们的用户UserID1,那么他的朋友即为value list,也就是后面一系列的:UserID2,UserID3,UserID。。,UserIDN

用户UserID2,同样也是UserID1,UserID3,UserID。。,UserIDN等


这样我们剩下的该如何做了那?操作两个map,假设UserID1对应的为map1,UserID2对应map2找到他们的共同好友。该如何找到共同好友?

遍历两个map呀.我们通过两个for循环


这里写代码,只表示思路:

for (Integer key : map1.keySet()) {
      for (Integer key : map2.keySet()) {
        if(map1.get(value)==map2.get(value))
         print("共同好友"+value)
   }


代码优化


上面只是实现了,对于两个集合,如果有的长,有的短,我们将小集合放到外层循环,这样可以效率更高。

如果map2是小集合我们可以采用下面方式

for (Integer key : map2keySet()) {
for (Integer key : map1.keySet()) {
if(map1.get(value)==map2.get(value))
print("共同好友"+value)
}


大数据实现


上面我们其实讲的是该如何实现,以及传统该如何实现,那么我们使用MapReduce或则spark该如何实现?

这个其实在《数据算法  Hadoop Spark大数据处理技巧》中是有的,这里给大家贴出来,然后对这里面比较难以理解的做个说明。

9efd24a41514517f71ed70b779f6cf19.jpg

对于map函数,其实是在分割的数据中,通过map找到用户的朋友列表,这里它把用户视为key,用户朋友视为value,但是这个value是为list的。


而且这里面比较难以理解的,其实也是重点,那就是在找到用户id视为key,用户列表视为value后,在输出到reduce时候,将key和value重新组合为key,然后将value视为value。本质其实如下

key value重新定义key2,value重新定义value2,也就是上面的(key2,value2)。那么reduce这时候接受到的数据格式为:

(key value,value)


那么为何这样做,我这里做一个简单的说明,而且下面遇到的时候,在给大家讲解。

3d047d8b661835ca7f1952453fcbfd74.png


我们看到下面每一个map重新定义后的(key value,value)输出内容,我们或许可能恍然大悟,key定义为两个userid其实是为了方便找到共同好友。也就是key包含了userid和它的value,也就是包含了自己和他的其中一个朋友,是为了方便找到他们的共同好友。但是我们看到其实map的作用只是组合了本人和它的好友。何谈共同好友?这是我们在reduce里面会更加明显的让我们看到共同好友。


如果说map只是简单的组合了自己的好友。我们继续往下看reduce。

3b75e85c9847d576e7493fd2b442ae9f.jpg

33f7b09efecbe35c5fa2c1c9a349f3df.jpg

我们看下面reduce讲userid为100和200之间找到共同好友。对于任何一个map来讲,它的作用其实就是找到自己的一个朋友,和他的朋友列表。对于另外一个朋友,其实也是一样,找到他的朋友和他的朋友列表。

这样比较绕口,这里我们看下面具体例子。比如还是100和200为例子。

原始数据是这样的

100和他的朋友,200和他的朋友。

进入map后,处理为:

100和200,然后100的朋友列表

另外被分割的数据,被map同样也处理格式为

100和200,然后200的朋友列表


这样在reduce的时候,就可以通过我们传统的思路比较,找到100和200的共同好友。

22421a528d288b6312092a5bb7906e25.jpg

28eeb11d327cafd7ad83b86e28bbceb0.jpg

7cbb40df2b42d919b9390844f56d731f.png我们明白了map的作用其实就是先配对,reduce其实就是找到配对朋友的共同好友。


上面其实我们明白了MapReduce,spark其实在这个思路下,其实就是API的应用。这里只是简单贴下思路。

5e500ed0c8e269eb3ec47f85bfa04369.jpg


当然如果明白了思路,其实我们也可以通过Flink来实现。

目录
相关文章
|
16天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
50 2
|
16天前
|
运维 网络协议 算法
7 层 OSI 参考模型:详解网络通信的层次结构
7 层 OSI 参考模型:详解网络通信的层次结构
44 1
|
16天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
63 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
16天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
53 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
16天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
62 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
27天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
27天前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
29天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
74 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。