给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
“假溢出”现象。
2. 循环队列
解决“假溢出”。
2、链队列
应用:
·输入输出管理
·对CPU的分配管理
·优先队列(priority queue)
权值优先。
·双(双端)队列(double-ends queue)
操作系统的调度工作则是采用双端队列。
五、串
术语:长度、空串、空格串、串相等、字串、主串、模式匹配(主串:目标串,子串:模式)。
运算:求串长、串连接、求子串、串比较、插入子串、删除子串、模式匹配。
- 顺序存储(类似线性表)
- 链接存储
- 堆分配存储(开辟一块地址连续的存储空间)
六、多维数组和广义表
1、多维数组
数组是一个有固定格式和数量的有序集合,每个数据元素由唯一的一组下标来标识。多维数组为非线性结构,n维数组最多有n个直接前驱和n个直接后继。
**·**以行为主(按行优先顺序)
**·**以列为主序(按列优先顺序)
2、特殊矩阵的压缩存储
对称矩阵:n(N+1)/2
三角矩阵:n(n+1)/2+1
**·**上三角矩阵
**·**下三角矩阵
3、稀疏矩阵
1)存储
·三元组表
行列值(i,j,v)。
·带行指针的链表
根据行指针将同一行的值(三元组形式)用链表连接起来。
·十字链表
解决三元组存储稀疏矩阵的缺点:在进行运算(如加、减)时非零元素的位置和个数会发生变化。
思想:
把非零元素作为一个结点(i,j,v,down,right,三元组+列指针域+行指针域)存储。
列指针域:指向本列中下一个非零元素。
行指针域:指向本行中下一个非零元素。
行头结点只使用right指针域。
列头结点只使用down指针域。
总头结点存储原矩阵的行数和列数。
2)算法
创建
加法
4、广义表
线性表的推广,广义表通常用小括号括起来并用逗号隔开表中元素。
长度:第一层所包含的元素(原子、子表)个数。
深度:展开后所包含括号的层数(嵌套数)。
首尾存储法
- 表结点:标志域、表头指针域、表尾指针域。
- 原子结点:标志域、值域。
特点:采用链式存储(广义表的数据元素可以具有不同的结构)
七、树和二叉树
1、树
术语:
结点(包含数据和分支)、结点的度(结点的子树数)、树的度(树中各结点度的最大值)、叶子(度为零)、分支结点(度不为零)、兄弟结点、层数、树的深度(高度)、森林(零或者有限棵互不相交的树的集合)、有序树(结点的子树从左到右有序)和无序树。
树根(根节点),有且仅有一个,无前驱结点。
表示法
- 嵌套集合法(文氏图法)
- 圆括号表示法
- 凹入法
2、二叉树
特殊的有序树。
**性质1:**一颗非空二叉树的第i层上最多有2^(i-1)个结点(i>=1)。
**性质2:**深度为h的二叉树中,最多具有2^h-1个结点(h>=1)。
**性质3:**对于一颗有n个结点的完全二叉树,若按满二叉树的同样方法对结点进行编号,则对于任意序号为i的结点,有:
- (父结点):若i=1,则序号为i的结点是根结点。若i>1,则序号为i的结点的父结点的序号为(向下取整i/2)。
- (左孩子):若2i<=n,则序号为i的结点的左孩子结点的序号为2i。若2i>n,则序号为i的结点无左孩子。
- (右孩子):若2i+1<=n,则序号为i的结点的右孩子结点的序号为2i+1。若2i+1>n,则序号为i的结点无右孩子。
**性质4:**具有n(n>0)个结点的完全二叉树(包括满二叉树)的深度(h)为(向下取整log2^n)+1。
**性质5:**对于一颗非空的二叉树,设n0, n1, n2分别为表示度为0、1、2的结点个数,则有n0=n2+1。
满二叉树
深度为h,且有2^h-1个结点的二叉树。
完全二叉树
深度为h,有n个结点的二叉树。当且仅当每一个结点都与深度为h的满二叉树中编号从1至n的结点一一对应时,缺失部分一定是右边的。
存储
一般二叉树:
链式存储(二叉链表,左数右、三叉链表,左数右父)
**完全二叉树或满二叉树:**
顺序存储(既能节省空间,又能利用下标确定结点在二叉树中的位置)
3、遍历二叉树和线索二叉树
1. 遍历二叉树
- 先序遍历(DLR,根左右)
- 中序遍历(LDR,左根右)
- 后序遍历(LRD,左右根)
- 层次遍历(逐层访问,自上而下,从左到右)
2. 恢复二叉树
前序+中序(前序确定根节点,中序确定左子树和右子树)
- 根据前序序列确定根节点,根据中序序列确定左子树和右子树。
- 分别找出左子树和右子树的根节点,并把左、右子树的根节点连到父节点上。
- 对左子树和右子树重复以上两步,直到子树只剩下1个结点或2个结点或空为止。
中序+后序(后序确定根节点,中序确定左子树和右子树)
同上
3. 线索二叉树
带有线索(指向直接前驱结点或指向直接后继结点的指针)的二叉树。
优点:
**·**进行中序遍历时不必采用堆栈处理,遍历速度快,节约存储空间。
**·**任意一个结点能直接找到它相应遍历顺序的直接前驱和直接后继结点。
缺点:
**·**节点的插入和删除麻烦且速度慢。
**·**线索树不能共用。
线索化:对二叉树以某种次序遍历使其变为线索二叉树的过程。
先序线索二叉树、中序线索二叉树(中序线索化使用最多)、后序线索二叉树。
4、二叉树的转换
一般树转换为二叉树
把一般树的长子作为其父结点的左子树,次弟作为其兄结点的右子树。
方法:
- 连线:链接树中所有相邻的亲兄弟之间连线。
- 删线:保留父结点与长子的连线,打断父结点与非长子之间的连线。
- 旋转:以根节点为轴心,将整棵树顺时针旋转一定的角度,使之层次分明。
森林转换为二叉树
森林是若干棵树的集合。只要将森林中的每一棵树的根视为兄弟,而每一棵树又可以用二叉树表示,这样,森林也就可以用二叉树来表示了。
方法:
(1)将森林中的每一棵树转换成相应的二叉树。
(2)第一棵二叉树保持不动,从第二棵二叉树开始,依次把后一棵二叉树的根结
点作为前一棵二叉树根结点的右子树,直到把最后一棵二叉树的根结点作为其前一棵二叉树的右子树为止。
二叉树转换为树和森林
树转换为二叉树以后,其根结点必定无右子树;而森林转换为二叉树以后,其根结点有右分支。显然这一转换过程是可逆的,即可以依据二叉树的根结点有无右子树,将一棵二叉树还原为树或森林。
方法:
(1)若某结点是其父结点的左孩子,则把该结点的右孩子、右孩子的右孩子,直到最后一个石核于都与该结点的父结点连起来。
(2)删除原二叉树中所有的父结点与右孩子结点的连线。
(3)整理(1)、(2)的结果,使之层次分明。
5、哈夫曼树
术语:
路径长度(结点间)、树的路径长度(根结点到每个结点的路径长度之和)、结点的带权路径长度(结点到根结点之间路径长度与该结点上的权的乘积)、树的带权路径长度(树中所有叶子结点的带权路径长度之和)。
注:决策判定问题中,哈夫曼树可以获得最佳的决策算法。
基本思想
(1)由给定的n个权值{W1,W2,…,Wn}构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F={T1,T2,…, Tn}。
(2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和。
(3)在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中。
(4)重复(2)、(3)两步,直到F中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。
哈夫曼编码
在数据通信中,经常需要将传送的文字转换成由二进制字符0和1组成的二进制代码,称之为编码。如果在编码时考虑字符出现的频率,让出现频率高的字符采用尽可能短的编码,出现频率低的字符采用稍长的编码,构造一种不等长编码,则电文的代码就可能更短。
**哈夫曼编码**是一种用于构造使电文的编码总长最短的编码方案。
八、图
边:无向直接连线(边)
弧:有向直接连线(弧:弧头、弧尾)
术语:
无向图、有向图、无向完全图(任意两顶点有一条边相连,n(n-1)/2条边)、有向完全图(任意两顶点有方向相反的两条弧相连,n(n-1)条弧)、稠密图、稀疏图、顶点的度(拥有的边数,度、入度、出度)、权、网(带权图,无向网、有向网)、路径、路径长度(路径上边的数目)、回路、简单路径、简单回路、子图、连通图(任意两顶点都相连通)、连通分量(极大连通子图)、强连通图(有向图中)、强连通分量(有向图中)、弱连通图(有向图中,考虑方向不连通,不考虑方向则连通)、生成树(连通图的一个子图,该子图是一个包含连通图所有顶点的树)。
1、存储
邻接矩阵
表示顶点之间相邻关系的矩阵。
邻接表
图的一种顺序存储与链式存储结合的存储方法。
- 顶点结点结构:顶点标志域、指针域(指向第一条邻接边)
- 边结点结构:下标域(邻接顶点的)、指针域(指向第一条邻接边)
优点:通过某顶点查找以该顶点为弧尾的弧结点很方便。
缺点:通过该顶点查找以其为弧头的弧结点需要遍历整张邻接表。
注:逆邻接矩阵的优缺点和邻接矩阵相反。
十字链表
优点:方便通过某顶点能够同时查找以该顶点为弧尾和弧头的弧结点。
2、遍历
- 广度优先搜索(BFS,类似树的层次遍历)
- 深度优先搜索(DFS,类似树的先序遍历)
3、连通性
最小生成树
构造算法:Prim算法、Kruskal算法
4、最短路径
算法:迪杰斯特拉(Dijkastra)、
5、有向无环图
有向无环图(不存在环的有向图)
应用:
**·**拓扑排序
**·**关键路径
九、查找
1、静态查找表
顺序查找
基本思想:
从表的一端开始扫描线性表,依次按给定值与关键字进行比较,若相等,则查找成功,并给出数据元素在表中的位置;若整个表查找完毕,仍未找到与给定值相等的关键字,则查找失败,给出失败信息。
时间复杂度:查找长度的量级(O(n))
优点:对表中数据元素的存储没有要求。
缺点:当n很大时,平均查找长度较大,效率低。只能进行顺序查找(线性链表)
二分查找
基本思想:
在有序表中,取中间元素作为比较对象,若给定值与中间元素的关键字相等,则查找成功;若给定值小于中间元素的关键字,则在中间元素的左半区继续查找;若给定值大于中间元素的关键字,则在中间元素的右半区继续查找。不断重复上述查找过程,直到查找成功,或所查找的区域无数据元素,查找失败。
时间复杂度:O(log2^n)
优点:效率高
缺点:
·必须按关键字排序,有时排序也很费时。
·只适用顺序存储结构,进行插入、删除操作必须移动大量的结点。
分块查找
基本思想:
将具有n个元素的主表分成m个块(又称子表),每块内的元素可以无序,但要求块与块之间必须有序,并建立索引表。索引表包括两个字段:关键字字段(存放对应块中的最大关键字值)和指针字段(存放指向对应块的首地址)。查找方法如下:
(1)在索引表中检测关键字字段,以确定待找值kx所处的分块(可用二分查找)位置。
(2)根据索引表指示的首地址,在该块内进行顺序查找。
2、动态查找表
二叉排序树
二叉排序树是空树或者具有以下性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于根结点的值。
(2)若右子树不空,则右子树上所有结点的值均大于根结点的值。
(3) 左、右子树也都是二叉排序树。
基本思想:
- 若查找树为空,查找失败。
- 查找树非空,将给定值与杳找树的根结点关键字比较。
- 若相等,查找成功,结束查找过程,否则:
**·**当给定值小于根结点关键字时,查找将在左子树上继续进行,转到①。
**·**当给定值大于根结点关键字时,查找将在右子树上继续进行,转到①。
时间复杂度:(n+1)/2(最差)
平衡二叉树
平衡二叉树是指树中任一结点的左、右子树高度大致相等的二叉树。平衡二叉树有很多种,最著名的是AVL树。平衡二叉树是一棵空树或者是具有以下性质的二叉排序树:
(1)它的左子树和右子树的高度之差(称为平衡因子)的绝对值不超过1。
(2)它的左子树和右子树又都是平衡二叉树。
解决插入结点后失去平衡:
- 不平衡子树形态为LL型。
- 不平衡子树形态为LR型。
- 不平衡子树形态为RR型。
- 不平衡子树形态为RL型。
3、哈希表
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
93道网络安全面试题
内容实在太多,不一一截图了
黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
😝朋友们如果有需要的话,可以联系领取~
1️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
2️⃣视频配套工具&国内外网安书籍、文档
① 工具
② 视频
③ 书籍
资源较为敏感,未展示全面,需要的最下面获取
② 简历模板
因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!