1、栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。
区别:
-
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存溢出。
-
空间大小:堆内存几乎是没有什么限制。栈一般都是有一定的空间大小。
-
碎片问题:对于堆来讲,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题。
-
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。
-
分配效率:栈的效率比较高。堆的效率比栈要低得多。
-
增长方向:堆的增长方向是从程序低地址到高地址向上增长,而栈的增长方向刚好相反(实际情况可能不是这样的,与CPU的体系结构有关)
设有 6 个结点的无向图,该图至少应有 ( ) 条边才能确保是一个连通图。
正确答案: A 你的答案: B (错误)
5
6
7
8
各个点都要连接上,边数比顶点数少一个
Prim 有个点 准对点(点少边多)
Kruskal 针对边(点多边少)
在一个有向图的拓扑序列中,若顶点 a 在顶点 b 之前,则图中必有一条弧<a,b>。( )
(改为路径是对的)
正确答案: B 你的答案: A (错误)
正确
错误
选B。该题考察的是拓扑排序的概念,如果从 a 到 b 有一条有向路径,则 a 一定排在 b 之前,反过来也应该以“路径”更准确。
注意区分“路径”和“弧”:
弧:指的是有向图里面的边,有明确方向的。如果是无向图的边,直接叫做“边”。比如有向图的 v1 结点到 v2 结点的弧可能是:<v1, v2>;路径:指的是图(包括有向图和无向图)里面连接两个结点之间的边的集合,也就是一个顶点序列。比如:v1 到 v3 的路径可能这样表示:<v1, v2>、<v2, v3>;如下图举例所示:顶点 a 在顶点 b 之前,但**没有弧****<a,b>,而是一条路径<a,c><c,b>
只要在无向有权图中存在1个环(回路)的权值之和为负值,我们就称此无向图存在“负权回路”下面哪个算法可以检验一个无向图是否存在负权回路?
正确答案: A 你的答案: C (错误)
最短路径 Bellman-Ford 算法
最小生成树 Kruskal 算法
最小生成树 Prim 算法
最短路径 Dijkstra 算法
B,C,D都是生成树的,自然测不出回路
用邻接矩阵法存储一个图时,在不考虑压缩存储的情况下,所占用的存储空间大小只与图中结点个数有关,而与图的边数无关,这样的说法正确吗?
正确答案: A 你的答案: B (错误)
正确
不正确
邻接矩阵是用一维数组存储图中顶点的信息,用矩阵表示图中顶点之间的邻接关系。都是顶点之间的关系,所以正确
KMP算法时间复杂度为O(m+n),空间复杂度为O(m)。 因为KMP算法涉及到next数组的存储,且next数组是基于模式串长度计算的。
二叉排序树的中序遍历序列是升序的有序序列。
设非空二叉树的所有子树中,其左子树上的结点值均小于根结点值,而右子树上的结点值均不小于根结点值,则称该二叉树为排序二叉树。对排序二叉树的遍历结果为有序序列的是( )。
正确答案: A 你的答案: D (错误)
中序序列
前序序列
后序序列
前序序列或后序序列
一棵完全二叉树具有1000个结点,则此完全二叉树有 ( )个度为2的结点。
正确答案: C 你的答案: D (错误)
497
498
499
500
公式1 : n0=n2+1;
公式2 :总结点=n0+n1+n2;
计算:n0+n1+n2=1000
n0=n2+1;
将公式带入 2n2+n1+1=1000
因为度为1的节点只有 0 或者1个所以。将值带入。计算得到结果。
关于哈弗曼树,下列说法错误的是?
正确答案: A 你的答案: C (错误)
为字符编码需要从叶节点开始再向上
哈弗曼树可以通过在优先级队列中的插入和移除操作来创建
最常出现的字符总是在靠近树顶附近出现
通常,信息解码需要重复的顺着根到叶的路径走
A选项写的是编码,不是构造。别看错了
在一般包含n个节点的二叉搜索树中查找的最差时间复杂度是?
正确答案: B 你的答案: B (正确)
O(log(n))
O(n)
O(n^2)
O(1)
对于二叉搜索树,当先后插入的关键字有序时,退化成链表,树的深度为n,时间复杂度等于顺序查找O(n/2)= O(n)
下面关于B和B+树的叙述中,不正确的是( )
正确答案: C 你的答案: D (错误)
B树和B+树都是平衡的多叉树。
B树和B+树都可用于文件的索引结构。
B树和B+树都能有效地支持顺序检索。
B树和B+树都能有效地支持随机检索。
B树只支持随机搜索,B+ 树支持随机和顺序搜索。
求最小生成树的普里姆(Prim)算法中边上的权可正可负。
正确答案: A 你的答案: B (错误)
正确
错误
prim算法权值是可正可负的,Dijkstra算法是不能有负的权值的。
由权值序列(5,6,2,10,9,8)构造一棵赫夫曼树,其带权路径长度WPL值是( )
正确答案: D 你的答案: C (错误)
25
68
110
100
(2+5)4 + 63 + (8+9+10)*2 = 100
BatchNorm 层对于 input batch 会统计出 mean 和 variance 用于计算 EMA。如果input batch 的 shape 为(B, C, H, W),统计出的 mean 和 variance 的 shape 为: ()
正确答案: B 你的答案: B (正确)
B * 1 * 1 * 1
1 * C * 1 * 1
B * C * 1 * 1
1 * 1 * 1 * 1
B代表图像的batch,即多少张图像一个batch。C代表图像的通道数。
BN是对多张图像的同一通道做Normalization
所以有多少通道就有多少个mean和variance
深度学习是当前很热门的机器学习算法,在深度学习中,涉及到大量的矩阵相乘,现在需要计算三个稠密矩阵A,B,C 的乘积ABC,假设三个矩阵的尺寸分别为m∗n,n∗p,p∗q,且m <n < p < q,以下计算顺序效率最高的是()
正确答案: A 你的答案: A (正确)
(AB)C
AC(B)
A(BC)
所以效率都相同
维度低的先相乘效率更高
ResNet-50 有多少个卷积层? ()
正确答案: B 你的答案: C (错误)
48
49
50
51
ResNet-50就是因为它有50层网络,这50层里只有一个全连接层,剩下的都是卷积层,所以是50-1=49
防止模型过拟合:
1.引入正则化(参数范数惩罚)
2.Dropout
3.提前终止训练
4.增加样本量
5.参数绑定与参数共享
6.辅助分类节点(auxiliary classifiers)
7.Batch Normalization
深度学习中的激活函数需要具有哪些属性?()
正确答案: A B D 你的答案: A B C (错误)
计算简单
非线性
具有饱和区
几乎处处可微
使用一个长度最大为150的队列,对满二叉树进行广度优先遍历时,能够容纳的二叉树的最大深度(第一层深度为1)为()
正确答案: A 你的答案: B (错误)
8
10
9
7
满二叉树每一层的结点个数为(第一层深度为1)第n层的节点数:2^(n-1),如果使用150的队列进行广度优先遍历,
则每一层的节点数不大于150,2(n-1)≤150,27=128,2^8=256,n-1最多为7,所以最大深度n=8.
对于以下用数组存储的二叉树A B C D E采用中序和前序遍历的结果是()
正确答案: A C 你的答案: A (错误)
A B D E C
D E B C A
D B E A C
C E D B A
以数组存储,是按照层次序来保存的。所以A在第一层BC在第二层DE在第三层。
查找哈希表,解决冲突的方法包括()
正确答案: A D 你的答案: A C D (错误)
链地址法
除留余数法
直接地址法
线性探测再散列法
表达式"X=A+B*(C-D)/E"的后缀表示形式可以是()
正确答案: C 你的答案: A (错误)
XAB+CDE/-*=
XA+BC-DE/*=
XABCD-*E/+=
XABCDE+*/=
选 c
人工实现转换
这里我给出一个中缀表达式:a+b*c-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e))
第二步:转换后缀表达式
后缀:把运算符号移动到对应的括号后面
则变成了:((a(bc)* )+ (de)+ )-
把括号去掉:abc*+de± 后缀式子出现
STL中的优先队列是采用什么数据结构来实现的?()
正确答案: A 你的答案: C (错误)
堆
队列
栈
图
最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是()
正确答案: B 你的答案: B (正确)
(rear+1) MOD n=front
rear=front
rear+1=front
(rear-1) MOD n=front
循环队列的相关条件和公式:
1.队空条件:rear==front
2.队满条件:(rear+1) %QueueSIze==front,其中QueueSize为循环队列的最大长度
3.计算队列长度:(rear-front+QueueSize)%QueueSize
4.入队:(rear+1)%QueueSize
5.出队:(front+1)%QueueSize
- 队列属于逻辑结构的概念,它们的物理存储既可以利用数组也可以利用链表完成,所以循环队列属于逻辑上首尾相接的抽象圆环,如上图所示。A错误。
- 空队列头尾指针指向同一个区域(0区域),所以F==R;满队列是随着元素的入队,尾指针逐渐加1,直到从0区域加到****SIZE-1区域,这时尾指针指向SIZE-1区域,头指针指向0区域。判断队满的条件是尾指针再加1(由于是循环)所以头尾指针重合在0区域,(R+1)%SIZE==F
便于插入和删除的容器是()
正确答案: A C D 你的答案: C (错误)
list
vector
map
set
在快速排序中,要使最坏情况的空间复杂度为O(log2n )则要对快速排序作( )修改。
正确答案: A 你的答案: B (错误)
划分元素为三者取中
采用表排序
先排最小集合
先排大集合
选A。
快速排序的思想:
- 先从数列中取出一个数作为基准数
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
- 再对左右区间重复第二步,直到各区间只有一个数
最优的情况下空间复杂度为:O(log2n) ;每一次都平分数组的情况,基准数尽量为中间数。
下面哪种排序的平均比较次数最少()
正确答案: D 你的答案: B (错误)
插入排序
选择排序
堆排序
快速排序
上图。虽然平均情况下快排和堆排时间复杂度都为O(nlogn),甚至堆排序的最坏情况下时间复杂度和辅助空间都优于快排。但是不能否认的是,虽然都是O(nlogn)级别,但是快排的常数因子要小于堆排序。实验可验。
下列排序方法中,稳定的排序方法是()
正确答案: A B E 你的答案: E (错误)
//直接插入排序
//归并排序
希尔排序
快速排序
//基数排序
不稳定: 快(快速)些(shell 希尔)选(选择)队(堆)
关于数据结构,下面叙述中正确的是()
正确答案: B D 你的答案: B C (错误)
直接选择排序是一种稳定的排序方法
//哈弗曼树带权路径长度最短的树,路径上权值较大的结点离根较近
拓扑排序是指结点值得有序排序
//当从一个最小堆中删除一个元素时,需要把堆尾元素填补到堆顶位置,然后再按条件把它逐层向下调整到合适位置
A:直接选择排序中存在着不相邻元素之间的互换,因此,直接选择排序是一种不稳定的排序方法。 A错
B:哈夫曼树定义 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。B对
C:我查找资料说有序指的是 不是结点的值有序,是结点的逻辑先后关系保持有序 C错
D:属于堆排序过程 D对
京东商城plus会员的消费记录金额分别为900,512,613,700,810,若采用选择排序算法对其进行从小到大的排序,第三趟排序结果为:()
正确答案: C 你的答案: 空 (错误)
900512613700810
512900613700810
512613700900810
512613700810900
***选择排序*的工作原理是每一次从待排序的数据元素中选出最小( 或最大)的一个元素,存放在序列的起始位置,在剩余的未排序的元素中继续重复上述操作,直至全部待排序的元素排完。所以本题的解题过程:
第一趟排序:512 900 613 700 810
第二趟排序:512 613 900 700 810
第三趟排序:512 613 700 900 810
在一棵二叉排序树上查找值为35的数据,以下比较的数据序列正确的为
正确答案: D 你的答案: D (正确)
28、36、18、46、35
18、36、28、46、35
46、28、18、36、35
46、36、18、28、35
选D
A.【28,?】→【28,36】→18不在这个区间,错误
B.【18,?】→【18,36】→【28,36】→46不在这个区间,错误
C.【?,46】→【28,46】→18不在这个区间,错误
D.【?,46】→【?,36】→【18,36】→【28,36】→找到35
如果待排序的数组近似递减排序,则此时使用快排算法进行递增排序的时间复杂度为()
正确答案: B 你的答案: C (错误)
O(n)
O(n^2)
O(nlogn)
O((n^2)*logn
退化为了冒泡排序,而冒泡排序的时间复杂度为O(n2)。
某种排序方法对关键字序列(33,12,44,10,6,8,17)进行排序时,前三趟排序的结果如下:
6,12,44,10,33,8,17
6,8,44,10,33,12,17
6,8,10,44,33,12,17
则采用的排序方法是()
正确答案: D 你的答案: A (错误)
希尔排序
归并排序
快速排序
选择排序
首先观察排序的特点:会发现,最小的数值会被依次挪到最前面,一看就可以知道:选择排序。
选择排序:就是从待排序数中找出最小的数,然后将最小的数字所在的位置和第一位数进行交换即可,之后找出次小的数字,同样交换位置即可。
采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是()
正确答案: D 你的答案: D (正确)
递归次数与初始数据的排列次序无关
每次划分后,先处理较长的分区可以减少递归次数
每次划分后,先处理较短的分区可以减少递归次数
递归次数与每次划分后得到的分区处理顺序无关
递归次数,取决于递归树,而递归树取决于轴枢的选择。树越平衡,递归次数越少。
而对分区的长短处理顺序,影响的是递归时对栈的使用内存,而不是递归次数
关于排序算法的以下说法,正确的是?
正确答案: C 你的答案: C (正确)
快速排序的平均时间复杂度为O(nlogn),最坏时间复杂度为O(nlogn)
堆排序的平均时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)
冒泡排序的平均时间复杂度为O(n^2),最坏时间复杂度为O(n^2)
归并排序的平均时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)
C
A,快速排序最坏时间复杂度为O(n^2)
B,堆排序最坏为O(nlogn)
C,正确
D,归并排序,最坏时间复杂度O(nlogn)
完全二叉树中的叶子结点只可能在最后两层中出现。( )
正确答案: A 你的答案: B (错误)
正确
错误
关于二叉树,下面说法正确的是()
正确答案: B D 你的答案: A B D (错误)
A 二叉树中至少有一个节点的度为2
B 一个具有1025个节点的二叉树,其高度范围在11到1025之间
C 对于n个节点的二叉树,其高度为n*log(n)
D 二叉树的先序遍历是EFHIGJK,中序遍历为HFIEJKG,该二叉树的右子树的根为G
二叉树可以是空树,所以可以没有节点的度为2
(4)具有n个结点的完全二叉树的深度为
基于哈希的索引和基于树的索引有什么区别?
正确答案: A B C D 你的答案: B C (错误)
hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询
hash索引无法被用来进行数据的排序操作
对于组合索引,Hash索引在计算Hash值的时候是组合索引键合并后再一起计算Hash值,而不是单独计算Hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash索引也无法被利用
Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
1、hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询
因为hash索引比较的是经常hash运算之后的hash值,因此只能进行等值的过滤,不能基于范围的查找,因为经过hash算法处理后的hash值的大小关系,并不能保证与处理前的hash大小关系对应。
2、hash索引无法被用来进行数据的排序操作
由于hash索引中存放的都是经过hash计算之后的值,而hash值的大小关系不一定与hash计算之前的值一样,所以数据库无法利用hash索引中的值进行排序操作。
3、对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
4、Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
排序的方法有很多种,()法是基于选择排序的一种方法,是完全二叉树结构的一个重要应用。
正确答案: E 你的答案: C (错误)
快速排序
插入排序
归并排序
选择排序
堆排序
E
堆排序是一种树形选择排序,是对直接选择排序的有效改进。
初始时把要排序的n个数的序列看作是一棵顺序存储的二叉树(一维数组存储二叉树),调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n个元素中最小(或最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n个元素中次小(或次大)的元素。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。称这个过程为堆排序。
已知一棵树的先序序列和后序序列,一定能构造出该树,这种说法()
正确答案: A 你的答案: B (错误)
正确
错误
如果是二叉树,那么必须要先序+中序,或者中序+后序,但是题目中说的是树,树的先序(根)== 二叉树的先序,树的后序(根)== 二叉树的中序,所以是一定可以构造出来的。
现有一棵无重复关键字的平衡二叉树(AVL 树),对其进行中序遍历可得到一个降序序列。下列关于该平衡二叉树的叙述中,正确的是 () 。
正确答案: D 你的答案: A (错误)
根结点的度一定为 2
树中最小元素一定是叶结点
最后插入的元素一定是叶结点
树中最大元素一定是无左子树
只有两个结 点 的平衡二叉树的 根 结点的度 为 1 , A 错误。 中序遍历 后可以得到一个降序序列 ,树中最小元素一定无左子树 (可能有右子树),因此不一定是叶结点, B 错误。最后插入的结点可能会导致 平衡 调整,而不一定是叶结 点 , C 错误 。
根据邻接表和邻接矩阵的结构特性可知,当图为稀疏图、顶点较多,即图结构比较大时,更适宜选择邻接表作为存储结构。当图为稠密图、顶点较少时,或者不需要记录图中边的权值时,使用邻接矩阵作为存储结构较为合适。
1)联系:邻接表中每个链头后的所有边表结点对应邻接矩阵中的每一行,邻接表中的每个边表结点对应邻接矩阵该行的一个非零元素。
(2)区别:
①对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。
②邻接矩阵的空间复杂度为0(n2),而邻接表的空间复杂度为0(n+e)。
③在邻接表上容易找到任意一顶点的第一个邻接点和下一个邻接点,但要判定任意两个顶点(vi,vj)之间是否有边或弧相连,则需搜索第i个或第j个链表,还不及邻接矩阵方便。
④邻接矩阵多用于稠密图的存储(e接近n(n-1)/2),而邻接表多用于稀疏图的存储(e<<n2)。
邻接矩阵
有向图、无向图和网对应的邻接矩阵如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JzfJDIjv-1665557998930)(假期错题.assets/image-20220706182642776.png)]
图的邻接表存储方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3c2OPrsF-1665557998931)(假期错题.assets/image-20220706182705817.png)]
1、请问你了解原码、反码和补码么,能不能简单概述一下?🔥🔥
引入反码和补码是为了简化二进制数的减法运算;(作用)
在计算机内一个整数是通过二进制进行存储的,该二进制的最左边一位为符号位,0代表正数,1代表负数。
(1)原码(二进制):一个十进制数转化成的二进制数就是这个十进制数的原码。例如:8(十进制)的原码是0000 1000;
(2)反码:正数的反码与原码相同:如:8 原码为0000 1000,反码为0000 1000
负数为原码0变1,1变0,(符号位不变):如:-8 原码为1000 1000,反码为1111 0111
(3)补码:正数的补码与原码相同:如:10 原码为0000 1000,补码为0000 1000
负数的补码为反码加1:如:-8 反码为1111 0111,补码为1111 1000
2、简述一下全局变量和局部变量的区别?🔥🔥
(1)作用域不同:
- 全局变量的作用域为整个程序,
- 局部变量的作用域为当前函数或循环等
(2)内存存储方式不同:
- 全局变量存储在静态全局区(data)中
- 局部变量存储在栈区(stack)
(3)生命期不同:
- 全局变量的生命期和主程序一样,随程序的销毁而销毁,
- 局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
(4)使用方式不同:
- 全局变量在声明后程序的各个部分都可以用到,
- 局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量。
3、C++有几种传值方式,之间的区别是什么?🔥🔥
有三种:值传递、引用传递、指针传递
(1)值传递:形参,改变不会改变实参
(2)引用传递 &:形参,改变会改变实际的值
(3)指针传递 *:指针地址不变的条件下,值改变会改变实际值
5、主函数→int main(int argc, char * argv)函数中,参数argc和argv分别代表什么意思?🔥🔥🔥*
首先先明确一下这个 int main(int argc, char **argv)是什么东西,类比到C++其实就是
```
#include
using namespace std;
int main(){ return 0;} //就是这个int main
```
argv参数是为了你写脚本或者用DOS命令行,往里进行传参用的,类比python其实就是
```
$ python test.py 203 213 423 # 你写的这些像是203的参数就是传到main()里的argv里了
```
下面开始正文:
==============================
(1)int argc 命令行参数个数
- 用来统计程序运行时发送给main函数的命令行参数的个数(上面那个203等,就是3个)
- ps:命令行参数相当于外部的数据(以空格隔开,要是本身含空格要加上字符串"内容")
(2)char * argv[] 字符串数组
- 用来存放指向字符串的指针元素,每一个指针元素指向一个字符串参数。
- 各成员含义如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUUJZgSj-1665557998931)(https://uploadfiles.nowcoder.com/images/20220627/117138834_1656317545841/8266E4BFEDA1BD42D8F9794EB4EA0A13)]
6、简述一下数组和指针的区别🔥🔥🔥🔥🔥
1.概念:
(1)数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址。
(2)指针:指针相当于一个变量,但是它和普通变量不一样,它存放的是其它变量在内存中的地址。指针名指向了内存的首地址。
2.区别:
(1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝
(2)存储方式:
- 数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,数组的存储空间,不是在静态区就是在栈上。
- 指针:指针本身就是一个变量,作为局部变量时存储在栈上。
(3)求sizeof:
- 数组所占存储空间的内存大小:sizeof(数组名)
- 数组的元素个数: sizeof(数组名)/ sizeof(数据类型)
- 无论指针的类型是什么,32位平台永远是4,64位平台永远是8。
(4)初始化:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0dXIdYj-1665557998932)(https://uploadfiles.nowcoder.com/images/20220627/117138834_1656317554973/F19C9085129709EE14D013BE869DF69B)]
7、简述数组指针与指针数组的区别🔥🔥🔥🔥🔥
- **数组指针:**是一个指针变量,指向了一个一维数组, 如int (*p)[4],(*p)[4]就成了一个二维数组,p也称行指针;
- **指针数组:**是一个数组,只不过数组的元素存储的是指针变量, 如int *p[4]
助记:记住像是这种【指针 数组】AB结构的名词,他永远是个B,就是他一定是后面的那个名词形容的东西。
快些以nlog2n的速度归队
快:快速排序
些:希尔排序
归:归并排序
队:堆排序
这4种排序的平均时间复杂度为nlog2n
设某哈夫曼树中有199个结点,则该哈夫曼树中有()个叶子结点。
正确答案: B 你的答案: A (错误)
99
100
101
102
首先需要明白两个知识点:
1、哈夫曼树中不存在度为1的节点,只有度为0和2的节点
2、n0=n2+1
其次要会求解:
设叶子结点的个数为n0,度为2的节点个数为n2,
则求全部节点数为:n=n0+n2
已知n0=n2+1,代入上式得:n=n2+1+n2=2*n2+1=199(题中给的数据)
求得n2=99,由此可得叶子结点n0=100
具有 12 个结点的完全二叉树有
正确答案: A 你的答案: C (错误)
5个叶子结点
5个度为2的结点
7个分支结点
2个度为1的结点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rb0fwZPn-1665557998933)(https://uploadfiles.nowcoder.com/images/20211105/129457616_1636121426244/CD1B83B96B9B51E75CDEE9CAB01FDE95)]
向二叉排序树中插入一个结点需要比较的次数可能大于该二叉树的高度。( )
正确答案: B 你的答案: A (错误)
正确
错误
先跟根(设为root)节点比较,>root再跟root右子树根节点比较(假设有右子树),<root跟root的左子树根节点比较,重复以上步骤,直至找到合适位置。最坏的情况下为插入到叶子节点下,最多的比较次数为树高。
分别以下列序列构造二叉排序树,与用其他三个序列所构造的结果不同的是()
正确答案: C 你的答案: B (错误)
100, 80, 90, 60, 120, 110, 130
100, 120, 110, 130, 80, 60, 90
100, 60, 80, 90, 120, 110, 130
100, 80, 60, 90, 120, 130, 110
在一个10阶的B-树上,每个树根结点(非根节点)中所含的关键字数目最多允许为()个,最少允许为()个。
正确答案: B 你的答案: B (正确)
10,5
9,4
8,3
7,6
Hash 表的平均查找长度与处理冲突的方法无关。()
正确答案: B 你的答案: B (正确)
正确
错误
哈希表的平均查找长度与冲突处理方法和装填因子有关,但与哈希表长无关
产生哈希冲突的影响因素有哪些( )
正确答案: A B D 你的答案: A B C (错误)
装填因子
哈希函数
哈希表长
处理冲突的方法
表长对冲突的影响,是受装填因子制约的。表再长,装得满满的,就会容易冲突。
在哈希法存储中,冲突指的是 ( )
正确答案: A 你的答案: C (错误)
不同关键字值对应到相同的存储地址
两个数据元素具有相同序号
两个数据元素的关键字值不同,而非关键字值相同
数据元素过多
一个正整数的阶乘是从1连乘到它本身,下面递归函数实现了阶乘的计算,请分析出它的时间复杂度为()
int factorial(unsigned int n)
{
if(i <= 1)
return 1;
else
return n * factorial(n-1);
}
正确答案: C 你的答案: C (正确)
O(1)
O(logN)
O(N)
O(N*logN)
每次递归内部计算时间为常数,所以n的阶乘,需要调用n次递归函数,时间复杂度为O(n)
在 C/C++ 中,若有定义 char a [10], *p=a; ,那么下列赋值语句正确的是( )。
正确答案: D 你的答案: C (错误)
a [] ="abcdefg";
a="abedefg";
*p="abcdefg";
p="abcdefg ";
双引号做了3件事:
1.申请了空间(在常量区),存放了字符串 2. 在字符串尾加上了’/0’
3.返回地址 你这里就是 返回的地址 赋值给了 p
已知串 S= "babab ", 其 Next 数值序列为
正确答案: C 你的答案: A (错误)
01112
01233
01123
01223
首先介绍2个概念,字符串的前缀和后缀(这里的前缀是不包括最后一个字符的子串,后缀是不包含第一个字符的子串)。
拿题目中的字符串a='‘babab’'举例,
首先第一位0,第二位1。这个是固定的。
第三位,字符串是“bab”,这时候“bab”的前缀有b,ba;后缀有ab,b,可以看出前后缀相等的最长的字符串只有b,因为b的长度是1,所以这里第三位的next值就是1。
到了第四位,字符串是“baba”,前缀是b,ba,bab;后缀是aba,ba,a。这里可以看出前后缀相等的最长的字符串是ba,长度是2,因此第四位的next值是2。
到了第五位,字符串是“babab”,前缀是b,ba,bab,baba;后缀是abab,bab,ab,b。这里可以看出前后缀相等的最长的字符串是bab,长度是3,因此第五位的next值是3.
因此综合起来next值就是0 1 1 2 3,也就是答案C。
C/C++ 语言中,在一个存放字符串的数组 char p_str[],要把字符串中第 4 个字符的值改为 ‘a’,正确的做法是?
正确答案: A B 你的答案: A (错误)
p_str[3]='a'
*(p_str+3)='a'
p_str[4]='a'
*(p_str+4)='a'
A,B
数组名是指针,p_str[3] == *(p_str+3)。
字符串常量”A”和字符常量’A’分别由()个字符组成。
正确答案: C 你的答案: B (错误)
1、1
1、2
2、1
2、2
双引号的是字符串常量,字符串末尾会有隐藏的\0;单引号的是字符常量,末尾不会有\0
StringBuffer类与String类相比的区别?
正确答案: D 你的答案: D (正确)
String是一个线程不安全的可修改的字符序列
String是一个线程不安全的不可修改的字符序列
StringBuffer是一个不线程安全的可修改的字符序列
StringBuffer是一个线程安全的可修改的字符序列
1.String字符串是不可变的。 2.在修改字符串操作比较多的时候用StringBuilder或StringBuffer。 StringBuffer线程安全;StringBuilder线程不安全。
● SGD,Momentum,Adagard,Adam原理
参考回答:
SGD为随机梯度下降,每一次迭代计算数据集的mini-batch的梯度,然后对参数进行跟新。
Momentum参考了物理中动量的概念,前几次的梯度也会参与到当前的计算中,但是前几轮的梯度叠加在当前计算中会有一定的衰减。
Adagard在训练的过程中可以自动变更学习的速率,设置一个全局的学习率,而实际的学习率与以往的参数模和的开方成反比。
Adam利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,在经过偏置的校正后,每一次迭代后的学习率都有个确定的范围,使得参数较为平稳。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kbkRD4zA-1665557998936)(假期错题.assets/image-20220713172358620.png)]
一,408复习:
1,什么是前缀树(Tire Tree)
利用字符串的公共前缀进行查询,减少无用的比较
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oOz5pyJ5LiA5oqKZmVuZGVy,size_15,color_FFFFFF,t_70,g_se,x_16
基本性质:
①除了根节点外每个结点都能被一个路径找到;
②每条边对应一个字符,到某个结点路径上扫过的所有字符就是这个结点代表的字符串;
③每个结点向下所有边的字符都不同
2,用两个指针如何判断链表有没有环?
可以设置一快一慢两个指针,快的每次前进两步,慢的每次前进一步,若存在环,快指针最终快慢指针一圈,和慢指针相遇;若不存在环,快指针指向NULL
3,如何将[a1,a2,a3]和[b1,b2,b3]构成的数组交换位置?
先将a1,a2,a3,b1,b2,b3整体逆置,再将b3,b2,b1和a3,a2,a1分别逆置
4,B和B+树的区别和联系,以及各自适用场合
联系:B+树是B树(本质是多叉树)的一种变体
区别:
1)B+树只在叶节点存放记录,其他结点只起到索引作用;B树在所有结点中保存记录
2)B+树的叶节点支持顺序查找,B树不支持
3)B+树n个结点对应n个分叉;B树n个结点对应n+1个分叉
应用:B+树的特性使得他在一个磁盘块中保存更多的关键字,适用于文件索引和数据库索引;
B树:用于磁盘文件组织
5,堆排序的原理
以顺序为例,利用大根堆,每次选择堆顶元素加入排序序列(即与最后一个元素交换位置),再将剩余的元素调整为大根堆,循环往复,直到排序完成。
时间复杂度:O(nlog2n) 要进行n趟,每次调整堆要log2n
6,八皇后问题怎么解决和其时间复杂度
1)问题描述:在一个8×8的棋盘上,摆八个皇后,与皇后同行同列或者同对角线的位置不能摆放
2)解决方法:递归回溯法,在每行试探性的放置一个皇后,若这一行任意位置都无法拜访,则回溯到上一行,改变其位置。直到在每一行上都放置皇后。
3)时间复杂度:找到一种解决方式的复杂度是O(n^2)
7,排序算法知道哪些,哪个是最快的,为什么?
一)插入排序:
①直接插入排序:将序列分为有序和无序两部分,每轮将无序部分的第一个元素插到有序部分中,将比他大的元素都右移,最终找到插入位置。 时间复杂度O(n^2)
②折半插入排序:也将序列分为有序和无序部分,每轮将无序部分的第一个元素插到有序部分中,先利用折半查找找到要插入的位置,将比他大的那部分全部右移。 时间复杂度O(n^2)
③希尔排序:将序列按步长分成多个子表,每个子表用直接插入排序。 时间复杂度无法计算
二)交换排序:
①冒泡排序:每轮从前往后,两两比较元素的大小,将大的排到后面,每轮能确定一个元素的最终位置,若此轮没有交换,则排序提前结束。 时间复杂度O(n^2)
②快速排序:每次确定一个基准元素(一般选的是序列的第一个元素),将比此元素大的移到他的右边,比他小的移到左边,然后对左边和右边的子表进行相同的递归操作。 时间复杂度O(nlog2n)
三)选择排序:
①简单选择排序:将序列分为有序和无序两个部分,每次选择出无序部分中最小的一个元素加入有序部分中。 时间复杂度O(n^2)
②堆排序:(见上述) 时间复杂度O(nlog2n)
四)归并排序:
将k个有序的子序列,归并成一个序列,叫做k路归并。每次归并就是在每个子序列中设一个指针,选择当前指针指向元素中最小的加入新序列,知道全部加入新序列。在一开始,将单个元素都视为一个初始子序列。 时间复杂度O(nlog2n)
五)基数排序:
将每个元素分成多个组,按照每组的取值,对元素进行分配和回收,最后得到有序序列(若要得到递增序列,则最后排权重大的组。) 分成d个组,这个组的取值有r种,分配要n次,回收要r次 时间复杂度O(d(n+r))
性能比较:一般采用速度快,且不用开辟新空间的快速选择排序。(归并排序和堆排序都需要开辟新空间)
对于数据量非常大,且容易分成多个组的元素(如身份证号),用基数排序的效果会更好
8,平衡二叉树和红黑树的区别?
1)平衡二叉树,要保证两个子树的高度差不超过1,查找性能强,但插入删除复杂;
2)红黑树,是一种弱化的平衡二叉树,可以保证最高子树的高度不超过最低的两倍,插入删除较简单。
9,数据结构的字典树和B+树是什么?
字典树就是前缀树,从根结点出发到每一个叶子结点的路径表示一个单词。
B+树是一种分块查找树,所有记录存放在叶子结点中,可以进行顺序查找,n个结点有n个分叉。
(其余见专题文章数据结构面试问题__Melody~的博客-优快云博客)
三)操作系统
(见专题文章操作系统专题__Melody~的博客-优快云博客)
四)计算机组成原理
(见专题文章计算机组成原理专题__Melody~的博客-优快云博客)
二,编程语言
一)C++:
1,C语言定义常量的方法
①宏定义
#define N 3
②使用const
const int N = 3
2,堆和栈的区别
对于用C/C++编译的程序的内存分成以下五个部分:
①栈区:存局部变量,分配类似于栈
②堆区:存malloc或者new开辟的地址空间,分配方式类似于链表
③代码区:存二进制代码
④全局区(静态区):存全局变量、静态变量。(全局区分为已初始化全局区(data)和未初始化全局区(bss))
⑤常量区:存常量字符串
1)管理方式:栈由系统自动分配和释放;堆用new运算符或malloc函数申请,并且手动释放。
2)申请大小:栈的大小一般是连续的一块固定区域,且比较小;堆的空间是空闲的内存空间,不连续且可以分配很大
3)生长方向:栈是向下生长的,即向着内存减小的方向;堆是向上增长的,即向着内存增大的方向 。
总结:堆是自己做菜,自由度高;栈是去菜馆吃饭,快捷方便
3,C和C++的区别
1)C是一种面向过程的语言,针对的是一个个的函数;C++是对C的继承,是面向对象编程的,针对一个个的类。
2)C++中加入了引用的&概念
3)C++可以进行函数重载
4,数据段,代码段和BSS段是什么?
对于用C/C++编译的程序的内存分成以下五个部分:(见上述)
其中全局区中保存全局变量和静态变量,其中未被初始化的是BSS段,初始化了的是数据段。以二进制保存代码中函数的是代码段。
5,说一下什么是多态(用例子)
在C++中,多态的实现主要有函数重载(静态绑定)和函数重写(动态绑定)
函数重载是指在一个类中,函数名相同的函数,所含的参数数量或者类型不同,函数地址在编译期间即绑定;
函数重写是用虚函数实现的,在父类中定义一个虚函数,子类在继承时候重新定义这个虚函数,函数地址在程序运行时候,根据调用的类绑定
6,说一下接口的定义以及抽象类的作用
如果类中至少有一个函数被声明为纯虚函数,则这个类就是一个抽象类,也称为接口。不能被创建为一个实例。
抽象类的作用就是为之后的子类提供一个公共的接口。
纯虚函数是通过在声明中使用 “= 0” 来指定的
7,说一下引用和指针,及其区别?
引用是C++中增加的一个概念,是一个变量的别名,在定义后就不能修改。
指针指向变量的内存,保存的是一段地址。
区别:
引用在定义后就只能指向一个变量,指针可以指向别的;
指针是一个实体,需要分配内存,引用仅仅是一个别名;
指针可以为空,引用必须指向有效的变量
8,析构函数和构造函数干什么用的?
构造函数是创建一个对象前,做初始化工作,如为成员变量赋初值;析构函数是撤销一个对象前做的清理工作,如释放空间等。
注意析构函数和构造函数是不能直接调用的,只能由系统调用
9,C++能用C的库吗?
可以,但C不能用C++的
10,编程中宏定义的作用?
#define MAX 2
可以提高程序的易读性和通用性,便于直接修改。如数组大小常用宏定义。
11,虚函数和纯虚函数的区别?
子类如果要继承带有纯虚函数的父类,必须实现其纯虚函数,但是虚函数可以默认使用父类定义的方法。
12,C++的(inline)内联函数是什么?
指在编译时,直接把调用的函数替换为其代码段
13,什么是内存泄漏?怎么知道内存泄漏了?
指程序已经动态分配的堆内存由于某种原因未释放而导致系统内存浪费的现象。
可以标记每一处申请和释放内存的位置,进行调试
内存溢出是指程序在申请内存的时候,没有足够的内存供他使用。
三,其他专业课
一)数学
1,什么是特征值和特征向量
特征值:设A是n阶方阵,如果存在数m和非零列向量x,使得Ax=mx成立,则m是A的一个特征值
特征向量:x是A对应于m的特征向量(也可以是矩阵)
二)数据库
已知问题
1,数据库事物中ACID指什么?
①事务(Transaction):是将一系列SQL语句作为一个逻辑单元,逻辑单元里面的单个操作要么全做要么全都不做
②ACID:
(Atomicity)原子性:指整个事务是不可分割的工作单位。
(Consistency)一致性:事务不能破坏关系数据的完整性以及业务逻辑上的一致性
(Isolation)隔离性:在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
(Durability)持续性:只要事务成功结束,它对数据库所做的更新就必须永久保存下来
2,NoSQL是什么?
是Not Only SQL,是一种非关系型的数据库,易扩展,数据量大,用于超大规模数据的存储
3,如何优化数据库的查询
1)代数优化:关系代数表达式的优化
具体就是要改变查询语句中操作的次序和组合 最基本的一条就是选择运算要尽可能先做,还有找出公共表达式
2)物理优化:指存取路径和底层操作算法的选择
如建立索引、限制数据字段长度
4,数据库索引是什么?数据字典和数据流图是什么(了解)?
索引好比是一本书的目录,可以加快数据库查询的速度。由B+树实现。
数据字典是各种数据描述的集合,数据流图是数据在系统内的传输路径。
5,数据库基本概念的表述:
数据(D)是仓库中的货物;
数据库(DB)是仓库;
数据库管理系统(DBMS)是仓库管理员;
数据库系统(DBS)是仓库、管理员以及服务部门(数据库管理员和应用程序)
6,常见的数据库管理系统及其特点:
Oracle(甲骨文)是最领先的DBMS,针对大型企业;
SQLSever和MySQL针对中小企业,易学易用,功能全面效率高;
noSQL是非关系型数据库,可应用于超大规模数据的存储。
(其余见专题文章)
7,select底层怎么实现的?
select在底层实现的每一步都会生成一个虚拟表。
首先是获取数据(from),求笛卡尔集,如果有连接操作还需要添加外部行,得到一个虚拟表t1;然后是过滤数据(where),对上一步产生的虚拟表,通过where给的条件,选出符合条件的生成虚拟表t2;
若有分组操作(group by),再进行分组,得到虚拟表t3;
最后用select提取目标字段,得到最终选择的结果。
注意:group by 是某一属性相同的记录划为一组,若要选出这个组,用的是having
8,聚簇索引和非聚簇索引是什么?
1)聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
2)非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行
(其余见专题文章:数据库专题__Melody~的博客-优快云博客)
三)其他
1,人工智能、机器学习和深度学习的关系?
机器学习是人工智能的一种方法,深度学习是机器学习的一种技术,是利用神经网络来提取特征,从而模拟人脑来解释图片、文字的方法。
注意:
监督学习:用已经贴上标签的样本来进行训练,用学到的特征来对无标签的样本贴标签,多用于分类问题。
无监督学习:用没有标签的样本进行训练,让他用自己学到的样本间的相似性进行分类,多用于聚类问题。
半监督学习:有两个样本集,一个有标签,一个没有标签,综合利用他们进行训练。
深度学习也有有监督和无监督的
二,简历中可能出现复试问题
一)LINUX操作
1,在一个文件夹下,怎么用命令找含有某字段的文件?
1)找文件名中有这个字段的命令:find ./model -name out
(find + 【路径】 + -name + 【内容】*表示字段前后的内容)
2)找文件内容中有这个字段的命令:grep 【字段】 【文件路径】
2,Linux重定向是怎么回事?
Linux有三种数据流:
输入信息会从 stdin 中读取(标准输入,通常是键盘或鼠标)。
输出信息会被输出到 stdout (标准输出,一个文本文件或者数据流)。
错误信息会被输出到 stderr
用大于号>重定向输出 用小于号<重定向输入
3,Linux进程同步怎么实现?
主要有两种方法实现进程同步:
1)信号量机制:设置一个信号量,前v后p
2)使用管程中的条件变量:将进程阻塞并且添加到条件变量队列上,按顺序唤醒
4,gdb是什么?
gdb是Linux下的一种程序调试工具
5,linux文件权限怎么看?
命令:ls -l 【文件名 】
权限有rwx三种,对应4、2、1,分为所有者user、群组group、其他人other
改变权限 用 chmod 661 【文件名】
6,Linux如何免密登录?
这里写图片描述
A要免密登录到B,B首先要有A的公匙,然后B做一次加密验证(随机生成一个字符串,用公匙加密,看A能不能用私匙解开)。
公匙加密后的数据只有私匙才能解开,属于非对称加密。
1,常见的数据结构有哪些
从逻辑角度看有
1)线性结构:线性表、栈、队列、数组(是线性表的推广)
2)非线性结构:树、图、集合
2,数组(顺序表)和链表的区别
1)存取方式:顺序表可以随机存取也可顺序存取;链表只能顺序存取(最重要)
2)空间分配:顺序表可以静态分配和动态分配;链式存储随意分配
3)逻辑结构和物理结构:顺序表逻辑上相邻物理上也相邻;链式分配逻辑相邻物理上不一定相邻
3,常用链表有哪些
1)单链表
2)双链表:设置一头一尾两个指针
3)循环列表:有循环单链表和循环双链表
4)静态链表:用下标表示下一个结点(要分配连续的空间)
4,什么是平衡二叉树
二叉树上任意结点的左子树和右子树高度之差不超过1
5,简述KMP算法
在主串和模式串匹配时,主串指针一直往前不回溯,模式串指针回溯,回溯的位置保存在next数组中,可以避免无效的比较。
模式串、主串长度分别为m和n,时间复杂度为O(m+n)
若不使用KMP算法,时间复杂度是 O(m*n)
KMP的改进:若这个不匹配的字符是g 对应的next也指向g,则可以直接跳到最终指向的位置。引入了nextval数组
6,贪心算法、动态规划和分治法的区别
1)贪心算法:在每一步都按照一定策略选择当前的最优解,最后得到的结果不一定是最优解。
2)分治法:将一个大的问题划分为多个相互独立的子问题,来各个求解。
3)动态规划:相当于将分治法中重复的子问题的结果保存起来,再次出现时,直接使用。是一种用空间换时间的算法。
7,快速排序的改进
快速排序是典型的分治法,对于一个序列,选择一个元素作为基准元素,比他小的移到左边,比他大的移到右边,每轮确定一个元素的位置,然后对子序列进行相同操作。
时间复杂度O(nlogn)
最坏情况是原序列有序 回到O(n^2)
优化方法:因为每次选序列第一个元素作为基准,可能导致比较次数过多,所以用“三数取中”的方法,取一个序列的第一个,中间的,最后一个元素中中间值作为基准。
8,循环比递归效率高吗
一般情况下,循环的效率更高,因为递归要用到栈,开辟新的空间,且会有很多的重复计算。
9,图的遍历和树的遍历有什么区别
树是一种特殊的图
树中的层次遍历就是BFS
树中的先中后序遍历就是DFS
10,数据的逻辑结构有哪些?物理结构有哪些
逻辑结构见上
物理结构有顺序结构和链式结构
11,算法的五个特征
答:
有穷性:算法必须在执行有限的步骤后结束
确定性:对于相同的输入,结果必须是确定的
可行性:算法由基本操作执行有限次实习
输入:一个算法必须有0个或者多个输入
输出:一个算法必须有0个或者多个输出
12,头指针和头结点的区别?
头指针表明了链表存储空间的起始位置,是必须有的;头结点是为了方便编程而定义的一个不带信息的结点,对有带头指针的链表,头指针指向头结点,对不带头指针的非空链表,头指针指向第一个元素。
13,最小生成树是什么?
生成树:包含图的所有顶点,含尽可能少的边的连通图
最小生成树(MST)是带权路径之和最小的那颗生成树
求MST的算法有Prim算法(每次选择一个和当前集合最近的结点加入)和Kruskal算法(使用并查集)
14,深度优先搜索和广度优先搜索
BFS:从某一结点出发,访问此结点未被访问过的所有邻接结点,再用同样规则访问这些结点,直到遍历完成(使用队列实现)
DFS:从某一结点出发,访问与其邻接的任一结点,再从这一结点开始访问,若不能继续向下访问,则退回上一个结点。(使用栈实现)
15,什么是并查集
分为并和查两个操作,用一个数组保存每个元素的父节点,初始为-1
并:是将此结点的父节点该为目标根节点
查:找到这个结点的根节点
应用:kruskal算法,先将所有边的权值递增排序,然后依次看这个边的结点在不在当前并查集中,若不在的话,则选中此边并且加入并查集。
7,进程同步应遵循的原则:
1)空闲让进 2)忙则等待 3)有限等待 4)让权等待、
7,select底层怎么实现的?
select在底层实现的每一步都会生成一个虚拟表。
首先是获取数据(from),求笛卡尔集,如果有连接操作还需要添加外部行,得到一个虚拟表t1;然后是过滤数据(where),对上一步产生的虚拟表,通过where给的条件,选出符合条件的生成虚拟表t2;
若有分组操作(group by),再进行分组,得到虚拟表t3;
最后用select提取目标字段,得到最终选择的结果。
注意:group by 是某一属性相同的记录划为一组,若要选出这个组,用的是having
矩阵的秩
从子式的角度定义:矩阵的秩就是矩阵中非零子式的最高阶数。
矩阵的迹
矩阵的迹方阵 A(n*n) 的迹定义为对角线元素的和
-
特征值和特征向量
-
1) 定义对方阵 A 满足:Ax=λx,其中 x 为非零向量,则称 x 为特征向量,λ 为特征值。
-
全概率公式、贝叶斯公式与先验、后验概率的关系?
全概率公式,总结几种因素,事情发生的概率的并集。
由因求果。贝叶斯公式,事情已经发生,计算引起结果的各因素的概率,由果寻因。
同后验概率。全概率是用原因推结果,贝叶斯是用结果推原因。
- 大数定律随机变量的均值依概率收敛于自己的期望。
中心极限定理是说当样本数量无穷大的时候,样本均值的分布呈现正态分布。
3) 多元函数连续、可(偏)导、可微的关系
tcp为什么要三次握手,tcp为什么可靠。
为什么不能两次握手:(防止已失效的连接请求又传送到服务器端,因而产生错误)
假设改为两次握手,client端发送的一个连接请求在服务器滞留了,这个连接请求是无效的,client已经是closed的状态了,而服务器认为client想要建立
一个新的连接,于是向client发送确认报文段,而client端是closed状态,无论收到什么报文都会丢弃。而如果是两次握手的话,此时就已经建立连接了。
服务器此时会一直等到client端发来数据,这样就浪费掉很多server端的资源。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,我们也未必全部数据都发送给对方了,所以我们不可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,我们的ACK和FIN一般都会分开发送。
PCA (Principal Component Analysis)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,并期望在所投影的维度上数据的方差最大,以此使用较少的数据维度,同时保留住较多的原数据点的特性。
PCA算法流程
基本思想
1.第1轮将待排序的每个元素个位数取出,依次放入对应的桶里,并从桶依次取出数据放入原来的数组
2.第2轮将待排序的每个元素十位数取出,依次放入对应的桶里,并从桶依次取出数据放入原来的数组
3.第n轮将待排序的元素按每个位数分别比较,并从桶依次取出数据放入原来的数组,以此类推
4.按照桶的顺序,依次取出数据,放入原来的数组里
————————————————
原文链接:https://blog.youkuaiyun.com/weixin_45857153/article/details/110492602
网络型防火墙:软件
主机型防火墙:硬件+软件
(3)电子邮件使用的协议(SMTP、POP3)
1.邮件发送协议:用于用户代理向邮件服务器发送邮件或在邮件服务器之间发送邮件,通常使用的是SMTP
2.邮件读取协议: 用于用户代理从邮件服务器读取邮件,如POP3
SMTP采用的是”推“(Push)的通信方式,即在用户代理向邮件服务器发送邮件及在邮件服务器之间发送邮件时,SMTP客户端主动将邮件“推”送到SMTP服务器端
POP3采用的是“拉”(Pull)的通信方式,即用户读取邮件时,用户代理向邮件服务器发出请求,“拉”取用户邮箱中的邮件
防火墙是什么?防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障,是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成
事件最早发生时间:
事件最晚发生时间:
这两个做差:如果结果为0那就是关键路径上的一环
活动最早发生时间:
活动最晚发生时间:
它们都是用来对工程建模的,但它们还是有很大的区别,主要体现在AOV网是顶点表示活动的网,它只描述了活动之间的约束关系,而AOE网是用有向边表示活动,边上的权值表示活动持续的时间。AOE网是建立在AOV网基础之上(活动之间约束关系没有矛盾),再来分析完成整个工程至少需要多少时间,或者为缩短完成工程所需时间,应当加快那些活动等问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUSTMb0A-1665557998939)(假期错题.assets/image-20220714143645223.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7WftB7j-1665557998939)(假期错题.assets/image-20220714143633222.png)]
BFS的调用次数就是该图的连通分量的个数;
DFS调用次数取决于二叉树的节点;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LH3Qoh9w-1665557998939)(假期错题.assets/image-20220714153824014.png)]
/**
- ReduceTemplate
- @author yjh
- @since 2020/11/23
*/
public class ReduceTemplate {
// final int MAX_LEVEL = 10;
//
// public void reduce(int level, int param){
//
// //终结条件
// if( level > MAX_LEVEL){
// //处理并返回
// return;
// }
//
// //处理当前逻辑
// processCurrentLogic(level, param);
//
// //往下层递归
// reduce(level: level+1, newParam);
//
// //存储或恢复当前状态,可以用来比如进行尾递归
// }
}
照桶的顺序,依次取出数据,放入原来的数组里
————————————————
网络型防火墙:软件
主机型防火墙:硬件+软件
(3)电子邮件使用的协议(SMTP、POP3)
1.邮件发送协议:用于用户代理向邮件服务器发送邮件或在邮件服务器之间发送邮件,通常使用的是SMTP
2.邮件读取协议: 用于用户代理从邮件服务器读取邮件,如POP3
SMTP采用的是”推“(Push)的通信方式,即在用户代理向邮件服务器发送邮件及在邮件服务器之间发送邮件时,SMTP客户端主动将邮件“推”送到SMTP服务器端
POP3采用的是“拉”(Pull)的通信方式,即用户读取邮件时,用户代理向邮件服务器发出请求,“拉”取用户邮箱中的邮件
防火墙是什么?防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障,是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成
事件最早发生时间:
事件最晚发生时间:
这两个做差:如果结果为0那就是关键路径上的一环
活动最早发生时间:
活动最晚发生时间:
它们都是用来对工程建模的,但它们还是有很大的区别,主要体现在AOV网是顶点表示活动的网,它只描述了活动之间的约束关系,而AOE网是用有向边表示活动,边上的权值表示活动持续的时间。AOE网是建立在AOV网基础之上(活动之间约束关系没有矛盾),再来分析完成整个工程至少需要多少时间,或者为缩短完成工程所需时间,应当加快那些活动等问题。
[外链图片转存中…(img-YUSTMb0A-1665557998939)]
[外链图片转存中…(img-l7WftB7j-1665557998939)]
BFS的调用次数就是该图的连通分量的个数;
DFS调用次数取决于二叉树的节点;
[外链图片转存中…(img-LH3Qoh9w-1665557998939)]
/**
- ReduceTemplate
- @author yjh
- @since 2020/11/23
*/
public class ReduceTemplate {
// final int MAX_LEVEL = 10;
//
// public void reduce(int level, int param){
//
// //终结条件
// if( level > MAX_LEVEL){
// //处理并返回
// return;
// }
//
// //处理当前逻辑
// processCurrentLogic(level, param);
//
// //往下层递归
// reduce(level: level+1, newParam);
//
// //存储或恢复当前状态,可以用来比如进行尾递归
// }
}