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结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python