数据结构和算法设计复习笔记

为了面试需要复习数据结构和算法设计,没时间刷题了,这里只简单复习一下概念。

数据结构

1.数组

数组是紧凑的连续的存储
访问:能通过索引快速访问
遍历:按索引遍历
扩容:需要重新分配空间再将原数组拷贝过去
插入删除:数据插入或删除需要搬移后面的数据
内存占用:较小
在这里插入图片描述

2.链表

链表每一个单节点包含指针和数据,其中指针指向下一个元素位置。
访问:必须从头查找
遍历:必须从头开始遍历
扩容:直接加入节点即可
插入删除:移动指针即可
内存占用:需要保存数据和指针,较数组内存占用大。
在这里插入图片描述

3.栈

栈是单边进出,也即后进先出,常用于重要数据现场保护、递归。
在这里插入图片描述

4.队列

数据双边进出,一边只进不出,另一边只出不进,所以先进先出。常用于多线程中任务管理。
在这里插入图片描述

5.树

实际中常使用二叉树。如下图为一个二叉树,二叉树的特点是:
1)每个节点最多有2个子节点,
2)左右子树都有顺序
在这里插入图片描述

6.堆

堆是特殊的树,根节点是最小或者最大值。
二叉树:常用递归方式遍历

7.散列表

在这里插入图片描述
也称哈希表,根据关键码和值进行访问的数据结构。key通过哈希函数转为一个整型数字,将数字对数组长度取余作为数组下标,value保存在该数字为下标的数组空间里。

8.图

在这里插入图片描述
图比较复杂,后续有时间补。。。

1)DFS

2)BFS

算法设计

算法里考的比较多就是贪心和动态规划,还有很多其他的我没怎么复习,以后再做更新。。。

1.贪心算法

把复杂的问题分为一步步简单的问题寻求局部最优解。
能否使用贪心算法,主要看能不能找到反例,也即是局部最优解不一定是全局最优解。
举一个例子:
【例1】假设有一堆纸币,分别为5元、2元、1元,用最少的纸币凑10元。
【解释】在这个情况下可以用贪心。先尽可能多的取5元,再尽可能多的取2元,最后补1元。
【例2】假设有一堆纸币,分别为5元、4元、1元,用最少的纸币凑8元。
【解释】假如使用贪心算法,先尽可能多的取5元,变成1张5元+3元,只能使用1元填补。也即是1张5元+3张1元,共4张。
但是实际上,可以使用2张4元来凑。这个情况下就不能用贪心。(可以用动态规划做)

2.动态规划

动态规划的本质就是遍历所有答案,找到状态转移方程和初始值。比如上面的那个【例2】,用动态规划的思路就是:
假设f(x) 的含义是,要凑x元最少用的纸币数,
其中初值需要设置,f(0)=0,f(1)=1,f(4)=1,f(5)=1,初此之外其他暂时定为正无穷大。

f(0) = 0
f(1) = 1
f(2) = f(1)+f(1) = 2
f(3) = f(2)+f(1) = 3
f(4) = min(f(3)+f(1),f(2)+f(2),f(4)) = 1
f(5) = min(f(4)+f(1),f(3)+f(2),f(5)) = 1
f(6) = min(f(5)+f(1),f(4)+f(2),f(3)+f(3)) = 2
f(7) = min(f(6)+f(1),f(5)+f(2),f(4)+f(3)) = 3
f(8) = min(f(7)+f(1),f(6)+f(2),f(5)+f(3),f(4)+f(4)) = 2

状态转移方程 dp[x] = min(dp[i]+dp[x-i],dp[x])
动态规划还有很经典的背包问题,这里不详说了。

3.二分查找

4.排序

在这里插入图片描述

1)冒泡排序

2)快速排序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值