软件设计师_数据结构与算法基础_学习笔记

news2024/11/28 19:00:17

文章目录

  • 6.1 数组与矩阵
    • 6.1.1 数组
    • 6.1.2 稀疏矩阵
  • 6.2 线性表
    • 6.2.1 数据结构的定义
    • 6.2.2 顺序表与链表
      • 6.2.2.1 定义
      • 6.2.2.2 链表的操作
    • 6.2.3 顺序存储和链式存储的对比
    • 6.2.4 队列、循环队列、栈
      • 6.2.4.2 循环队列队空与队满条件
      • 6.2.4.3 出入后不可能出现的序列练习
    • 6.2.5 串
    • 6.2.6 广义表
  • 6.3 树与二叉树
    • 6.3.1 基本概念
    • 6.3.2 满二叉树与完全二叉树
    • 6.3.3 二叉树的重要性质
    • 6.3.4 二叉树的遍历
    • 6.3.5 方向构造二叉树
    • 6.3.6 树转二叉树
    • 6.3.7 查找二叉树(排序二叉树)
    • 6.3.8 最优二叉树(哈夫曼树)
    • 6.3.9 线索二叉树
    • 6.3.10 平衡二叉树
  • 6.4 图
    • 6.4.1 图的概念
    • 6.4.2 图的存储方式
    • 6.4.3 图的遍历
    • 6.4.4 拓扑排序
    • 6.4.5 图的最小生成树(Prim&kruskal)
  • 6.5 算法基础
    • 6.5.1 算法的特性
    • 6.5.2 算法的复杂度
  • 6.6 查找
    • 6.6.1 顺序查找
    • 6.6.2 二分查找法
    • 6.6.3 散列表法
  • 6.7 排序
    • 6.7.1 基本概念
    • 6.7.2 直接插入排序
    • 6.7.3 希尔排序
    • 6.7.4 直接选择排序
    • 6.7.5 堆排序
    • 6.7.6 冒泡排序
    • 6.7.7 快速排序
    • 6.7.8 归并排序
    • 6.7.9 基数排序
  • 6.8 排序算法的复杂度

6.1 数组与矩阵

6.1.1 数组

求存储地址

  • 一维数组直接算
  • 二维数组看清是按行还是按列存储

在这里插入图片描述

6.1.2 稀疏矩阵

在这里插入图片描述

求对应一维数组下标公式,可以直接代两个元素进行验算

在这里插入图片描述

6.2 线性表

6.2.1 数据结构的定义

线性结构

  • 线性表

非线性结构

  • 图(可能存在环路)

在这里插入图片描述

6.2.2 顺序表与链表

6.2.2.1 定义

顺序表:采用一维数组的方式来存信息
链表:每个存储单元包含数据和指针

  • 单链表:只有一套指针,头结点指向第一个元素,并依次指下去。
  • 循环链表:与单链表的区别就是尾部有个指针直接指向头部。
  • 双向链表:可以双向移动,一套指针从头指到尾部,一套由尾指到头部。

6.2.2.2 链表的操作

  • 单链表删除结点:p->next = q->next
  • 单链表插入结点:s->next = p->next;p->next = s->next

引入头结点的好处可以让所有的结点操作方式一致

在这里插入图片描述

6.2.3 顺序存储和链式存储的对比

在这里插入图片描述

6.2.4 队列、循环队列、栈

队列:先进先出(又称先进先出表)
栈:先进后出

在这里插入图片描述

6.2.4.2 循环队列队空与队满条件

在这里插入图片描述

6.2.4.3 出入后不可能出现的序列练习

在这里插入图片描述

6.2.5 串

串是仅由字符构成的有限序列,是线性表的一种。

6.2.6 广义表

  • 广义表是线性表的推广
  • 广义表的元素即可以是单个元素(原子),也可以是广义表(子表)
  • 操作:
    *取表头head(LS)
    *取表尾tail(LS)

在这里插入图片描述

6.3 树与二叉树

6.3.1 基本概念

  • 根:树最顶层的结点。即下图的结点1。
  • 父结点(双亲结点):元素的上一层。下图中结点1为结点2、3的父结点。
  • 子结点:与父结点相反。
  • 兄弟结点:与该结点同层。下图结点4是结点5的兄弟结点。6为堂兄弟结点。
  • 结点的度:一个结点的子树的个数。下图结点2的度为2,结点7的度为0。
  • 树的度:该树中结点的度最高的结点的度的个数。MAX。下图树的度为2。
  • 叶子结点(终端结点):度为0的结点。下图结点4、5、7、8。
  • 内部结点(分支结点或非终端结点):除根结点和叶子结点外。下图结点2、3、6。
  • 结点的层次:根结点为第一层,依次往下。
  • 树的高度(深度):一棵树最大的层数。下图树的高度为4。

在这里插入图片描述

6.3.2 满二叉树与完全二叉树

  • 满二叉树:深度为k的二叉树节点个数为2k -1,即所有的结点都是满的。

可以对满二叉树进行连续编号,约定编号从根结点自上而下,自左至右依次进行。

  • 完全二叉树:除最底层外其余为满二叉树,最底层从左至右依次排列。

在这里插入图片描述

6.3.3 二叉树的重要性质

在这里插入图片描述

6.3.4 二叉树的遍历

三种遍历方式的区别就是根遍历的先后问题。

  • 先序遍历:根左右
  • 中序遍历:左根右
  • 后序遍历:左右根
  • 层次遍历:按顺序遍历

在这里插入图片描述

6.3.5 方向构造二叉树

给出二叉树的遍历序列,反向推出二叉树的结构
在这里插入图片描述

在这里插入图片描述

6.3.6 树转二叉树

  1. 将兄弟结点相连。
  2. 只保留第一个孩子结点与父结点的连线,其余全部断开,在旋转图可得

在这里插入图片描述

6.3.7 查找二叉树(排序二叉树)

对于每个结点,其左孩子结点小于根,右孩子结点大于根,称为查找二叉树。

在这里插入图片描述

6.3.8 最优二叉树(哈夫曼树)

哈夫曼树是其叶子结点带权路径长度最短的二叉树

  • 带权路径长度:即路径长度乘权值,下图第一个二叉树的结点8的带权路径长度为8*3=24。
  • 树的带权路径长度为其总和。

在这里插入图片描述

6.3.9 线索二叉树

在所有的叶子结点上标出其前驱和后继。需先求出其序列,才能写出对应的线索二叉树。

在这里插入图片描述

6.3.10 平衡二叉树

每个结点的平衡度只能为1、0、-1
平衡度为该结点的左子树深度减右子树深度的值

在这里插入图片描述

6.4 图

6.4.1 图的概念

无向图:连接的线无方向。
有向图:连接的线有方向。

在这里插入图片描述

6.4.2 图的存储方式

  • 邻接矩阵:通路为1,无通路为0。

在这里插入图片描述

  • 邻接表:邻接表会记录每个结点相邻结点的信息。用数组记录结点,用链表记录可以到的结点的情况。

在这里插入图片描述

6.4.3 图的遍历

  • 深度优先:根据线索,一层一层深入到底,直到无法继续访问再退回进入下一个分支。
  • 广度优先:把一个结点的所有相邻的结点访问完,再进入下一个层次。

在这里插入图片描述
在这里插入图片描述

6.4.4 拓扑排序

拓扑排序:用一个序列表达一个图中,哪些事件可以先执行,哪些可以后执行

在这里插入图片描述

6.4.5 图的最小生成树(Prim&kruskal)

最小生成树:把图的一些边去除,只留下若干条边把所有结点连贯起来,留下的边的权值较小,使得留下来的这部分边的权值加起来最小。求最小生成树有普里姆算法和克鲁斯卡尔算法两种。

  • 普里姆算法(Prim):任选一个结点,将其标为红点集,其余的是蓝点集,然后找出从红点集到蓝点集最短的距离,找出后将其相连,相连的结点纳入红点集,再次寻找红点集到蓝点集最短的距离。选的边不能形成环路。

在这里插入图片描述

  • 克鲁斯卡尔算法(Kruskal):先确定要选的边的条数(结点数减一),再从整个图中最小的边选起,不能形成环路。

在这里插入图片描述

6.5 算法基础

6.5.1 算法的特性

在这里插入图片描述

6.5.2 算法的复杂度

时间复杂度:衡量算法执行下来需要耗费多少的时间,时间的量级。
常见的时间复杂度:
在这里插入图片描述

  • O(1):执行一条或多条类似于赋值的语句。
  • O(log2n):在排序二叉树中查询值,其中n为二叉树的层数。二分查找法。
  • O(n):执行一次类似for(i=0;i<n;i++)的语句。
  • O(n2):二层循环嵌套。
  • O(n3):三层循环嵌套。

在这里插入图片描述

  • 空间复杂度:衡量算法在执行过程中需要使用到的空间或交换空间的数量。

在这里插入图片描述

6.6 查找

6.6.1 顺序查找

  • 顺序查找:常见、简单但效率较低,时间复杂度为O(n)

在这里插入图片描述

6.6.2 二分查找法

  • 二分查找:首先必须是有序序列,查找二叉树就是有这种思想。

在这里插入图片描述
注意:比较过的值或区间不再出现在下次比较的区间内。
在这里插入图片描述
在这里插入图片描述

6.6.3 散列表法

类似按内容存储,将数据经过一定的规定运算(散列函数)在存储,若存储时数据冲突,可采用线性探测法和伪随机数法处理。

在这里插入图片描述

6.7 排序

6.7.1 基本概念

稳定与不稳定排序 内排序(内存中)与外排序。

  • 插入类排序:直接插入排序、希尔排序
  • 交换类排序:冒泡排序、快速排序
  • 选择类排序:简单选择排序、堆排序
  • 归并排序
  • 基数排序

在这里插入图片描述

6.7.2 直接插入排序

在这里插入图片描述

6.7.3 希尔排序

希尔排序步骤:

  • 先取一个增量d1,按照d1位元素间隔将该组元素分为若干个元素组,进行直接插入排序。
  • 再取一个增量d2<d1,重复上述操作。
  • 直到所取增量d=1。

在这里插入图片描述

6.7.4 直接选择排序

在未排序的元素组内依次选出最小的元素即可。

在这里插入图片描述

6.7.5 堆排序

堆的概念(必须是完全二叉树)

  • 大顶堆:在整个堆中,其孩子结点都比父结点要小。
  • 小顶堆:孩子结点比父结点大。

在这里插入图片描述

初建堆的步骤(大(小)顶堆):

  • 先按顺序构造完全二叉树。
  • 按顺序找出最后一个非叶子结点,看该结点是否大(小)于其孩子结点若小于,找出最大的作为父结点。
  • 再依次找出倒数第二个非叶子结点,按照上步骤。
  • 若调整过程中涉及到多层结构,打破了堆的结构,则需继续调整,直到整个构成堆的条件。

在这里插入图片描述

堆排序的步骤:

  • 将元素初建堆。
  • 取出堆顶元素放入结果序列。
  • 找到最后一个结点,移动到堆顶。
  • 再进行堆的调整,构成大(小)顶堆。
  • 重复以上步骤,直至得出结果。

在这里插入图片描述

6.7.6 冒泡排序

在这里插入图片描述

6.7.7 快速排序

利用了分治法和递归。

  • 首先确定一个基准,可以为第一个元素,在将指针指向最后一个元素,与基准比较大小,根据规定的顺序进行交换位置。
  • 交换完位置后,将指针移到其相邻且未比较的元素再次进行比较。
  • 到最后基准会将整个部分分为前后两个部分,两个部分再分别按照这样的重复。直至得出结果序列。

在这里插入图片描述

6.7.8 归并排序

在这里插入图片描述

6.7.9 基数排序

借助关键字来拆分排序,例如下将数按照个位,十位来分解。

在这里插入图片描述

6.8 排序算法的复杂度

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1069832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink学习笔记(二):Flink内存模型

文章目录 1、配置总内存2、JobManager 内存模型3、TaskManager 内存模型4、图形化展示5、实际案例计算内存分配 1、配置总内存 Flink JVM 进程的进程总内存&#xff08;Total Process Memory&#xff09;包含了由 Flink 应用使用的内存&#xff08;Flink 总内存&#xff09;以…

如何把pdf转换成word?4个简单方法效果好

如何把pdf转换成word&#xff1f;大家对于pdf和word两种电脑文件都不陌生吧&#xff0c;毕竟我们平时几乎每天都会使用到它们。将PDF转换为Word文档的一个主要原因是为了方便编辑和修改文档&#xff0c;尽管PDF是一个非常流行的电子文档格式&#xff0c;但如果想要编辑或修改其…

Java数组:没错,不装了我就是书架。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数组的概念1、什么是数组&#xff1f;2、数组的创建3、数组的初始化Ⅰ、动态初始化Ⅱ、静态初始化 二、数组的使用1、数组中…

OLED透明拼接屏的完美融合,唐山的历史遗迹与现代科技

引言&#xff1a;作为河北省的一个重要城市&#xff0c;唐山以其丰富的历史文化和独特的自然风光吸引着众多游客。 近年来&#xff0c;随着科技的不断进步&#xff0c;OLED透明拼接屏的应用为唐山增添了一道新的城市风景线。 作为一名资深工程师&#xff0c;我将介绍唐山的历…

kafka的请求处理机制

目录 前言&#xff1a; kafak是如何处理请求的&#xff1f; 控制请求与数据类请求 参考资料 前言&#xff1a; 无论是 Kafka 客户端还是 Broker 端&#xff0c;它们之间的交互都是通过“请求 / 响应”的方式完成的。比如&#xff0c;客户端会通过网络发送消息生产请求给 B…

Linux 守护进程

一 何为守护进程 守护进程&#xff08; Daemon &#xff09;也称为精灵进程&#xff0c;是运行在后台的一种特殊进程&#xff0c;它独立于控制终端并且周期性 地执行某种任务或等待处理某些事情的发生&#xff0c;主要表现为以下两个特点&#xff1a; 长期运行。守护进程是一…

【DRAM存储器十二】SDRAM介绍-各类写操作详解

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光SDRAM数据手册》、《PC SDRAM specification》 目录 写操…

【ElasticSearch】基于Docker 部署 ElasticSearch 和 Kibana,使用 Kibana 操作索引库,以及实现对文档的增删改查

文章目录 前言一、使用 Docker 部署 ElasticSearch 和 Kibana1.1 部署 ElasticSearch1.2 部署 Kibana1.3 利用 Kibana 演示 Elasticsearch 分词效果 二、解决中文分词的问题2.1 默认分词器对中文分词的问题2.2 引入 IK 分词器2.3 IK 分词器的两种分词模式2.4 IK 分词器存在的问…

HTTP爬虫IP:流量or数量计费模式那个更适合爬虫?

在使用HTTP爬虫IP时&#xff0c;我们常常需要考虑计费方式&#xff1a;按流量计费还是按数量计费。这两种计费方式各有优势&#xff0c;但是哪种更加划算呢&#xff1f;本文将为您深入探讨HTTP爬虫IP的流量计费和数量计费的特点、适用场景以及选择适合自己的计费方式的实用技巧…

MySQL学习笔记(快速入门)

一、数据库相关概念 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Management System (DBMS)SQL操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数…

[PyTorch][chapter 57][WGAN-GP 代码实现]

前言&#xff1a; 下图为WGAN 的效果图&#xff1a; 绿色为真实数据的分布&#xff1a; 8个高斯分布 红色&#xff1a; 为随机产生的数据分布&#xff0c;跟真实分布基本一致 WGAN-GP&#xff1a; 1 判别器D: 最后一层去掉sigmoid 2 生成器G 和判别器D: loss不取log 3 损失函数…

Spring AOP 详解及@Trasactional

Spring AOP 详解 AOP基础 AOP: Aspect Oriented Program, 面向切面编程。解耦&#xff08;组织结构调整&#xff09;、增强&#xff08;扩展&#xff09;。 AOP术语 术语 说明 Aspect&#xff08;切面&#xff09; 横切于系统的连接点实现特定功能的类 JoinPoint&#xf…

Axios、SASS学习笔记

目录 前言 一、Axios基础认识 1、简介 2、相关文档 3、基本配置 4、基础快捷使用 二、Axios封装 1、公共配置文件 2、细化每个接口的配置 3、使用并发送请求 三、SASS 1、简介 2、相关文档 3、使用前奏 4、使用变量 5、嵌套规则 6、父级选择器标识 & 前言…

小谈设计模式(10)—原型模式

小谈设计模式&#xff08;10&#xff09;—原型模式 专栏介绍专栏地址专栏介绍 原型模式角色分类抽象原型&#xff08;Prototype&#xff09;具体原型&#xff08;Concrete Prototype&#xff09;客户端&#xff08;Client&#xff09;原型管理器&#xff08;Prototype Manager…

《C++ Primer》第4章 表达式(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 4.6 成员访问运算符&#xff08;P133&#xff09; 点运算符和箭头运算符都可用于访问成员&#xff0c;ptr->mem 等价于 (*ptr).mem 。箭头作用于指针类型对象&#xff0c;结果为左值&#xff1b;点运算符…

【Mysql】 blob 转text

有个数据表字段存储的字段类型是blob&#xff0c;想查看字段内容。 blob是二进制的无法直接查看怎么办&#xff1f; 写sql&#xff0c;blob 转text SELECT CONVERT(content USING utf8) FROM article_content ; 我想把原来content字段完全转成text 新建 text 类型字段conten…

uniapp 在uni.scss 根据@mixin定义方法 、通过@include全局使用

在官方文档中提及到uni.scss中变量的使用&#xff0c;而我想定义方法&#xff0c;这样写css样式更方便 一、官方文档的介绍 根据官方文档我知道&#xff0c;在这面定义的变量全局都可使用。接下来我要在这里定义方法。 二、在uni.scss文件中定义方法 我在uni.scss文件中定义了…

三、浏览器缓存动如何使用(Expires、 cache-control、Etag、last-modified)----哪些文件需要强缓存,哪些文件需要协商缓存

参考链接1&#xff1a;彻底弄懂强缓存与协商缓存 参考链接2&#xff1a;浏览器缓存 参考链接3&#xff1a;扼杀 304&#xff0c;Cache-Control: immutable 如何搭建 express&#xff0c;或者node服务 ### 如何搭建 express&#xff0c;npm install express --save### expre…

[C++基础]-多态

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 本期学习目标&am…

智能AI系统源码ChatGPT系统源码+详细搭建部署教程+AI绘画系统+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…