大O表示法


常数阶,他的次数不会随着n的变大而变长



抓大头 取次方最大的

时间复杂度

没有循环 没有递归没有跟n相关的东西,那么他的复杂度就是o(1)

为什么i=i*2那里会加1阿?
因为需要加一次才能跳出循环1 2 4 8
中间加二是为了判断



循环的判断普遍比循环体多一个所以圈2的地方n+1



空间复杂度

看定义了几个空间。上图z再多跟n也没关系所以是o(1)







i和j两个才完成一个o(n)的复杂度,完成代码的交换
这里没开辟新空间 只是定义了两个变量 所以是常数级别 O(1)

渐进符号

之前的是时间复杂度假设是f(n)转成o()这个记号,肯定比原来的大。


渐进上界的括号内要大于等于等式左边的计算结果,渐进下界的括号内要小于等于等式左边的计算结果,渐进紧致界括号内的只能等于等式左边的计算结果

渐进紧致阶只要上面有一个错的就都是错的
说白了就是,看见第一个符号,结果就要大于等于他,第二个就是结果小于等于,第三个就只能等于
递归式时间,空间复杂度




递归时间复杂度o(n)

n/2 等于1的时候就是调用结束的时候。除多少个2的x方




o(n方)

递归式主方法













线性结构和线性表定义

线性表的顺序存储结构





圈起来的是挪动后的式子

首相加未向乘以项数除以2

顺序表的实现

https://www.bilibili.com/video/BV1f44y1A7rx?p=16&spm_id_from=pageDriver&vd_source=6092f2dd634d869c97e5d08dde6f3844
插入实现转载b站观看到36分钟
顺序表插入时间复杂度

顺序表删除时间复杂度


删除n分支1的元素 删除第一个就是移动n-1,最后一个移动0个
顺序表查找时间复杂度

查找最好的情况是找到了最坏的情况是找不到都是一句话所以复杂度为o(1)
顺序表缺陷

后面有足够的空间才能原地扩容,如果后面的空间不够就回去随机找一个地址扩容,这样代价很大

线性表的链式存储

线性表:多开了一个空间 用于存储额外的信息
第一个没有前驱,最后一个没有后继
线性表链式存储代码
https://www.bilibili.com/video/BV1f44y1A7rx?p=24&vd_source=6092f2dd634d869c97e5d08dde6f3844 从16分钟开始
不带头结点的是指针指向空NULL,带头结点第一个节点不存储数据,只存储地址,就框框左边是空右边是下一个的地址
指针不初始化默认为空




带头结点的单链表插入(无特殊情况可直接用)

像插入一个节点在第二个位置



以上代码是在第二个数字前插入,如果想在之后插入可以让k+1
不带头结点的单链表插入
不带头结点所以找不到第零个节点,下面循环可以解决

单链表插入时间复杂度

带头结点和不带的单链表删除

带头结点

不带,删除的位序k>1没有问题,k=1的话就有问题了
单链表删除时间复杂度

单链表查找时间复杂度

循环单链表

最后尾节点不会指向空,会指向头结点 直接链起来
双链表

双链表就是比单链表多了一个指针域 指向前一个节点 就可以实现某节点都可以找到自身的上一个节点和下一个节点





插入操作并无循环


删除需要循环所以是o(n)
栈的顺序存储(先进先出)
栈的典型应用:递归

栈的链式存储




队列的顺序存储和循环队列
相当于日常生活中的排队
final全局常量
- 入队队尾指针(rear)要加加*


队列的链式存储和双端队列(了解即可 )




这种题可以自己模拟一个循环队列




这题目的意思就是这个队列在进元素的时候 可以在头和尾进 出只能在头出
栈与队列例题
入栈出栈后立马进入队列
队列出队和入队序列一样同时也是出栈序列

c确定后就不需要扩容,所以顺序存储效率更高

串(线性结构)




字串就是可以拆开另算的
空串是任意串的子串
串的模式匹配与朴素模式匹配(带时间复杂度 )
串有主串和模式串
从主串中找到一个和模式串相等的字串匹配成功返回指向 子串的起始位置,匹配失败如果从1开始返回0从0开始返回-1


手算next数组值(kmp)

这个就是算next值中最长值再加1



背公式
一维数组


二维数组

i行j列

数组计算公式及特性


方法二套公式

对称矩阵
二维数组就是一个矩阵
二维数组压缩在一个一维数组里



转化为一维数组
**等差数列求和的公式 **

从1开始的1区别就是让每个i和j都减去1 如上公式
i<=j是下三角
三对角矩阵(公式)

只存储中间元素可以不用存储两边的元素、

二维数组转一维,看他前面有几个元素

稀疏矩阵(三元组表和十字链表)
表这么大只存储了8个数据 如何压缩?


利用三元组表顺序村粗

十字链表

树形结构与树的定义(递归)

树的基本概念

兄弟就是他们呢几个有共同的父节点他们几个就是兄弟
父节点有几个子节点就是有几个度
度为0是的叶子节点
度不为零的节点为分支节点
树的度为最大节点的度
树的性质1


树的性质2

树的性质3

树的性质4


2.x意思是两行还多


二叉树的定义

二叉树的性质1,2,3

满二叉树与完全二叉树

二叉树的性质4

************
模拟推法
二叉树的顺序存储

完全二叉树适合顺序存储
双亲就是父节点
单支树是除了叶子节点都是1
二叉树链式存储

二叉树先序遍历

**根左右 **
二叉树中序遍历
左 根 右

二叉树的后序遍历
左 右 根

层次遍历

根据遍历序列构造二叉树

先序加中序构造二叉树

后序加中序构造二叉树

最后一个肯定是跟节点,所以后序的bca都是跟节点,找到根节点后再跑到中序里
层序加中序遍历二叉树
层序是从上往下从左往右

题


平衡二叉树



二叉树排序树定义
有序序列是用中序遍历,这句话很重要

二叉排序树构造

一般第一个就是根节点

最优二叉树(哈夫曼树)
权值带权路径


最优二叉树构造




最优二叉树(软考)

**求节点个数 **
这里的n注意是题目给的n值,而不是树的高度
最优二叉树构造规则
构造1233

构造最优二叉树

哈夫曼编码定义
左0右1


哈夫曼编码压缩比
因为3位数的二进制可以表示6个字符,而2位只能表示4个,而这里有abcde5个字符




完全二叉树第一层到h-1层必须是满的所以排除a
左右高度之差不为1所以不是平衡二叉树
题



线索二叉树的定义

题

图形结构与图的定义
图可以有多个前驱和多个后继

有向图与无向图

完全图


无向图就是用首相加尾相乘以项数除以2

顶点的度

出度和入度是关于有向图,度就是入度加出度

路径


连通图与强连通图

连通图针对无向图

有向图中必须具有两条路径才满足强连通图


邻接矩阵



邻接表




稠密图与稀疏图
完全图类似稠密图



题

网(看一眼)

在权值里两个顶点没有边的话就用无穷表示
图的遍历

图的深度优先遍历
当前所处的顶点还有邻接的顶点(出边)并且没有被访问过的话那么他就回去访问这些顶点
https://www.bilibili.com/video/BV1jY411b73f/?p=185&spm_id_from=pageDriver&vd_source=6092f2dd634d869c97e5d08dde6f3844

深度优先遍历时间复杂度(背)

广度优先遍历和时间复杂度(队列实现)

深度只要顶点还能访问就会一直访问下去

广度优先是先访问临界点访问完了。 直接写下来
上图就是访问v1得到的

拓扑排序


如果要完成顶点3应该先完成顶点3的直接前驱活动
aov网是个有向无环图


题




















