数据结构笔记《1》

解决问题的方法的效率,跟数据的组织方式有关
在这里插入图片描述
在这里插入图片描述
多项式计算,由于运行时间过于小,系统捕捉不到区别。
解决办法:
重复多次,比如跑一万次,然后再计算平均时间。
在这里插入图片描述

抽象:描述数据类型的方法不依赖于具体实现
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
求和公式
在这里插入图片描述

时间复杂度:求多项式的值,机器运算加减法的速度要比运算乘除法的速度快很多
第一个子程序:pow(x,i)要做(i-1)次乘法,再加上a[i]相乘,共做i次乘法。由于i是从1一直到n的,所以这个子程序一共要做(1+2+3+…+n)次乘法。
第二个子程序:每一次循环里面只做1次乘法。所以子程序一共做n次乘法。
总结:当n很大时,n²是很大的,所以第二个程序跑得比第一个程序快得多。
在这里插入图片描述
在这里插入图片描述
上界和下界。
最好的情况是,上界和下界贴近真实的情况:最小的上界和最大的下界。
在这里插入图片描述
在这里插入图片描述
在写程序时,能不能把程序从n²形式降成n·logn的形式
在这里插入图片描述
在这里插入图片描述
1.时间复杂度:同级的算法是相加的,嵌套的算法是相乘的
2.关于n的K阶多项式,时间复杂度取决于n^K,最大这一项。
3.for循环时间复杂度=循环次数 X 循环体代码复杂度
4.if-else结构复杂度 = 总体复杂度中最大的一项

应用实例:最大子列和问题
在这里插入图片描述
分而治之
在这里插入图片描述两个复杂度相加时,取的是比较大的那一项。

在线处理算法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Term与Head的区别只在中间部分,可以用Union来连接,形成一个统一的结构。

在这里插入图片描述
6/2=3 3-3=0 0 4*2=8 0+8=8
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
堆栈指针top只能指向链表的头,若指向链表尾部,没有前一个节点,无法进行删除操作
在这里插入图片描述

free使用前提:为了释放要删除的节点,要先给这个节点赋值一个变量。
在这里插入图片描述
在这里插入图片描述

优先级最低的被压入栈底
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(5+1)%6=0 从而实现循环队列
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
P1、P2指针代表系数,指数相同则相加,不同则移动,直到相同时相加
在这里插入图片描述
在这里插入图片描述
Polynomial 是指针,*pRear是指针的指针
*pRear指向链表尾部节点,P是新的节点
在这里插入图片描述
相加和相乘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Rear初值
1.为NULL时,在Attach函数中处理,若为NULL,则申请一个新的空间。
2.Rear一开始就指向一个空节点,所有后面的内容都插在空节点后面。先申请一个空间,代码可移植性强,是简单便捷的处理方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三个while循环:
1.第一个while循环表示:当t1和t2都不为空时,比较当前t1、t2的指数大小。
相等则系数相加;若t1>t2,t1的指数拷贝到rear后面。
2.第二个while循环表示:t1和t2中不空的项式接到rear后面
在这里插入图片描述

先申请一个空间
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
Rear=P;
Attach函数,系数相乘,指数相加,把结果加到Rear后面,然后t2指向下一项:
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2=t2->link;
在这里插入图片描述
逐项插入总体框架
在这里插入图片描述
第一部分:先用P1的第1项,乘以P2的每一项,得到P
在这里插入图片描述
第二部分:相乘完之后怎么插入进去
在这里插入图片描述

1.若下一个节点的指数大于e,则继续搜索下一个节点:Rear=Rear->link
2.若下一个节点的指数等于e,则指数相同,系数相加:系数相加完后判断是否等于0,若相加完等于0,则要删除这个节点
3.若下一个节点的指数小于e,相当于找到了可以插的空位,就要申请一个新的节点,把c、e赋给这个节点,并把这个节点插进去
在这里插入图片描述
第三部分:删除一开始构造的空节点
在这里插入图片描述
多项式的输出
可以看成,"空格 系数 指数"的形式,只有第一项没有空格,用Flag=0来表示第一项不输出空格,后面Flag=1表示每项都输出"空格 系数 指数"的形式。
在这里插入图片描述

查找
静态查找:集合中记录是固定的,没有插入和删除操作,只有查找
动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除

通过i来判断是否找到,若i=0则没找到,若i!=0则找到了。
第0的元素K起哨兵的作用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.查找次数=该结点所在层数
2.n个结点的树的深度为 lon2n+1
3.平均查找次数:结点个数所在层数=44+43+22+1
在这里插入图片描述

A是"根"
(b)子树TA1的"根"是B
G也是子树,它的"根"就是G
在这里插入图片描述

在这里插入图片描述

1.A结点,度=3;F结点,度=0;G结点,度=1
2.A是B的父结点,B是A的子结点
3.F和G是兄弟结点
4.叶结点:度=0。比如F、L、H、M、J、K
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
完全二叉树:属于图中完美二叉树的MNO缺失时的情况。
在这里插入图片描述
在这里插入图片描述
n0=n2+1
证明:
往上看,每个结点只有一条边,除了"根"A往下看,有分别0、1、2条边的结点
n0+n1+n2-1
0n0+1n1+2*n2
1.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

层序遍历:
队列实现:
从根结点开始,将根结点A入队,执行循环:
A结点出队,该结点左右儿子BC入队;
B结点出队,该结点左右儿子DF入队;
在这里插入图片描述

平衡二叉树
定义:对任一结点,左右子树高度差绝对值不超过1
结论:给定结点数为N的平衡二叉树的最大高度为O(log2N)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

平衡二叉树的调整
①RR旋转:右子树部分进行旋转
②LL旋转:左子树部分进行旋转
③LR旋转:破坏者在被破坏者的左子树的右子树上。选 关联的三个结点的中间值结点作为根结点。
④RL旋转:破坏者Feb在被破坏者Aug的右子树Jan的左子树Dec上。
注意:插入元素不影响AVL树,但平衡因子需要变动
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Jan在May的左子树Aug的右子树Mar上。LR旋转
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

不同的序列能否形成一个相同的二叉树
①分别建两颗搜索树
②以开始相同的数为根,比较它左右部分和另一个序列是否相同
③建立一棵树,再判别。1.搜索树表示 2.建立搜索树 3.判别序列是否与搜索树一致
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
00100是头结点位置,6是结点总数,4是需要逆转的结点个数
00000是结点的地址,4是结点的元素,99999是指针(指向的是下一个结点存放的位置)
在这里插入图片描述
单链表的逆转
①链表前面加一个空的头结点,方便后续操作
②new指向1(已经逆转好的链表头结点的位置),old指向2(当前还未完成逆转的老链表的头结点),
tmp指向3(防止后面部分丢失)。循环:old指向new,三个指针分别向前位移。

(1)《定义》:head指针指向空的头结点,new=head->next;old=new->next;
(2)《逆转》:old->next=new;
(3)《移动指针》:tmp=old->next;new=old;old=tmp;
(4)《1指向5》:head->next->next=old
(5)《空的头结点指向4》:return new
在这里插入图片描述
测试数据:(K是需要反转的个数)
①部分反转,尾巴不反转
②地址取到上下界(00000~99999)
③元素个数正好是K的整数倍,每一段链表正好需要全反转
④K=N,整个大链表完全反转
⑤K=1,不需要反转
⑥最大N(最后尾巴个数K-1,不需要反转 )、最小N
⑦多余结点
在这里插入图片描述
堆(heap)

《优先队列》:取出元素的顺序按照优先权大小,而不是元素进入队列的先后顺序

数组
①插入——插在尾部——时间O(1)
②删除——查找——时间O(n)
删除后移动元素——时间O(n)

链表
①插入——总是插在表头——时间O(1)
②删除——查找——时间O(n)
删除结点——时间O(1)

有序数组
①插入——查找——时间O(n)
移动元素并插入——时间O(n)
②删除——删除最后一个元素——时间O(1)

有序链表
①插入——查找——时间O(n)
插入元素——时间O(1)
②删除——删除首元素或最后元素——时间O(1)
在这里插入图片描述
是否可以用二叉搜索树存储结构
注意:
①如果每次删除最大值,就意味着每次要删除最右边的结点,那么就会变成不平衡的歪树(左边保持不动,右边全部删光了),树的高度就不再是(log2N)了
②重点考虑删除最大值,因为删除与插入相比,删除难度更大

堆(优先队列)用完全二叉树存储
在这里插入图片描述
①最大堆:从根结点到任意结点的路径是从大到小的顺序。56-40-3;56-19-9;56-19-18
②最小堆:从根结点到任意结点的路径是从小到大的顺序。5-16-49;5-16-18;5-30-38
③不是堆:
(1)从左到右是否缺少结点。(不能缺)
(2)路径是否有序。(有序性)
在这里插入图片描述
最大堆
①创建空的最大堆
②判断最大堆是否已满
③将元素插入最大堆
④判断最大堆是否为空
⑤返回最大堆的最大元素(高优先级)
在这里插入图片描述

Case3:
插入58——58>31——把58和31的位置互换——58>44——把58和44的位置互换
在这里插入图片描述

①堆可以定义成一个结构,因为用数组来存储完全二叉树
②malloc申请一个结构的空间赋给堆H
③elements指向数组,申请一个数组的空间,MaxSize+1是因为堆存放是从下表为1的地方开始存放的。
④下表为0的地方存放一个最大值,当作"哨兵"的作用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值