Python-图-如何找出社交网络中的三度好友关系

2024-01-20 04:48

本文主要是介绍Python-图-如何找出社交网络中的三度好友关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

羁绊前行的,不是肆虐的狂风,而是内心的迷茫。—王争。

最近有些偷懒,距离上次更新也有两个星期了,原因我也很清楚,就是又开始有些迷茫了,购买了不少课程,仍不能减轻内心的焦虑。焦虑的原因还是想得太多,做得太少,总想一口吃个胖子,而实际上,学习是有滞后性的,而且因人而异,因此学习时不应报着是否有用无用的功利心态,书到用时方恨少,学习重在积累,你学习到的知识可能短期内用不到,但说不定未来某天某个时机,或者眼界的提升都有助于未来的选择和发展,这样想,内心平静了许多。其实脚踏实地的去干就行了,空想无用,不如学也。

荀子说过:学不可以已。古人都有这样的认知,我们这种从事 IT 行业的,更应践行终身学习,否则,干不过那群小学生。

今天,接着分享最近学习到的算法相关的工程应用,代码仍用 Python 实现,Python 语言非常易读,你可以方便地转化为自己擅长的语言。今天要分享的是图这种数据结构和遍历算法。

王争老师说过,一定要带着问题去学习算法。这里先抛出一个问题:如何找出社交好友中的三度好友关系?

这里解释下:一个用户的一度好友,就是他的直接好友,二度好友就是他好友的好友,三度好友就是他好友的好友的好友,还记得著名的 6 度理论吗,也就是说你最多通过 6 个人认识你想认识的世界上任何一个人。在社交网络中,我们往往通过用户之间的连接关系,来实现推荐「可能认识的人」这么一个功能。给你一个用户,如何找出这个用户的所有三度(其中包含一度、二度和三度)好友关系?

如何存储社交网络中的好友关系呢?图这种数据结构就非常适合表达社交网络中的好友关系,图中的顶点代表一个人,边代表两个人之间是好友关系(无向图),有方向的边可以表达单向的好友关系,比如 A 是 B 的粉丝而 B 不是 A 的粉丝,边上的权重还可以表达两个人的亲密度。

以无向图为例,假如求一个顶点的一度好友,就是该顶点直接相连的顶点的集合,二度好友,就是其一度好友的一度好友,三度好友就是二度好友的一度好友,是不是有点递归的味道。这就跟图的遍历算法有关。

众所周知,图有两种最基本的遍历算法:广度优先遍历(BFS)和深度优先遍历(DFS)。广度优先就是一层一层的遍历,是一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。而深度优先就是一条道走到黑,如果走不通再回退一下继续走,直到找到目标位置。

广度优先遍历

直观地感觉,广度优先算法可以满足查找三度好友关系,由于是一层一层地遍历,当遍历到第三层时,所有的一度二度三度好友都找到了。而且广度优先能找到最短路径,而深度优先则不一定。

下面我们来实现广度优先算法,并找出一个顶点的三度顶点。写代码前先思考下如何使用基础的数据结构比如数组、链表来存储一张图。数组和链表都是可以的,而且各有千秋。

一是使用二维数组来表达一张表,如下图所示:

邻接矩阵

这也叫邻接矩阵,这处存储的好处是利用数组随机访问的特性,查找和插入的速度快,缺点就是浪费内存。而链表的方式正好相反,节省了内存,但降低了访问速度。

邻接表

1、存储一个图

Python 是一种非常灵活的编程语言,我们可以使用 Python 中的字典来存储一个表,使用键来代表一个顶点,使用值来存储与该顶点相连的顶点。在实际的开发中,大家可能多使用 Python 的字典,它是一种 hash 表,查找的速度非常高效。

class AdjacencyList(object):def __init__(self):self.List = {}def addEdge(self, fromVertex, toVertex):# check if vertex is already presentif fromVertex in self.List.keys():self.List[fromVertex].append(toVertex)else:self.List[fromVertex] = [toVertex]def printList(self):for i  in self.List:print(i,'->',' -> '.join([str(j) for j in self.List[i]]))

现在我们来验证一下使用字典存储的无向图:

if __name__ == '__main__':al = AdjacencyList()al.addEdge(0, 3

这篇关于Python-图-如何找出社交网络中的三度好友关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/624826

相关文章

Python+Tkinter实现Windows Hosts文件编辑管理工具

《Python+Tkinter实现WindowsHosts文件编辑管理工具》在日常开发和网络调试或科学上网场景中,Hosts文件修改是每个开发者都绕不开的必修课,本文将完整解析一个基于Python... 目录一、前言:为什么我们需要专业的Hosts管理工具二、工具核心功能全景图2.1 基础功能模块2.2 进

Python多重继承慎用的地方

《Python多重继承慎用的地方》多重继承也可能导致一些问题,本文主要介绍了Python多重继承慎用的地方,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录前言多重继承要慎用Mixin模式最后前言在python中,多重继承是一种强大的功能,它允许一个

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

Python中edge-tts实现便捷语音合成

《Python中edge-tts实现便捷语音合成》edge-tts是一个功能强大的Python库,支持多种语言和声音选项,本文主要介绍了Python中edge-tts实现便捷语音合成,具有一定的参考价... 目录安装与环境设置文本转语音查找音色更改语音参数生成音频与字幕总结edge-tts 是一个功能强大的

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp