2024年最新数据结构知识总结,你还看不明白

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!

从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个节点被访问一次且仅被访问一次;

前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树;

中序遍历:若树为空,则空操作返回,否则从根结点开始(并不是先访问根结点),中序遍历根结点左子树,然后访问根结点,最后中序遍历右子树;

后序遍历:若树为空,则空操作返回,否则从左到右先叶子后结点到方式遍历访问左右子树,最后访问根结点;

层序遍历:若树为空,则空操作返回,否则从树第一层,也就是根结点开始访问,从上而下逐层遍历,同一层从左到右顺序访问;

6.8.6 二叉树遍历性质

已知前序遍历序列和中序遍历序列可以唯一确定一棵二叉树;

已知后序遍历序列和中序遍历序列可以唯一确定一棵二叉树;

6.9 二叉树的建立

扩展二叉树:将二叉树的每个结点的空指针引出一个虚结点,其值为一特定值;

6.10 线索二叉树

指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树;

线索化:对二叉树以某种次序遍历使其变为线索二叉树的过程;

6.12 赫夫曼编码

带权路径长度WPL最小的二叉树称作赫夫曼树;

7 图

由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合;

图中数据元素称为顶点;

图结构中不允许没有顶点;

任意两点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以为空;

7.2.1 各种图定义

无向边:顶点V1和Vi之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(Vi Vj)来表示;

如果图中任意两个顶点之间的边都是无向边,则称该图为无向图;

有向边:若顶点从V1到Vi的边有方向,则称这条边有方向,也称为弧(Arc),用有序偶

表示,Vi称为弧尾(Tail),Vj为弧头(Head);

若图中任意两个顶点之间的边都是有向边,则称该图为有向图;如:顶点A到D的有向边,A是弧尾,D是弧头,<A,D>表示弧;

简单图:若不存在顶点到其自身的边且同一条边不重复出现;

无向完全图:在无向图中任意两个顶点都存在边;含有n个顶点的完全图有n*(n-1)/2条边;

有向完全图:有向图中任意两个顶点之间都存在方向互为相反的两天弧,有n*(n-1)条边;

有很少条边或弧度图称为稀疏图,反之称为稠密图;

图的边或弧相关的树叫做权(Weight),带权的图称为网(Network);

假设图G=(V,{E}),图G’=(V’,{E’}),如果V’⊆V且E’⊆E,则称G’为G的子图(Subgraph);

对于无向图G=(V,{E}),如果边(v,v’)∈E,则称顶点v和v’互为邻接点,即v和v’相领接边(v,v’)依附于顶点v和v’,顶点v的度是和v相关联的边的数目,记为TD(v);

边数就是各顶点度数和道一半:e= 0.5* ∑TD(vi) (i=1,2,3…n)

对于有向图G=(V,{E}),以顶点v为头的弧度数目称为v的入度,记为ID(v),以v为尾的弧的数目称为v的出度,记为OD(v);顶点v的度为TD(v)=ID(v)+OD(v);

无向图中从顶点v到顶点v’的路径是一个顶点序列;有向图的路径也是有向的;

路径的长度是路径上的边或弧度数目;

第一个顶点到最后一个顶点相同的路径称为换或回路,序列中不重复出现的路径称为简单路径;

7.2.3 连通图

无向图中,从顶点v到v‘有路径则称为v和v’是连通的;如果对于图中任意两点都是连通的,则称图是连通图;

无向图中的极大连通子图称为连通分量;

连通分量条件:子图/子图连通/连通子图含有极大顶点树/具有极大顶点数的连通子图包含依附于这些顶点的所有边;

在有向图G中,如果每一对v,v‘∈V,v≠v’,从v到v‘和从v’到v都存在路径,则称G是强连通图;有向图中的极大强连通子图称作有向图的强连通分量;

一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边;

如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树;

一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧;

7.4 图的存储结构

7.4.1 邻接矩阵:一个一维数组存储图中顶点信息,一个二维数组存储图中的边或弧度信息;

二维数组就是矩阵形式存储,v[i][j]表示顶点i到j的边或弧;

n个顶点和e条边的无向网图创建时间复杂度O(n*n+n+e);

7.4.2 邻接表:数组与链表相结合的存储方式

顶点右一位数组存储,每个数据元素存储指向第一个领接点的指针,每个顶点的所有领接点构成一个线性表;

有向图的逆邻接表:对每个顶点vi建立一个链接为vi为弧头的表;

7.4.3 十字链表

将邻接表和你邻接表结合起来;

结点存储数据/入边表头指针/出边表头指针;

7.4.4 邻接多重表

7.4.5 边集数组

由两个一维数组构成,一个是存储顶点的信息;另一个存储边的信息,这个边数组每个数据元素由一条边的起点下表,终点下表和权组成;

7.5 图的遍历

从图中某一顶点出发遍历图中其余顶点,且每个顶点仅被访问一次,称为图的遍历;

深度优先遍历:从某顶点v出发,访问该顶点,然后从v的未被访问邻接点出发深度优先遍历图,直到图中所有和v有路径相同的顶点都被访问;

7.5.2 广度优先遍历

与深度优先遍历时间复杂度相同;(类似树的层序遍历)

7.6 最小生成树

构造连通网的最小代价生成树称为最小生成树;

7.6.1 普里姆(Prim)算法

时间复杂度:O(n*n);

7.6.2 克鲁斯卡尔(Kruskal)算法

时间复杂度O(e*log e)

7.7 最短路径

迪杰斯特拉算法:时间复杂度O(n*n);

弗洛伊德算法:时间复杂度O(nnn);

7.8 拓扑排序

AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动间的优先关系;

拓扑序列:有向图G,满足从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前;

拓扑排序:对一个有向图构造拓扑序列对过程;

时间复杂度:O(n+e)

AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,

7.9 关键路径:

从源点到汇点具有最大路径;

8 查找

根据给定某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录);

查找表:由同一类型的数据元素构成的集合;

关键字:数据元素中某个数据项的值,又称键值;

主关键字:此关键字可以唯一表示一条记录;

数据项对应数据码;

查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录);

静态查找表:只做查找操作的查找表;

动态查找表:在查找过程中同时插入不存在的数据元素,或者从查找表中删除已经存在的某个数据元素

8.3 顺序表查找

顺序查找/线性查找:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若相等则查找成功,直到最后一个(或第一个)记录,不等则查找不成功;

顺序查找优化:将给定值赋予a[0],从尾部遍历,循环条件为是否等于关键字,省去判断越界环节;

8.4 有序表查找

二分查找/折半查找:在有序表中,取中间记录作为比较对象,若给定值与关键字相等则成功,小于则在左半区查找,大于在右半区查找,直到成功或查找所有区域无记录而查找失败(前提为线性表中记录必须是关键码有序,通常从小到大,且为顺序结构);

时间复杂度O(log n);

插值查找:根据要查找的关键字key与查找表中最大最小记录的关键字比较后查找,将二分查找的mid设为mid = low + (key - a[low])/(a[high] - a[low]) * (high - low)

斐波那契查找:利用斐波那契函数给mid赋值,mid=low+F[k-1]-1;

时间复杂度O(log n);

8.5 线性索引查找

索引就是把一个关键字与它对应的记录相关联的过程;

线性索引:将索引项集合组织为线性结构,也称索引表;

8.5.1稠密索引

在线性索引中,将数据集中的每个记录对应一个索引项;

索引项一定是按照关键码有序排列;

8.5.2分块索引

分块有序,是把数据集的记录分成若干块,并且这些快需要满足,块内无序,块间有序;

块间有序:要求第二块所有记录关键字均大于第一块中所有记录的关键字;

最佳分块索引情况为块m=√ ̄n(n为记录数),此时平均查找长度L=(√ ̄n)+1;

8.5.3倒叙索引

记录号表存储具有相同次关键字的所有记录的记录号(可以是指向记录的指针或者是该记录的主关键字),由属性值来确定记录的位置;

8.6 二叉排序树

二叉查找树/二叉排序树:

若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值,

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值,

它的左右子树也分别为二叉排序树;

二叉排序树查找:利用递归在二叉链表中递归查找;

二叉排序树插入操作:利用查找函数将key插入到最终查找到合适结点到子树上;

二叉排序树构建:利用插入函数构建(根结点,将之后元素与结点对比,小的在左树中去对比,大的在右树中去对比,直到结点没有孩子,则插入);

二叉排序树删除:找到删除的结点的直接前驱,用该前驱替换删除的结点;

二叉排序树以链接的方式存储

8.7 平衡二叉树

--是一种二插排序树,其中每一个节点的左子树和右子树高度差至多等于1;

平衡因子:左子树与右子树深度差值;

最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的结点为根的子树;

8.8 多路查找树(B树)

每一个结点孩子树可以多于两个,且每一个结点处可以存储多个元素;

2-3树:

每个结点有两个2个孩子(2结点)或3个孩子(3结点);

一个2结点包含一个元素和两个孩子(或没有孩子);

一个3结点包含一小一大两个元素和3个孩子(或没有孩子);

所有叶子在同一层次上;

2-3-4树:

2-3树的扩展,包括4结点;

一个4结点包括小中大3个元素和4个孩子(或没有孩子);

B树(B-tree):一种平衡的多路查找树,结点最大的孩子数目称为B树的结;(2-3树是3阶B树)

如果根结点不是叶结点,则至少有两棵子树;

8.9 散列查找

散列技术:在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字k对应一个存储位置;散列函数(哈西函数)

K1≠K2,但f(K1)=f(K2),此时称为冲突,K1和K2称为这个散列函数的同义词;

8.10 散列函数的构造方法

直接定值;数字分析法;平方取中;折叠法;除留余数法;

8.11 处理散列冲突

开放定值法:一旦发生冲突,就去寻找下一个空的散列地址;

再散列函数法:发生冲突,更换散列函数进行计算;

链地址法:发生冲突,在当前位置给单链表增加结点;

公共溢出法:给发生冲突的关键字重新建立一个溢出表;

8.12 散列表查找

9 排序

似的序列成为一个按关键字有序的序列;

排序稳定:Ki=Kj,且排序前Ri领先于Rj,排序后任然领先;

排序不稳定:Ki=Kj,且排序前Ri领先于Rj,排序后Rj领先Ri;

内排序:排序过程待排序所有记录放置在内存中;

外排序:整个排序过程需要在内外存之间切换;

性能影响:

1 时间性能:尽可能少的关键字比较次数和尽可能少的纪录移动次数;

2 辅助空间:存放待排序占用空间加上执行算法所需要其他存储空间;

3 复杂性: 算法本身复杂度,不止时间;

9.3 冒泡:

时间:O(nˇ2);

9.4 简单排序:

通过n-i次关键字比较,从n-i+1个记录中选出关键字最小的值,并和第i个交换;

时间:O(nˇ2);

略优于冒泡(每次只交换一个值);

9.5 直接插入:

将一个记录插入到已排序的序表中;

时间:O(nˇ2);

略优于冒泡(比较次数少);

9.6 希尔排序:

基本有序:小的关键字基本在前面,大的基本在后面,不大不小的基本在中间;

时间:O(nˇ(2/3));

9.7 堆排序:

堆:完全二叉树;

大顶堆:每个结点堆值都大于或等于其左右孩子结点的值;

小顶堆:每个结点堆值都小于或等于其左右孩子结点的值;

堆排序(大顶堆):将待排序序列构造一个大顶堆;最大值此时在根结点,移走根结点,剩余n-1个结点从新构造一个堆,得到次小值,如此反复得到一个有序序    列;

let maxsize = 10

struct Sqlist {
var arr: [Int] = [maxsize + 1]
var length: Int?
}

//堆排序
func heapSort(L: Sqlist) {
for i in L.arr.count…0 {
heapAdjust(L, s: i, m: L.arr.count)

    }
    for i in L.arr.count...1 {
        swap(L.arr, i: 1, j: i)
        heapAdjust(L, s: 1, m: i-1)
    }
}
func heapAdjust(var L: Sqlist,var s: Int, m: Int) {
    let temp = L.arr[s]
    for (var j = 2*s; j<=m; j=j*2) {
        if (j<m && L.arr[j] < L.arr[j+1]) {
            j += 1
        }
        if temp >= L.arr[j] {
            break
        }
        L.arr[s] = L.arr[j]
        s = j
    }
    L.arr[s] = temp
}
//直接插入排序
func insertSort(var L: Sqlist) {
    for i in 1...(L.arr.count - 1) {
        if L.arr[i] < L.arr[i-1] {
            let temp = L.arr[i]
            for j in i...0 {
                if L.arr[j] < temp {
                    L.arr[j] = L.arr[j-1]
                    L.arr[j-1] = temp
                }
            }
        }
    }

}
//选择排序
func selectSort(L: Sqlist) {
    for i in 0...(L.arr.count - 1) {
        var min = i
        for j in 1...(L.arr.count - i) {
            if L.arr[min] > L.arr[j] {
                min = j


![](https://img-blog.csdnimg.cn/img_convert/9a8cb5f8c0ec69e6499adead0da6e95b.png)


最全的Linux教程,Linux从入门到精通

======================

1.  **linux从入门到精通(第2版)**

2.  **Linux系统移植**

3.  **Linux驱动开发入门与实战**

4.  **LINUX 系统移植 第2版**

5.  **Linux开源网络全栈详解 从DPDK到OpenFlow**



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/59742364bb1338737fe2d315a9e2ec54.png)



第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/9d4aefb6a92edea27b825e59aa1f2c54.png)



**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**

> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

tu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/9d4aefb6a92edea27b825e59aa1f2c54.png)



**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**

> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值