zoukankan      html  css  js  c++  java
  • 《数据结构与算法之美》25——图的表示

    基本概念

    • 图是一种非线性的数据结构,相比树来说,更加复杂。
    • 图的元素叫顶点,树的元素叫节点。
    • 度:顶点相连的边的条数叫度。

    图的分类有无向图、有向图、带权图

    无向图

    边没有方向的图员无向图。无向图中的顶点相连的边的条数叫度。例如微信上的好友关系。

    image

    有向图

    边有方向的图叫有向图。有向图中分为入度和出度。入度指终点为此顶点的边的条数;出度指始点为此顶点的边的条数。例如微博上的关注和粉丝关系。

    image

    带权图

    每条边都有一个权重的图叫带权图。例如QQ上与好友的亲密度。

    image

    图的存储方式

    图有两种存储方式,分别为邻接矩阵和邻接表。

    邻接矩阵

    通过二维数组来保存图的边。其中无向图(i, j)和(j, i)设置为1,有向图设置带方向的边,比如(i, j)设置为1,带权图把值设置为权重。

    image

    • 好处:存储简单、访问方便、方便计算
    • 坏处:浪费空间

    邻接表

    每个顶点存储一个链表,存储的是这个顶点的相连的顶点。跟之前学过的散列表很像。每个顶点存储的是指向的顶点,无论是有向图还是无向图。

    image

    • 好处:节省空间
    • 坏处:操作耗时

    优化:通过对链表进行改造,使用跳表、散列表、平衡二叉树、红黑树等数据结构来优化。

    案例分析

    如何存储微博、微信等社交网络中的好友关系?

    针对微博用户关系,假设我们需要支持下面这样几个操作:

    1. 判断用户A是否关注了用户B;
    2. 判断用户A是否是用户B的粉丝;
    3. 用户A关注用户B;
    4. 用户A取消关注用户B;
    5. 根据用户名称的首字母排序,分页获取用户的粉丝列表;
    6. 根据用户名称的首字母排序,分页获取用户的关注列表。

    技术选型思路:

    1、确定存储方式

    因为社交关系是稀疏的,选择邻接表。

    因为既要查看关注的,还要查看粉丝,因此除了使用邻接表,还需要逆邻接表。

    image

    2、存储方式的底层数据结构

    需要按用户名称首字母排序,并且要优化操作性能,因此选择跳表改造基础的邻接表,并且还有很重要的一点,跳表本身的数据是有序的。

    3、确定数据规模

    因为单个计算机资源是有限的,例如内存、磁盘空间。数据规模对存储方案有很大的影响。

    对于小规模数据,几十万数据量,将邻接表直接保存到内存中。

    对于大规模数据,数以亿计,就需要存储在多台服务器上。可使用哈希算法来计算用户存储在哪台服务器上。

    image

    另外,也可存储在磁盘上。磁盘相对于内存来说,空间更大。比如数据库文件就是存储在磁盘上,可通过索引优化查询效率。

    image

  • 相关阅读:
    [Bzoj2243][SDOI2011]染色(线段树&&树剖||LCT)
    [poj3074]Sudoku(舞蹈链)
    [Bzoj1047][HAOI2007]理想的正方形(ST表)
    [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
    [Bzoj2431][HAOI2009]逆序对数列(前缀和优化dp)
    [Bzoj1072][SCOI2007]排列perm(状压dp)
    [Bzoj1195][HNOI2006]最短母串(AC自动机)
    Ajax解决IE浏览器兼容问题
    运行eclipse弹出“Failed to load the JNI shared”解决方法
    Java表单类双击提交
  • 原文地址:https://www.cnblogs.com/liang24/p/13352980.html
Copyright © 2011-2022 走看看