軟件設計師 - 数据结构与算法基础篇

上午 10’ 下午15‘

数据结构

数组与矩阵(★★)

数组

主要考察数组地址的计算

  1. 一维数组 a[n] :a[i]的地址为 a+i*Lenth
  2. 二维数组 a[m][n] : 储存方式分为 按行优先按列优先
稀疏矩阵

考察将上下三角矩阵有效元素存储进一维数组,求元素统一通式

  1. 上三角矩阵
  2. 下三角矩阵
    在这里插入图片描述

线性表(★★★★★)

顺序表 - 数组
链表 - 单/双/循环链表
链表的基本操作 - 插入 & 删除
顺序存储与链式存储的比较

空间 :顺序更优,节省空间
操作 :链式更优增删,数组更优改查

队列与栈

队列是先进先出,栈是先进后出
eg.元素a、b、c按次序入栈,求所有可能的出栈顺序?(没有规定出栈顺序,所以前面的元素可以在后面的元素进去之前出去)
cba,bca,bac,abc,acb 六种

广义表(★★)

  1. 广义表是n个元素组成的有限序列,是线性表的推广
  2. 通常用递归的形式进行定义,记作LS. 其中LS是表名,ai是元素,它可以是表,也可以是数据元素,n是广义表的长度,而递归定义的就是广义表的深度,直观的说就是定义括弧的重数
  3. 表头 :首元素; 表尾 : 除表头外剩余的元素部分
  4. 基本运算 : 取表头head(Ls)和表尾tail(Ls)eg. LS1 = (a, (b, c), (d, e)); head(LS1) = a, tail(LS1) = ((b, c), (d, e));

eg1. 有广义表LS1 = (a, (b, c), (d, e)), 则其长度深度分别为 ? 3 & 2 三个子表,两层括弧
eg2. 有广义表LS1 = (a, (b, c), (d, e)), 要将其中b字母取出,操作步骤为? head(head(tail(LS1)))
tail(LS1) -> ((b, c), (d, e)) -> head -> (b, c) -> head -> b

树与二叉树(★★★★★)

二叉树(binary tree):是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树
在这里插入图片描述

关键词解
  • 节点的度 :节点的分叉数
  • 树的度 :指树中所以结点的度数的最大值。如图为 3
  • 叶子节点 :没有子节点的节点
  • 分支节点 :有入度和出度的节点
  • 内部节点 :非叶子节点
  • 父节点 :有子节点的节点
  • 子节点 :没有子节点的节点
  • 兄弟节点 :同一个父节点的所有子节点
  • 树的层次or深度 :如图,3 层
重要特性

在这里插入图片描述

  • 满二叉树 :所有节点的度都是 2。
  • 完全二叉树 :从左到右,有右节点一定有左节点;而有左节点不一定有右节点
  • 非完全二叉树 :不连续,或者有右节点没有左节点。
二叉树遍历

在这里插入图片描述

  • 前序遍历 :根左右 12457836
  • 中序遍历 :左根右 42758136
  • 后序遍历 :左右根 48752361
  • 层次遍历 :从上往下,从左到右 12345678
反向构造二叉树 - 必须知道中序遍历

eg.有前序遍历 ABHFDECG, 有中序遍历HBEDFAGC,求二叉树。

树转二叉树

将一普通的结构树转化成二叉树
孩子节点 - 划分到左子树
兄弟节点 - 划分到右子树节点

查找二叉树

二叉排序树, 左孩子小于根,右孩子大于根

  1. 节点插入 :
    a. 若插入的数据已经存在,则不允许插入
    b. 若查找二叉树为空树,则以新的节点为查找二叉树
    c. 将要插入的值与插入后父节点的键值作比较,就能确定左右
  2. 节点删除 :
    a. 若节点是叶子节点,则直接删除
    b. 若待删除节点只有一个子节点,则将这个节点替换成该子节点
    c. 若待删除节点p有两个子节点,则在其左子树中寻找最大的节点s,用s的值代替p的值,若节点s也有子节点,则规则循环。
最优二叉树 - 哈夫曼树

考查 带权路径长度 哈夫曼树的构造

:编码。 权值越高,访问频率越高
树的路径长度 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
带权路径长度 :节点权值*路径长度
树的带权路径长度 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL
编码规则 :左路径为0, 右路径为1

哈夫曼树的构造规则 : 假设有n个权值,则构造出的哈夫曼树有n个叶子结点, 哈夫曼树并不唯一,但带权路径长度一定是相同的
参考一篇别人的总结哈夫曼树的构造

线索二叉树

概念 :在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。即在每个节点里面加入连接的前后节点信息

平衡二叉树

任意节点的左右子树深度差不超过 1

图(★★)

  1. 完全图 :在无向图中,每一个顶点之间都有一条边相连,称为完全图; 在有向图中,每一个顶点之间都有二条有向边相连,称为完全图
  2. 邻接矩阵 :。。。
  3. 邻接表 :。。。
  4. 图的遍历 :深度优先 / 广度优先
  5. 拓扑排序
  6. 图的最小生成树

算法

  1. 分治法 :分解 -> 解决 -> 合并 一般用遞歸的方式解決
    經典問題 :斐波那契數列 歸并排序 快速排序 矩陣乘法 二分查找 大整數乘法 漢諾塔

  2. 回溯法 :试探 (迷宫问题) 系統的搜索一個問題的所有解或任意解
    經典問題 :N皇后問題 迷宮 背包問題

  3. 贪心法 :在当前总是最优选择,一般可以快速得到一个部分最优的解,但不是全局最优解
    經典問題 :背包問題 多機調度 找零錢問題

  4. 动态规划法 :分解 -> 找到全局最优解 劃分子問題,將子問題的結果用數組存儲,利用查詢子問題結果構造最終問題結果。
    經典問題 :斐波那契數列 矩陣乘法 背包問題 LCS最長公共子序列問題

排序与查找(★★★★★)

補。。。。

时间复杂度与空间复杂度(★★★★★)

O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n)

  1. O(1) : 常數級
  2. O(log2n) :樹型
  3. O(n) :一重循環
  4. O(nlog2n) :重構堆
  5. O(n2) :雙重循環
  6. O(n3) :三重循環
  7. O(2n) :

算法基础以及常见算法(★★★★★)

補。。。。(每年考題都不一樣)
在这里插入图片描述
算法时间复杂度比较 :
在这里插入图片描述
具体实现各不相同

a.快速排序 :不稳定,相等值会对排序产生波动
选择无序数组中的任意一个位置值作为key,分别从左右端点位置开始,将小等于key的值放在key左边,将大等于key的值放在key右边,采用递归,直到所有的区间数都比较完毕。
b.冒泡排序
可以自己选择升序或者降序,逐一比较, 每一轮遍历都产生一个最大值或者最小值
c.插入排序 : 适用元素较少的序列,最好是有序数列
从第一个基数开始,将当前元素与已经遍历过的元素数组进行比较插入,直到所有元素遍历完成。
d.归并排序
将相邻两元素两两组成数组,组内排序,再将两两数组进行排序。
e.选择排序
将当前元素和剩余待排序元素组内的最小/大元素进行交换。
f.希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
g.堆排序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值