【数据结构与算法】图
一:如何理解“图”
1,图和树一样都是非线性表数据结构,和树不同的是图是一种更加复杂的非线性表结构
2,树中的元素称之为节点,图中的元素则称之为顶点。
3,顶点可以与任意其他顶点建立关联,这种建立的关系叫做边,与顶点相连接的条数叫做顶点的度。
4,图可以分为有向图和无向图两种,有向图的边有方向。
5,在有向图中,度可以分为入度和出度(Out-degree)
6,带权图:在带权图中,每条边都有一个权重
二:邻接矩阵存储方法
1,图最直观的一种存储方法是:邻接矩阵(Adjacency Matrix),邻接矩阵的底层依赖一个二维数组。
2,用邻接矩阵来表示一个图,虽然简单,直观,但是浪费存储空间。
①:对于无向图的二维数组中,如果将其对角线划分为上下两部分,那我们只需要利用上面或者下面这样的一半的空间就足够了,另一半白白浪费掉了。
②:若存储的是稀疏图(Sparse Matrix),即顶点很多,但每个顶点的边并不多,那邻接矩阵的存储方法就更加浪费空间了。
3,用邻接矩阵存储的优点:
①:存储方式简单,直接,因为基于数组,所以在获取两个顶点的关系时,就非常高效。
②:其次是计算方便。因为,可以将很多图的运算转换成矩阵之间的运算。如求解最短路径问题时会提到一个Floyd-Warshall算法,就是利用矩阵循环相乘若干次得到结果。
三:邻接表存储方法
1,邻接表(Adjacency List)可以解决邻接矩阵存储方式比较浪费内存空间的问题
2,邻接矩阵存储起来比较浪费空间,但使用比较节省时间,邻接表存储与之相反。
如图中,如果要确定是否存在从顶点2到顶点4的边,就需要遍历顶点2对应的链表,看那条链表中是否存在顶点4。但链表的存储方式对缓存不友好。
3,我们可以将邻接表中国的链表改成平衡二叉查找树,实际开发中国还可选用红黑树。这样可以快速查找两个顶点之间是否存在边了。
四:图的应用
如何存储微博,微信、QQ等社交网络中的好友关系?
- 微博,微信是两种“图”,前者是有向图,后者是无向图。
- QQ无向图 权重亲密度
数据结构是为算法服务的,所以具体选择哪种存储方法,与期望支持的操作有关系。针对微博的用户关系,需要支持:
判断用户A是否关注了用户B;
判断用户A是否是用户B的粉丝
用户A关注用户B;
用户A取消关注用户B;
根据用户名称的首字母排序,分页获取用户的粉丝列表;
根据用户名称的首字母排序,分页获取用户的关注列表。
3 。因为社交网络是一张稀疏图,使用邻接矩阵存储比较浪费存储空间,所以使用邻接表来存储。
4,但用一个邻接表来存储这种有向图是不够的,查找某个用户关注了哪些用户非常容易,但是如果想要知道某个用户都被哪些用户关注了,是非常困难的。因此,需要一个逆邻接表。邻接表中存储了用户的关注关系,逆邻接表中存储的是用户的被关注关系。
对应到图上,邻接表中,每个顶点的链表中,存储的就是这个顶点指向的顶点,逆邻接表中,每个顶点的链表中,存储的是指向这个顶点的顶点。
- 基础的邻接表不适合快速判断两个用户之间是否是关注与被关注的关系。
因为我们需要按照用户名称的首字母排序,分页来获取用户的粉丝列表或者关注列表,用跳表这种结构再合适不过了。这是因为,跳表插入、删除、查找都非常高效,时间复杂度是 O(logn),空间复杂度上稍高,是 O(n)。最重要的一点,跳表中存储的数据本来就是有序的了,分页获取粉丝列表或关注列表,就非常高效。
1 内存中用邻接表;
2 要持久化存储就用数据库
2 超大图 并且涉及大量图计算。用专业的图数据库
笔记整理来源: 王争 数据结构与算法之美
【数据结构与算法】图相关推荐
- 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...
数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...
- 数据结构与算法--图的表示与常用算法
什么是图? 图(Graph)形结构中,是一种非线性结构,在图中每一个元素都可以有0或多个前驱,也可以有多个后驱.节点之间的关系是任意的,即图中任意两个数据元素之间都有可能相关. 图的术语 顶点:带有数 ...
- Python 数据结构与算法——图(Graph)
图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作诠释成一个图问题的话,那么该问题至少已经接近解决方案了.而我们我们的问题实例可以用**树结构(tr ...
- js数据结构与算法 图的BFS和DFS
本文为技术学习的笔记-<Learning JavaScript Data Structures and Algorithms, Third Edition> 1.图的相关术语 图是网络结构 ...
- Python__数据结构与算法——图
图是非线性的数据结构,图是由顶点和边组成的.如果图中的顶点是有序的,那么图是有方向的,称之为有向图,如图-1所示:否则,图是无方向的,称之为无向图.在途中,由顶点组成的序列称之为路径. 图和树相比,少 ...
- 计算机基础知识数据结构与算法,(计算机基础知识)[数据结构与算法] 图
第六章 图 6.1 图的定义和基本术语 图: G=(V,E) Graph = (Vertex, Edge) V: 顶点(数据元素)的有穷非空集合 E: 边的有穷集合 完全图: 任意两个点都有一条边相连 ...
- c++ 遍历所有点且距离最短_编程小白暑期进阶笔记41-C语言数据结构与算法图遍历的应用...
基于广度优先遍历算法的应用 思考题: (思考题答案: BFS(广度优先遍历)在一般的带权图中是不能解决最短路问题,了解BFS的都知道,BFS是根据节点到源节点之间的节点数遍历的,也就是先访问离源节点节 ...
- c++数据结构与算法 图
图的定义: 图:用线或者边连接在一起的节点集合.G=(V,E) 当且仅当(i,j)是图的边,则称节点i,j是邻接的. 有向图和无向图: 加权图: 一条路径,如果除第一个和最后一个节点之外,其他节点各不 ...
- java数据结构和算法——图的深度优先(DFS)遍历
目录 一.图的遍历介绍 二.图的深度优先搜索(Depth First Search) 三.图的深度优先遍历算法步骤 四.图的深度优先遍历示例需求 五.图的深度优先遍历代码示例 一.图的遍历介绍 所谓图 ...
- java数据结构和算法——图的广度优先(BFS)遍历
目录 一.图的遍历介绍 二.图的广度优先搜索(Broad First Search) 三.图的广度优先遍历算法步骤 四.图的广度优先遍历示例需求 五.图的广度优先遍历代码示例 一.图的遍历介绍 所谓图 ...
最新文章
- OpenCV 笔记(07)— Mat 对象输出格式设置(Python 格式、CSV 格式、NumPy 格式、C 语言格式)
- 如何才能正确的关闭Socket连接
- C#调用python文件
- Oracle EBS R12.1.1 应用克隆 - 2
- mac自带邮箱导出邮件_如何将电子邮件从Mac Mail导出到Notes应用程序
- 认证令牌_Java应用程序的令牌认证
- Hadoop学习---Zookeeper+Hbase配置学习
- 商业智能BI有哪些数据价值
- jQuery 的 ajax
- PHP连接MYSQL没有反应
- 小学计算机网络教室简介,市中小学计算机网络教室(网络学习室)
- 如何有效管理项目进度?管控关键里程碑?
- 可以提升效率的待办清单APP
- 《产品游戏化》电子书下载(epub+mobi+pdf) Netflix、迪士尼、微软巨头在使用的产品策略
- officemix安装 0x80091007 哈希数值不正确
- ​基于STM32F407的五子棋游戏设计​
- JS跳转到第三方地图APP
- Codex Popup List
- 物联网平台搭建的全过程介绍(二)——物联网平台通信思维导图
- 用Tableau自定义数字格式创建高端表格