数据结构与算法
链表
介绍
链表是由结点组成的,每个节点包含2个域,一个元素域,存放元素数据,一个链接域,通过next指针指向下一个结点,最后一个节点的链接域指向None
1.特点
不需要连续的存储空间
2.链表结构
单链表(单向链表)是链表的一种形式,它的每个节点包含两个域一个元素域和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
- 表元素域elem用来存放具体的数据
- 链接域next用来存放下一个节点的位置
- 变量head指向链表的头节点(首节点)的位置,从head出发能找到表中的任意节点
代码实现
栈
什么是栈?
栈它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶,相对的,把另一端称为栈底,同时栈的结构特点让它在处理数据的时候符合了先进后出的特点。
栈的作用
计算机里面的栈其实有着举足轻重的作用,栈是计算机系统里面CPU结构的一部分。
栈到底有什么用呢?
函数里面有可能要使用到局部变量,不能总是用全局变量,而局部变量在函数使用完毕之后就销毁了,那么局部变量存储到哪既能不浪费空间又能及时销毁。
代码实现
队列
什么是队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的头部(front)进行删除操作,而在表的尾部(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头
队列的作用
任务处理类的系统:
先把用户发起的任务请求接收过来存到队列中,然后后端开启多个应用从队列中取任务进行处理,队列起到了缓冲压力的作用
代码实现
双端队列
什么是双端队列
双端队列是一种具有队列和栈的性质的数据结构
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行
双端队列可以在队列任意一端入队和出队
代码实现
1|0排序算法
1|1冒泡排序
重复的走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复的进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成
冒泡排序:
最差时间复杂度:O(n^2)
最优时间复杂度:O(n)
算法稳定性:稳定算法
代码实现
1|2选择排序
什么是选择排序
第一次从该待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从该待排序的未排序元素中寻找到最小(大)元素,然后放到已排序的序列末尾,依次类推,直到全部待排序的数据元素的个数为零。
代码实现
1|3插入排序
什么是插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的,个数加一的有序数据,算法适用于少量数据的排序
代码实现
1|4快速排序
什么是快速排序
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
1.首先设定一个分界值,通过该分界值将数组分成左右两部分
2.将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边
此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值
3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也做类似处理
4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左,右两个部分各数据排序完成后,整个数组的排序也就完成了。
代码实现
1|5二分查找-递归版本
什么是二分查找
二分查找又称折半查找,它是一种效率较高的查找方法
原理:将数组分为三部分,依次是中值前,中值,中值后
将要查找的值与中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回
要求:必须采用顺序存储结构,必须按关键字大小有序排列
代码实现
1|6树
什么是树
树就是一种非线性结构
它是用来模拟具有树状结构性质的数据集合,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做"树"是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的,它具有以下的特点:
1.每个节点有零个或多个子节点
2.没有父节点的节点称为根节点
3.每一个非根节点有且只有一个父节点
4.除了根节点外,每个子节点可以分为多个不相交的子树
树的术语
节点的度:一个节点含有的子节点的个数称为该节点的度
树的度:一颗树中,最大的节点的度称为树的度
叶节点或终端节点:度为零的节点
父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点
节点的层次:从根开始定义起,根为第一层,根的子节点为第2层,依次类推
树的高度或深度:树中节点的最大层次
堂兄弟节点:父节点在同一层的节点互为堂兄弟
节点的祖先:从根到该节点所经分支上的所有节点
子孙:以某节点为根的子树中任一节点都称为该节点的子孙
森林:由m(m>=0)颗互不相交的树的集合称为森林
树的种类
无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树
有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树
有序树:
霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树
B树:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多于两个的子树
二叉树:每个节点最多含有两个子树的树称为二叉树
二叉树的种类
完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其他各层的节点数目均已达到最大值,且第d层所在节点从左向右连续的紧密排列,这样的二叉树被称为完全二叉树,其中满二叉树的定义是所有叶节点都在最底层个的完全二叉树
平衡二叉树:当且仅当任何节点的两颗子树的高度差不大于1的二叉树
排序二叉树:也称为二叉搜索树,有序二叉树
排序二叉树的要求:
1.若左子树不空,则左子树上所有节点的值均小于它的根节点的值
2.若右子树不空,则右子树上所有节点的值均大于它的根节点的值
3.左,右子树分别为二叉排序树
排序二叉树包含空树
二叉树的存储
顺序存储:将数据结构存储在固定的数组中,虽然在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树存储方式,二叉树通常以链式存储
链式存储:由于对节点的个数无法掌握,常见树的存储表示都转换成二叉树进行处理,子节点个数最多为2
树的应用场景
1.xml,html等,那么编写这些东西的解析器的时候,不可避免用到树
2.路由协议就是使用了树的算法
3.mysql数据库索引
4.文件系统的目录结构
5.所以很多经典的AI算法其实都是树搜索,此外机器学习中的decision tree也是树结构
二叉树的概念
二叉树是每个节点最多有两个子树的树结构
通常子树被称为"左子树"和“右子树”
二叉树的性质
性质1:在二叉树的第i层上至多有2^i-1个节点(i<0)
性质2:深度为k的二叉树至多有2^k-1个结点(k>0)
性质3:对于任意一颗二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1
性质4:最多有n个结点的完全二叉树的深度必为log2(n+1)
性质5:对完全二叉树,若从上至下,从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1,其父节点的编号必为i//2(i=1时为根除外)
代码实现
二叉树的三种深度优先遍历
先序遍历:0 1 3 7 8 4 9 2 5 6 根 左 右
中序遍历:7 3 8 1 9 4 0 5 2 6 左 根 右
后序遍历:7 8 3 9 4 1 5 6 2 0 左 右 根
代码实现
__EOF__

本文链接:https://www.cnblogs.com/weiweivip666/p/16521870.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
-------------------------------------------
个性签名:代码过万,键盘敲烂!!!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2020-07-26 django中修改QueryDict数据类型和转成普通字典
2020-07-26 图书管理系统进阶---多表操作
2020-07-26 locals()用法
2020-07-26 django学习第十一天---django操作cookie和session