hello算法笔记之图

这篇具有很好参考价值的文章主要介绍了hello算法笔记之图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、图的基础知识

图是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。

1.图的类型:

根据边是否具有方向可以分为有向图,无向图

根据所有顶点是否连通可以分为连通图(对于连通图,从某个顶点出发,可以到达其余任意顶点),非连通图

2.图常用术语:

  • 「邻接 Adjacency」:当两顶点之间存在边相连时,称这两顶点“邻接”。在
  • 「路径 Path」:从顶点 A 到顶点 B 经过的边构成的序列被称为从 A 到 B 的“路径”。
  • 「度 Degree」表示一个顶点拥有的边数。对于有向图,「入度 In-Degree」表示有多少条边指向该顶点,「出度 Out-Degree」表示有多少条边从该顶点指出。

3.图的表示:

图的常用表示方法包括「邻接矩阵」和「邻接表」。

对于邻接矩阵:A[i][j]表示i到j的边,1是有边,0是没有边。

  • 对于无向图,两个方向的边等价,此时邻接矩阵关于主对角线对称。
  • 将邻接矩阵的元素从1,0替换为权重,则可表示有权图。

使用邻接矩阵表示图时,我们可以直接访问矩阵元素以获取边,因此增删查操作的效率很高,时间复杂度均为O(1),然而,矩阵的空间复杂度为O(n²)

对于邻接表:使用n个链表来表示图,链表节点表示顶点。第 i条链表对应顶点i,其中存储了该顶点的所有邻接顶点(即与该顶点相连的顶点)。邻接表仅存储实际存在的边,而边的总数通常远小于 \(n^2\) ,因此它更加节省空间。然而,在邻接表中需要通过遍历链表来查找边,因此其时间效率不如邻接矩阵。邻接表结构与哈希表中的「链地址法」非常相似,因此我们也可以采用类似方法来优化效率。例如,当链表较长时,可以将链表转化为 AVL 树或红黑树,从而将时间效率从O(n)优化至 O(log n) ,还可以通过中序遍历获取有序序列;此外,还可以将链表转换为哈希表,将时间复杂度降低至 O(1) 。

二、图的基础操作

图的基础操作可分为对「边」的操作和对「顶点」的操作。

1.基于邻接矩阵的实现:

  • 添加或删除边:直接在邻接矩阵中修改指定的边即可,使用O(1) 时间。而由于是无向图,因此需要同时更新两个方向的边。
  • 添加顶点:在邻接矩阵的尾部添加一行一列,并全部填 0 即可,使用 O(n) 时间。
  • 删除顶点:在邻接矩阵中删除一行一列。当删除首行首列时达到最差情况,需要将 (n-1)^2 个元素“向左上移动”,从而使用 O(n^2) 时间。
  • 初始化:传入 n 个顶点,初始化长度为 n 的顶点列表 vertices ,使用 \O(n) 时间;初始化 n * n 大小的邻接矩阵 adjMat ,使用 O(n^2) 时间。

2.基于邻接表的实现

设无向图的顶点总数为 n 、边总数为 m ,则有:

  • 添加边:在顶点对应链表的末尾添加边即可,使用 O(1) 时间。因为是无向图,所以需要同时添加两个方向的边。
  • 删除边:在顶点对应链表中查找并删除指定边,使用 O(m) 时间。在无向图中,需要同时删除两个方向的边。
  • 添加顶点:在邻接表中添加一个链表,并将新增顶点作为链表头节点,使用 O(1) 时间。
  • 删除顶点:需遍历整个邻接表,删除包含指定顶点的所有边,使用 O(n + m) 时间。
  • 初始化:在邻接表中创建 n 个顶点和 2m 条边,使用 O(n + m) 时间。

三、图的遍历

「图」和「树」都是非线性数据结构,都需要使用「搜索算法」来实现遍历操作。

与树类似,图的遍历方式也可分为两种,即「广度优先遍历 Breadth-First Traversal」和「深度优先遍历 Depth-First Traversal」,也称为「广度优先搜索 Breadth-First Search」和「深度优先搜索 Depth-First Search」,简称 BFS 和 DFS。

1.BFS(通常借助队列来实现)

从某个顶点出发,先遍历该顶点的所有邻接顶点,然后遍历下一个顶点的所有邻接顶点,以此类推,直至所有顶点访问完毕。

hello算法笔记之图

 遍历一次所有节点,遍历两次(因为是无向图)所有边(因为要通过边到达另一个节点),总时间为O(V+E),空间为O(V)

2.DFS

从某个顶点出发,访问当前顶点的某个邻接顶点,直到走到尽头时返回,再继续走到尽头并返回,以此类推,直至所有顶点遍历完成。

hello算法笔记之图

 总时间为O(V+E),空间为O(V)文章来源地址https://www.toymoban.com/news/detail-509609.html

到了这里,关于hello算法笔记之图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux基础知识笔记

    记录linux基础知识,持续更新中… /dev/null 是一个特殊的设备文件,可以将数据重定向到这个文件中,从而实现将输出或错误信息丢弃的效果。在 Linux 系统中, /dev/null 被称为“黑洞”,因为所有写入它的数据都会被立即丢弃,无法恢复。 在 Shell 脚本中,可以使用 符号将输出

    2024年02月07日
    浏览(46)
  • python基础知识笔记

    参考视频和资料:2022新版黑马程序员python教程,8天python从入门到精通,学python看这套就够了_哔哩哔哩_bilibili 最后有知识的思维导图!  解释器:pycharm 一、Pycharm快捷键和基础 注释多行代码:Ctrl+/ 单行注释:# 搜索:ctrl + f 打开软件设置:ctrl+alt+s 复制当前行代码:ctrl + d

    2024年02月03日
    浏览(43)
  • 前端算法基础知识

    数组 数组是一种线性数据结构,可以存储同类型的数据元素。数组具有随机访问性,可以通过下标访问其中的元素,时间复杂度为O(1)。 链表 链表也是一种线性数据结构,不同于数组,链表中的元素不是连续存储的,每个元素包含一个指向下一个元素的指针。链表不支持随机

    2024年02月03日
    浏览(36)
  • 基础知识学习---排序算法

    1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作

    2024年02月09日
    浏览(52)
  • (学习笔记)TCP基础知识

    TCP 是 面向连接的、可靠的、基于字节流 的传输层通信协议。 面向连接:一定是[一对一]才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的; 可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收

    2024年02月16日
    浏览(59)
  • 模电基础知识学习笔记

    文章目录: 一:基本元器件介绍  1.二极管 1.1 普通二极管特性测试  1.2 稳压二极管测试 1.3 整流二极管 1.4 开关二极管 2.电容 3.三极管(电流控制) 3.1 介绍  3.2 类型(PNP、NPN)  3.3 三种工作状态:放大状态、截止状态、饱和状态 4.场效应管(电压控制) 4.1 介绍  4.2 类型(耗尽

    2024年02月15日
    浏览(69)
  • 【TypeScript】基础知识学习笔记

    TypeScript的特点: JavaScript的超集,满足所有的JS语法 含有面向对象的静态类型 起步安装:1、npm i typescript -g 2、tsc 文件名 一、TS的基本数据类型 基本数据类型:number、boolean、string、undefined、null、symbol、bigint、void 当中的类型有大小写的区分:大写的类型是给对象使用,小写

    2024年02月09日
    浏览(56)
  • 知识储备--基础算法篇-矩阵

    第一题上来就跪了,看了官方答案感觉不是很好理解,找了一个比较容易理解的。 还有一个暴力方法,其中有几个知识点, list的[]中有三个参数,用冒号分割 list[param1:param2:param3] param1,相当于start_index,可以为空,默认是0 param2,相当于end_index,可以为空,默认是list.size p

    2024年02月10日
    浏览(32)
  • 【算法基础】数学知识

    866. 试除法判定质数 - AcWing题库 时间复杂度是logN 867. 分解质因数 - AcWing题库  868. 筛质数 - AcWing题库 朴素版,埃氏筛法  线性筛 868. 筛质数 - AcWing题库 线性筛把时间复杂度优化到O(n),就需要保证筛去一个数只用一次,保证最小质因数就可以确保这一点。 如。筛去24,24=2*1

    2024年02月08日
    浏览(49)
  • Zookeeper学习笔记(1)—— 基础知识

    Zookeeper 是一个开源的分布式的, 为分布式框架提供协调服务 的 Apache 项目 Zookeeper从设计模式角度来理解:是一个基于 观察者模式 设计的 分布式服务管理框架 ,它 负责存储和管理大家都关心的数据 ,然后 接受观察者的注 册 ,一旦这些数据的状态发生变化,Zookeeper就 将负

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包