【labuladong的算法笔记】【Hello算法】
【CSDN博主 刘鑫磊up 数据结构——学习笔记——入门必看【建议收藏】_数据结构笔记-CSDN博客】
算法的本质
程序=数据结构+算法
算法 分两种
数学算法 本质是数学
计算机算法 本质是穷举
数据结构
数据结构:数据元素之间的关系
数据对象(父类)——数据元素(父类具象的实体)——数据项(不可分割的最小单位)(属性)
数据结构(数据的存储方式) 两种分类方式
1、物理结构/存储结构(面向计算机) 分两种
(1)连续/顺序(数组):
(2)分散/链式(链表):
2、逻辑结构(数据对象中数据元素之间的相互关系,面向问题) 分四种
(1)线性结构(一对一):数组(定长的队列)、链表、栈、队列
(2)集合结构(同属一集合外彼此无联系)
(3)树形结构(一对多):树、堆、哈希表
???堆是什么
(4)网状结构(多对多):图
【注】
基于数组、链表均可实现:栈、队列、哈希表、树、堆、图等
只能基于数组可实现:矩阵、张量(维度 ≥3 的数组)等
数据结构的基本操作
遍历+访问(修改)
遍历:线性——for/while 非线性——递归(树)
【注】递归题画递归树
基础数据类型
分两种 原子数据类型+结构数据类型
0、原子数据类型
CPU 可以直接进行运算的类型
如:
- 整数类型
byte
、short
、int
、long
。 - 浮点数类型
float
、double
,用于表示小数。 - 字符类型
char
,用于表示各种语言的字母、标点符号甚至表情符号等。 - 布尔类型
bool
,用于表示“是”与“否”判断。
1、线性表(Linear list)
1.1链表
双指针
{详见 labuladong《双指针技巧秒杀七道链表题目》}
(1)两个指针各领一条链表
多个链表合并
单个链表分解
???双指针技巧秒杀七道链表题目→合并 k 个有序链表
(2)快慢指针(两个指针一前一后作用与同一条链表上,都从前往后)
不知道链表长度n,删除倒数第k个结点
不知道链表长度n,找链表的中点
判断链表是否包含环
???双指针技巧秒杀七道链表题目→两个链表是否相交
1.2数组、 队列(Queue);串、 栈(Stack)
双指针
(1)左右指针
(2)快慢指针
遍历
for/while
排序
二叉树
遍历方式
常见的有四种
前序遍历 根结点 -> 左子树 -> 右子树
中序遍历 左子树 -> 根结点 -> 右子树
后序遍历 从左到右访问叶子结点 -> 根结点
层序遍历 从上而下逐层遍历,每层从左到右
图
遍历方式
常见的有2种
深度优先搜索DFS
广度优先搜索BFS
剪枝
alpha-beta 剪枝算法
算法思想
动态规划
题型:求最值(类比 运筹学最优化问题)
有三要素 重叠子问题 最优子结构 状态转移方程
解法(本质都是穷举):
1°明确不需要计算就能得到的情况
2°明确问题中的各种变量(三种变量 如背包问题 变量1{目标}物品总价值,变量2{限制}背包空余容量,变量3{选择}各种物品数量)
3°明确dp列表定义(难点)
(类比 数学归纳法:假设命题f在x<n-1成立→证明f在x=n时成立→f在任何时候都成立)
dp表写不出来,原因之一可能是dp表定理不合适
4°优化dp表等操作
最长递增子序列→二分查找解法
一些dp表可以→“备忘录”
判断可否使用——一维(新手) 画递归树,若有重复节点,就可以使用“备忘录”
高维(熟练后) 看递归框架,有无重复节点
有一些题目,需要先转换,才能看出使用动态规划思想
回溯→见上文基础数据类型
时间复杂度
递归算法的时间复杂度:子问题个数 * 解决一个子问题需要的时间 即 O(2^n) * ≥O(1)
时间复杂度为指数级别原因:重叠子问题
解决方案:相当一部分可以使用 dp列表
还可以再压缩空间复杂度:如斐波那契数列 dp表只要长度为2即可
吐槽
2024.3.5开始创作
人在武汉念书,半吊子专业,感兴趣学点计算机
每天都是6小时水课2小时杂活,真的服气了
未读完文章