软件设计师学习笔记-数据结构

前言

备战2023年5月份的软件设计师考试,在此记录学习之路。
知识点总结,具体内容请查看对应的模块。

提示:这里有软件设计师资料,包含软件设计师考试大纲、软件设计师第五版官方教程、历年考试真题。

通过百度网盘分享的文件:软件设计师
链接: https://pan.baidu.com/s/1M6ZKuBJo9DEvdmLgbgDGvg?pwd=1024
提取码:1024
复制这段内容打开「百度网盘APP 即可获取」

系列文章目录

第一章 计算机系统基础知识
第二章 程序设计语言基础知识
第三章-数据结构


文章目录

  • 前言
  • 系列文章目录
  • 第3章 数据结构
    • 3.1 时间复杂度
    • 3.2 空间复杂度
    • 3.3 递归中的复杂度
    • 3.4 线性结构
      • 3.4.1 线性表
        • 3.4.1.1 线性表的顺序存储
        • 3.4.1.2 线性表的链式存储
      • 3.4.2 栈和队列
      • 3.4.3 串
        • 串的模式匹配
    • 3.5 数组、矩阵、广义表
      • 3.5.1 数组
      • 3.5.2 矩阵
    • 3.6 树
      • 3.6.1 树的定义
      • 3.6.2 树的基本概念
      • 3.6.3 树的性质
      • 3.6.4 二叉树
      • 3.6.5 二叉树的性质
      • 3.6.6 满二叉树、完全二叉树
      • 3.6.7 二叉树的存储结构
      • 3.6.8 二叉树遍历
      • 3.6.9 平衡二叉树
      • 3.6.10 二叉排序树
      • 3.6.11 最优二叉树(哈夫曼树)
      • 3.6.12 哈夫曼编码
      • 3.6.13 线索二叉树(了解即可)
    • 3.7 图
      • 3.7.1 图的定义
      • 3.7.2 图的存储
      • 3.7.3 图的遍历
        • 3.7.3.1 深度优先遍历
        • 3.7.3.2 广度优先搜索
    • 3.8 拓扑排序
    • 3.9 排序
      • 3.9.1 排序的概念
      • 3.9.2 顺序查找
      • 3.9.3 折半查找(二分查找)
      • 3.9.4 哈希函数
      • 3.9.5 小顶堆和大顶堆
    • 3.10 排序算法
      • 3.10.1 排序的基本该概念
      • 3.10.2 直接插入排序
      • 3.10.3 希尔排序
      • 3.10.4 简单选择排序
      • 3.10.5 堆排序
      • 3.10.6 快速排序
      • 3.10.7 归并排序


第3章 数据结构

3.1 时间复杂度

算法时间复杂度以算法中基本操作重复执行的次数(简称为频度〉作为算法的时间度量。一般不必要精确计算出算法的时间复杂度,只要大致计算出相应的数量级即可,如O(1)、O(logon)、O(n)或O(n2)等。
软件设计师学习笔记-数据结构_第1张图片
计算规则

加法规则:多项相加,保留最高阶项,并将系数化为1
乘法规则:多项相乘都保留,并将系数化为1
加法乘法混合规则:先小括号再乘法规则最后加法规则

时间复杂度估算看最内层循环,如若没有循环和递归则为O(1)

3.2 空间复杂度

空间开销(内存开销)与问题规模n之间的关系。

简单的说就是程序运行所需要的空间。

3.3 递归中的复杂度

  • 当每次递归的时间复杂度不变的情况下:递归复杂度 = 每次递归复杂度 * 递归次数

用主方法求复杂度:
软件设计师学习笔记-数据结构_第2张图片

3.4 线性结构

在这里插入图片描述

3.4.1 线性表

软件设计师学习笔记-数据结构_第3张图片
线性表的存储结构分为顺序存储和线性存储。

3.4.1.1 线性表的顺序存储

顺序存储是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使逻辑上相邻的两个元素物理上也相邻。
优点是:可以随机存取表中的元素。
缺点是:插入和删除操作需要移动元素。

在表长为n,即有n个元素的线性表中,等概率下插入元素需要移动的元素个数期望值是n/2,删除元素需要移动的元素个数期望值是(n-1)/2

插入删除平均时间复杂度为O(n),查询平均时间复杂度O(1)

3.4.1.2 线性表的链式存储

软件设计师学习笔记-数据结构_第4张图片

存储各数据的节点的地址并不要求是连续的,因此存储数据元素的同时必须存储元素之间的逻辑关系。
节点空间只有在需要的时候才申请,无需事先分配。

软件设计师学习笔记-数据结构_第5张图片
插入删除查询平均时间复杂度为O(n)

3.4.2 栈和队列

软件设计师学习笔记-数据结构_第6张图片在这里插入图片描述

如果用单链表作为栈的存储结构,并用头指针作为栈顶指针,则入栈和出栈都不需要遍历链表。
栈适用于函数的递归调用。

软件设计师学习笔记-数据结构_第7张图片
采用循环队列的有点是,入队和出队都不需要移动队列中的其它元素。
队列的链式存储入队和出队不需要遍历整个队列。

3.4.3 串

串是一种特殊的线性表,其数据元素为字符。由字符构成的有限序列。
空串:长度为零的串。
空格串:有一个或者多个空格构成。
串相等:两个串长度相等,字符也相同。
串比较:比较ASCII码,从第一个字符开始比较。

串的模式匹配

1、朴素的模式匹配算法。
n父串m子串,算法的时间复杂度:最好:O(M),最坏:O(nm),平均:O(n+m)
最坏匹配次数为:(n-m+1)*m
2、改进的模式匹配算法(kmp算法)
串的前缀:包含第一个字符并且不包含最后一个字符的子串
串的后缀:包含最后一个字符并且不包含第一个字符的子串
第i个字符的next值= 从1 ~ i - 1串中最长相等前后缀子串的长度+1
特殊情况: next[1] = 0

3.5 数组、矩阵、广义表

3.5.1 数组

数组是定长线性表在维数上的扩展。
软件设计师学习笔记-数据结构_第8张图片
已知首地址,计算地址公式:
软件设计师学习笔记-数据结构_第9张图片

3.5.2 矩阵

特殊的矩阵:对称矩阵、三对角矩阵、稀疏矩阵。
对称矩阵
在这里插入图片描述

稀疏矩阵的三元组表的顺序存储结构称为三元组顺序表,常用的三元组表的链式存储结构是十字链表。

3.6 树

树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有0个或多个直接后继元素。

3.6.1 树的定义

软件设计师学习笔记-数据结构_第10张图片

3.6.2 树的基本概念

软件设计师学习笔记-数据结构_第11张图片
树的度:取树中所有节点中最大的度。

3.6.3 树的性质

性质1:树中的结点总数等于树中所有结点的度数之和加1。
在这里插入图片描述
软件设计师学习笔记-数据结构_第12张图片

3.6.4 二叉树

软件设计师学习笔记-数据结构_第13张图片

3.6.5 二叉树的性质

软件设计师学习笔记-数据结构_第14张图片

3.6.6 满二叉树、完全二叉树

软件设计师学习笔记-数据结构_第15张图片

软件设计师学习笔记-数据结构_第16张图片
3个节点的有5中形态,4各节点有14中形态,5个节点有42中形态。

3.6.7 二叉树的存储结构

软件设计师学习笔记-数据结构_第17张图片
二叉树的二叉链式存储中,n个节点有n+1个空指针域。
二叉树的三叉链式存储中,n个节点有n+2个空指针域。

3.6.8 二叉树遍历

软件设计师学习笔记-数据结构_第18张图片
软件设计师学习笔记-数据结构_第19张图片
软件设计师学习笔记-数据结构_第20张图片
软件设计师学习笔记-数据结构_第21张图片

3.6.9 平衡二叉树

在这里插入图片描述
完全二叉树一定是平衡二叉树,平衡二叉树不一定是完全二叉树。

3.6.10 二叉排序树

也叫二叉检索树
软件设计师学习笔记-数据结构_第22张图片

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

软件设计师学习笔记-数据结构_第23张图片
最优二叉树构造:
软件设计师学习笔记-数据结构_第24张图片
构造规则总结:
1、从前往后找权值最小的两个数。
2、小的放左边,大的放右边
3、构造的子树放末尾。
4、权值相同,从左往右。

3.6.12 哈夫曼编码

软件设计师学习笔记-数据结构_第25张图片
哈夫曼编码采用贪心策略。

3.6.13 线索二叉树(了解即可)

主要是存储方式的改变。
软件设计师学习笔记-数据结构_第26张图片

3.7 图

软件设计师学习笔记-数据结构_第27张图片

3.7.1 图的定义

软件设计师学习笔记-数据结构_第28张图片
软件设计师学习笔记-数据结构_第29张图片
软件设计师学习笔记-数据结构_第30张图片
软件设计师学习笔记-数据结构_第31张图片
软件设计师学习笔记-数据结构_第32张图片

3.7.2 图的存储

软件设计师学习笔记-数据结构_第33张图片
软件设计师学习笔记-数据结构_第34张图片
软件设计师学习笔记-数据结构_第35张图片

邻接矩阵适合存储稠密图,边数比较多。
邻接链表适合存储稀疏图,边数比较少

了解下网。
软件设计师学习笔记-数据结构_第36张图片

3.7.3 图的遍历

软件设计师学习笔记-数据结构_第37张图片

3.7.3.1 深度优先遍历

软件设计师学习笔记-数据结构_第38张图片
时间复杂度:
软件设计师学习笔记-数据结构_第39张图片

3.7.3.2 广度优先搜索

软件设计师学习笔记-数据结构_第40张图片
在这里插入图片描述

3.8 拓扑排序

有向无环图
软件设计师学习笔记-数据结构_第41张图片
软件设计师学习笔记-数据结构_第42张图片
在有向无环图G的拓扑序列中,顶点vi在vj之前,则:
可能存在弧,一定不存在弧
可能存在vi到vj的路径,一定不存在vj到vi的路径

3.9 排序

3.9.1 排序的概念

静态查找:顺序查找、折半查找(二分查找)、分块查找
动态查找:二叉排序树、平衡二叉树、B_树、哈希表
软件设计师学习笔记-数据结构_第43张图片

3.9.2 顺序查找

软件设计师学习笔记-数据结构_第44张图片

3.9.3 折半查找(二分查找)

折半查找只适合顺序存储。必须是有序的。
软件设计师学习笔记-数据结构_第45张图片

最多比较次数为:log2[^n]+1

软件设计师学习笔记-数据结构_第46张图片

软件设计师学习笔记-数据结构_第47张图片

3.9.4 哈希函数

软件设计师学习笔记-数据结构_第48张图片
软件设计师学习笔记-数据结构_第49张图片软件设计师学习笔记-数据结构_第50张图片

软件设计师学习笔记-数据结构_第51张图片

3.9.5 小顶堆和大顶堆

软件设计师学习笔记-数据结构_第52张图片

3.10 排序算法

3.10.1 排序的基本该概念

软件设计师学习笔记-数据结构_第53张图片
软件设计师学习笔记-数据结构_第54张图片
上图有错误,快速排序空间复杂度为:
软件设计师学习笔记-数据结构_第55张图片
可以归位的算法:冒泡、简单选择、堆排序、快速排序

3.10.2 直接插入排序

软件设计师学习笔记-数据结构_第56张图片

3.10.3 希尔排序

软件设计师学习笔记-数据结构_第57张图片

3.10.4 简单选择排序

软件设计师学习笔记-数据结构_第58张图片

3.10.5 堆排序

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

3.10.6 快速排序

软件设计师学习笔记-数据结构_第59张图片
当基准元素为最后一个元素时,要从前往后开始找。

3.10.7 归并排序

软件设计师学习笔记-数据结构_第60张图片
软件设计师学习笔记-数据结构_第61张图片

本章到此结束。

你可能感兴趣的:(软件设计师,数据结构,学习,算法)