数据结构与算法简记--图

图(Graph)


 概念

  • 顶点--图中的元素
  • --顶点与顶点之间的关系
  • --连向某顶点的边的个数称为该顶点的度
  • 无向图、有向图、加权图
    • 无向图--没有方向,关系是相互的,应用如微信好友,好友关系是相互的
    • 有向图--有方向,度分为入度和出度,应用如微博关注,关注是有可以单向的
    • 带权图--关系增加权重值,可表示亲密度,应用如QQ好友,好友有亲密度

图的存储

  • 邻接矩阵(Adjacency Matrix)存储方法
    • 底层依赖一个二维数组。
    • 对于无向图来说,如果顶点 i 与顶点 j 之间有边,我们就将 A[i][j] 和 A[j][i] 标记为 1;
    • 对于有向图来说,如果顶点 i 到顶点 j 之间,有一条箭头从顶点 i 指向顶点 j 的边,那我们就将 A[i][j] 标记为 1。同理,如果有一条箭头从顶点 j 指向顶点 i 的边,我们就将 A[j][i] 标记为 1。
    • 对于带权图,数组中就存储相应的权重。
    • 缺点--是稀疏图(Sparse Matrix),浪费空间,如微信用户好几亿,但每个用户好友不会太多,
    • 优点--
      • 首先,简单、直接,因为基于数组,所以在获取两个顶点的关系时,就非常高效。
      • 其次,方便计算:可以将很多图的运算转换成矩阵之间的运算。比如求解最短路径问题时会提到一个Floyd-Warshall 算法,就是利用矩阵循环相乘若干次得到结果。
  • 邻接表(Adjacency List)存储方法
    • 每个顶点对应一条链表,链表中存储的是与这个顶点相连接的其他顶点
    • 对于有向图,每个顶点对应的链表里面,存储的是指向的顶点(关注的顶点)。
    • 对于无向图来说,每个顶点的链表中存储的,是跟这个顶点有边相连的顶点
    • 优点:节省空间

    • 缺点:查询效率没有邻接矩阵高(空间换时间)

    • 改进:可以像改进散列表一样改进邻接表,用于存储的链表可改进为查询效率更高的红黑树跳表有序动态数组等,提高查询效率。

    • 逆邻接表:存储被关注

 

猜你喜欢

转载自www.cnblogs.com/wod-Y/p/12070462.html
今日推荐