以下的专业相关基础问题,是在2022年暑期准备面试过程中,断断续续准备的,最终上岸厦大啦,也希望这些内容对后面准备保研的学弟学妹们有帮助。少即是多、快即是慢,希望大家也不必太焦虑,慢慢来比较快!
数据结构
堆、栈、队列、链表等数据结构
树:红黑树、二叉树的各类分支等
图:欧拉图:哈密顿图
查找算法、哈希算法等
Q:数据结构的定义
逻辑结构(集合、线性结构、树形结构、网状结构)、存储结构、数据的运算
Q:数组与链表的区别
数组的存储空间是栈上分配的,存储密度大,当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组存储数据;链表的存储空间是堆上动态申请的,当要求存储的长度变化较大时,且事先无法估量数据规模,宜采用链表存储;
(1)数组在内存中连续; (2)使用数组之前,必须事先固定数组长度,不支持动态改变数组大小;(3) 数组元素增加时,有可能会数组越界;(4) 数组元素减少时,会造成内存浪费;(5)数组增删时需要移动其它元素;
(1)链表采用动态内存分配的方式,在内存中不连续 (2)支持动态增加或者删除元素 (3)需要时可以使用malloc或者new来申请内存,不用时使用free或者delete来释放内存
Q:哈希表,冲突怎么处理
是根据关键字和值(Key-Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度
1、开放地址法。基于该重复地址,对地址进行增量,线性探测再散列,二次探测再散列,伪随机探测再散列。
2、链地址法。将所有按给定的哈希函数求得的哈希地址相同的关键字存储在同一线性链表中,且使链表按关键字有序,链地址法适用于经常进行插入和删除的情况。
3、再哈希法,同时构造多个不同的哈希函数
Q: 二叉搜索树的优缺点(查找可,但是维护不可)
优点:查找效率高,插入删除操作算法简单,时间复杂度与查找差不多
缺点:根据插入顺序的不同,二叉搜索树最坏情况下可能会退化为单支树,也就是所有的节点在同一侧,这时查找的时间复杂度就是O(N)
平衡二叉树:是严格平衡的BST(平衡因子不超过1)。那么查找过程与BST一样,只是AVL不会出现最差情况的BST(单支树)。因此查找效率最好,最坏情况都是O(logN)数量级的;
二叉平衡树的严格平衡策略以牺牲建立查找结构(插入,删除操作)的代价,换来了稳定的O(logN) 的查找时间复杂度
红黑树:排序二叉树有不平衡的问题,可能左子树很长但是右子树很短,造成查询时性能不佳(logn退化成n),完全平衡的二叉树能保证层数平均,从而查询效率高,但是维护又很麻烦,每次插入和删除有很大的可能要大幅调整树结构。红黑树就是介于完全不平衡和完全平衡之间的一种二叉树,通过每个节点有红黑两种颜色、从节点到任意叶子节点会经过相同数量的黑色节点等一系列规则,实现了【树的层数最大也只会有两倍的差距】,这样既能提高插入和删除的效率,又能让树相对平衡从而有还不错的查询效率。
Q: 红黑树的概念与性质介绍
自平衡的二叉查找树,1.结点是红色或黑色。2.根结点是黑色。3.每个叶子结点都是黑色的空结点(NIL结点)。4 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两相个连续的红色结点)5.从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点 左右深度差一倍以内,查找时间复杂度O(logN)
Q: 红黑树的应用,能是否实现过红黑树?
一般用于内存的排序,时间复杂度较低,为O(logn),STL中map和set内部使用的就是红黑树,Linux进程调度 CFS
typedef int KEY_TYPE;
typedef struct _rbtree_node {
unsigned char color;
struct _rbtree_node *right;
struct _rbtree_node *left;
struct _rbtree_node *parent;
KEY_TYPE key;
void *value;
} rbtree_node;
typedef struct _rbtree {
rbtree_node *root;
rbtree_node *nil;//定义一个通用叶子节点,因为叶子节点是黑,并且左右子树都为空, 直接定义一个通用的叶子节点,如果节点是这个公共的叶子节点,那么就判断当前节点是叶子节点
} rbtree;
Q:在一定量数据中查找数据的方法:
有序数组。这种方式的存储结构,优点是支持数据的随机访问,并且可以采用二分查找算法降低查找操作的复杂度。缺点同样很明显,插入和删除数据时,为了保持元素的有序性,需要进行大量的移动数据的操作。
二叉查找树。如果需要一个既支持高效的二分查找算法,又能快速的进行插入和删除操作的数据结构,那首先就是二叉查找树莫属了。缺点是在某些极端情况下,二叉查找树有可能变成一个线性链表。
平衡二叉树。二叉树表示不服,于是基于二叉查找树的优点,对其缺点进行改进,引入了平衡的概念。根据平衡算法的不同,具体实现有AVL树 /
跳跃表。跳跃表让已排序的数据分布在多层次的链表结构中,同样支持对数据进行高效的查找,插入和删除数据操作也比较简单,最重要的就是实现比较平衡二叉树真是轻量几个数量级。缺点就是存在一定数据冗余。
Q:并查集
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。
查找(Find):查询两个元素是否在同一个集合中
合并(Union):把两个不相交的集合合并为一个集合
路径压缩:用于提高并查集的效率
Q:哈夫曼树、前缀树(字典树)
是一类带权路径最短的树,用于通讯及数据传送中构造传输效率最高的二进制编码(哈夫曼编码),用于编程中构造平均执行时间最短的最佳判断过程;
前缀匹配,词频统计(trie树来压缩下空间,因为公共前缀都是用一个节点保存的)
Q:图的表示:邻接矩阵和邻接表
图的表示:邻接矩阵和邻接表,
Q:DFS
每一次都是沿着路径到不能再前进时才退回到最近的岔道口,并前往访问那些未访问分支顶点,直到遍历完整个图;
Q:连通分量
在无向图中,如果两个顶点之间可以互相到达(可以是通过路径间接到达),那么称这两个顶点连通;
如果图G(V,E)的任意两个顶点都连通,则称G为连通图;否则,称G为非连通图,且称其中的极大连通子图为连通分量。
强连通分量:如果两个顶点可以各自通过一条有向路径到达另一个顶点,就称这两个顶点强连通。如果图G(V,E)的任意两个顶点都强连通,则称图G为强连通图;否则,称图G为非强连通图,且称其中的极大强连通子图为强连通分量。
Q:如何判断有向图是否有环?
拓扑排序:在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。
先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。一直做改操作,直到所有的节点都被分离出来。如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序
深度优先搜索:对一个图进行DFS, 则DFS的路径可以生成一个棵树;对于DFS树上的结点,如果存在指向祖先的边或指向自己边,则图存在回路;该方法的时间复杂度与DFS遍历的时间复杂度相同,为O ( V + E ) O(V + E)O(V+E)
Q:欧拉图
通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路,具有欧拉回路的无向图称为欧拉图;通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路。具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图。
1.对于无向图 G , G 是欧拉图当且仅当 G 是连通的且没有奇度顶点。
2.对于无向图 G , G 是半欧拉图当且仅当 G 是连通的且 G 中恰有 0 个或 2 个奇度顶点。
3.对于有向图 G , 是欧拉图当且仅当 G 的所有顶点属于同一个强连通分量且每个顶点的入度和出度相同。
Q:关键路径
AOE网,边表示活动的网络。AOE网中仅有一个入度为0的顶点,称为源点,仅有一个出度为0的顶点,称为汇点。从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径,而关键路径上的活动称为关键活动。完成整个工程的最短时间就是关键路径的长度,若关键活动不能按时完成,则整个工程的完成时间就会延长。只要找到了关键路径,就可以得出最短完成时间。
算法
常用算法:
不会超过动态规划
算法复杂度的计算方法
具体的排序算法、数据结构算法如最小生成树、最短路径等、深搜与广搜、模式匹配等
网站刷题
Q; 基本编程算法问题,讲述你最喜欢的算法?你熟悉的算法?应用场景,改进方向
Q:动态规划与分治算法?
1.动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
2.与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )
3.动态规划可以通过填表的方式来逐步推进,得到最优解。
Q:算法定义
算法是解题的方法和步骤,衡量算法的标准,有穷性、正确性、可行性、零个或多个的输入
一个或多个的输出;时间复杂度:程序大概要执行的次数,而非执行的时间(时间和机器有关);空间复杂度:程序执行过程中大概所占用的最大内存空间;正确性、可读性、稳健性、高效率低存储
Q:各个排序算法的时间复杂度;快排和哈希排序,具体算法流程与步骤,算法的特点
Q:迪杰斯特拉算法与弗洛伊德算法
1.带权图的单源最短路径问题,是一个贪心算法,只是Dijkstra算法更适合求图中给定两点的最短距离和路径,求每对顶点之间的距离计算量比较大;
2.Floyd算法是经典的动态规划算法,1) 设置顶点 vi 到顶点 vk 的最短路径已知为 Lik,顶点 vk 到 vj 的最短路径已知为 Lkj,顶点 vi 到 vj 的路径为 Lij, 则 vi 到 vj 的最短路径为:min((Lik+Lkj),Lij),vk 的取值为图中所有顶点,则可获得 vi 到 vj 的最短路径
2)至于 vi 到 vk 的最短路径 Lik 或者 vk 到 vj 的最短路径 Lkj,是以同样的方式获得
时间复杂度:O(n²),佛洛依德算法的时间复杂度为O(n^3)
空间复杂度:O ( n ),O ( n 2 )
Q:最小生成树,prim和kusral
Prim:时间复杂度为O(n²),首先我们确定一根节点,然后从此节点出发,利用贪心算法寻找权值最小的边。逐步扩大所含顶点的数目,直到遍及连通图的所有顶点。
Kusral,时间复杂度为O(eloge)(e为网中的边数),所以,适合于求边稀疏的网的最小生成树,令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止
Q:中序遍历二叉树,而且允许用递归来做;
运用栈来实现;
void INOrderTraverse(BiTNode *T){
if(T){
INOrderTraverse(T->lchild); // 遍历左孩子
displayElem(T); // 调用操作结点数据的函数方法
INOrderTraverse(T->rchild); // 遍历右孩子
}
// 如果结点为空,返回上一层
return;
}
Q:如何提高基数排序速度?
通过基数排序的复杂度可以看出,影响复杂度的很大一个参数是基数的选择。很多人在使用基数排序时都会默认基数为10,但是这样会显著增大算法复杂度的常量,因而在数组长度较大时,选用较大的基数可能会使性能更好。我们将算法的基数改为1000
Q:分治思想和动态规划思想中的联系与区别
Q:NP问题和动态规划的联系与区别
Q:删去数组中连续的数据如何实现?删除字符串i到j
计算机语言
C++:面向对象,继承、封装、多态,虚函数,纯虚函数
C语言:指针、内部存储、实现机制等
Python语言
Java语言
Q:指针在底层是如何实现的?
Q:熟悉掌握的编程语言有哪些?
Q:python和C++在底层上的区别
Q:java和python区别,怎么理解面向对象,接口是什么
Java是一种静态类型语言,Python是一种动态类型语言,Python的变量是动态的,而java的变量是静态的,需要事先声明;
Python有好多程序用的是面向过程设计方法,class在Python中是后加入的,而java是为了实现没有指针的c++,主要采用面向对象的设计方法,很多概念是oop的概念。面向过程,相对简洁直观,面向对象,相对抽象优雅,但容易过度抽象;
Python的库强大,无论gpu运行,神经网络,智能算法,数据分析,图像处理,科学计算,各式各样的库可以使用,而java没有Python那么多的开源库,很多库是商业公司内部使用,或发布出来只是一个jar包,看不到原始代码;
java偏向于商业开发,Python适合于数据分析;
是一种编程思想,从面向过程过渡而来的,面向过程的思维方式,它更加注重这个事情的每一个步骤以及顺序,比较直接高效,需要做什么可以直接开始编程;面向对象的思维方式,它更加注重事情有哪些参与者,需求里面有哪些对象,这些对象各自需要做些什么事情。将其拆解成一个个模块和对象,这样会更易于维护和拓展。
把数据及对数据的操作方法放在一起,作为一个相互依存的整体–对象。对同类对象抽象其共性,形成类。类中的大多数数据,只能在本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。简单讲就是说万物皆对象。
封装、继承、多态;
Q:JAVA面向对象编程有三大特性:封装、继承、多态
封装:核心思想就是“隐藏细节”、“数据安全”,将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。所有的内容对外部不可见。
继承:子类可以继承父类的属性和方法,并对其进行拓展。将其他的功能继承下来继续发展 。
多态:同一种类型的对象执行同一个方法时可以表现出不同的行为特征。通过继承的上下转型、接口的回调以及方法的重写和重载可以实现多态。方法的重载本身就是一个多态性的体现。
Q:指针和引用的区别
指针:是保存另一个变量内存地址的变量,指针通过 * 访问保存的内存地址所指向的值;
引用:是另一个变量的别名,一旦被初始化就不能被改变,引用可以认为是一个具有自动间接性的常量指针,相当于编译器帮助实现了自动间接性取值,即:编译器帮助加上了 * ;引用内部实现为指针。
1.指针可以先定义,再初始化,可以重复赋值。引用必须定义时初始化,一旦被初始化,就不能改变,类似于 const 定义常量
2.指针变量有地址,而引用的地址是引用变量的地址;
3.指针可以使用 NULL 赋值为空,引用不可以;
4.指针可以多级,引用只能一级;
5.指针需要 (*)来引用值,而引用可以直接取值。
6.指针支持算术运算,而引用不能。
Q:递归与引用的区别?
递归: 它是指一段程序直接或者间接调用自身的一种方法,它可以把一个复杂并且庞大的问题简单化,通过专注于解决它分化出来的小问题从而解决大问题。
引用,不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它与引用的变量共用同一块内存空间。
Q:什么情况下使用析构函数?
构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。
析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等
当我们在类中声明了一些指针变量时,我们一般就在析构函数中进行释放空间,因为系统并不会释放指针变量指向的空间,我们需要自己来delete,而一般这个delete就放在析构函数里面。
Q:static静态变量用法?
希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。这时就应该指定该局部变量为静态局部变量(static local variable)。
静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放;(2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,(3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量);(4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
Q:Java有没有指针?
没有指针的定义,所有的对象变量都是指针,没有非指针的对象变量,想不用指针都不行,这就是指针的泛化和强化。
不叫指针了,就叫对象变量,这就是概念上的淡化和弱化。 没有了指针的加减运算,也没有了*、->等运算符,这是对指针的简单化。
Q:Java的GC原理?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。CPU与内存以及IO之间存在着巨大的性能差异。
Q:C++和java的区别?
Java 比C++更加可靠,语法更加简洁,完全面向对象,Java运行在JVM上可移植性更强,java不需要对于内存进行分配与回收,都是自动进行的;没有指针的概念而是直接使用数组;使用接口代替了C++的多继承;
Q:引用是否可以传参数?
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
相当于一个指针,引用类型传递时相当于指针的指向的传递。
Q: C语言的malloc函数?C语言return返回多个值?
在堆栈当中进行内存块的申请,返回的是void* 需要进行强制类型转换,使用free进行释放;
使用全局变量,从定义变量到程序结束;
数组地址法,返回值元素定义为一个数组,并使用数组的地址作为形参;
结构体地址法,结构体指针传递给形参结构体指针;
Q:栈溢出的原因
函数调用太深,例如递归;动态申请空间后没有释放;
Q: 程序编译执行过程?
编译、汇编、链接、载入
Q:给你5000行代码你会怎么办?
计算机网络
计算机网络:七层模型、各类通信协议、各层传输过程等
Q:计算机网络,OSI七层模型的分层思想是不是也是分而治之的思想
分层主要是分工进行,让功能区块化,但是分而治之每一小部分是没有联系的,而七层模型中,每一层的服务都是基于下一层的
Q:各层及各层的协议
传输层主要是为进程提供通用数据传输服务,包含可靠不可靠传输、差错控制、流量控制、复用分用等;
网络层主要是为主机提供数据传输服务,包含路由选择、差错控制、流量控制、拥塞控制等;数据链路层主要是为同一链路的主机提供数据传输服务,包含成帧、差错控制、流量控制、访问控制等;
物理层主要是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体,即尽可能屏蔽传输媒体和通信手段的差异。
Q:电路交换,报文交换和分组交换的区别?
Q:计算机网络:三次握手
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。已失效的连接请求报文段:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。
Q:计网的四次挥手
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。
Q:客户端TIME_WAIT状态的意义是什么?
第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。
MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
Q: 什么是流量控制?流量控制的目的?
如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。
Q: 如何实现流量控制?
主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。
Q: 流量控制引发的死锁?怎么避免死锁的发生?
当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。
为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生
Q:简述拥塞控制、窗口
① 慢开始算法② 拥塞避免算法③ 快重传算法④ 快恢复算法
快重传即收到三个连续的确认就立即重传,这样就不会出现超时,发送方就不会误认为出现了网络拥塞。(慢开始门限)
我们在前面提到过发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么由于引入了拥塞窗口的概念后,此时发送窗口的值是 swnd = min (cwnd , rwnd),也就是拥塞窗口和接收窗口中的最小值。
拥塞窗口cwnd变化的规则:
只要网络中没有出现拥塞,cwnd就会增大;
但网络中出现了拥塞,cwnd就减少;
Q:拥塞控制和流量控制的区别
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
Q:为什么有了MAC地址,还需要IP地址
由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要是这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。但统一的IP地址把这个复杂问题解决了。连接到因特网的主机只需拥有统一的IP地址,它们之间的通信就像连接在同一个网络(虚拟互连网络或者简称IP网)上那么简单方便,因为调用ARP的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。
Q:计算机网络中核心思想
1.分布式思想–分组交换
2. 分层思想:分层好处是降低耦合,上层不关心底层实现,只关心底层提供服务(接口);
这样层与层之间通信就可以标准化。标准化意味着层与层之间独立性。,可以独自发展,这样设计带来很大灵活性和扩展性,比如传输层有TCP/UDP/DCCP/STCP等,网络层有IPv4/IPv6等, 数据链路层有以太网,VLAN,WIFI,无线3G,4G,5G协议等;分层模式拥有递归特性,该特性允许逻辑意义的任意封装和再封装,比如overlay网络,VPN,各种tunnel等,使网络扩展性大大增强;
3.公平思想–传输控制:TCP的拥塞控制使网络更加公平和稳定,提高系统的容错率,让系统可以持续正常运转;
Q:http与https的区别?
1、HTTP是明文传输,HTTPS则是有安全性的SSL加密传输协议。
2、HTTP的端口用80,HTTPS的端口用443。
3、HTTP的连接是无状态的,HTTPS协议是由SSL+HTTP协议构建的。
(无状态的意思是数据包的发、传输和接收都是相互独立的)
Q:数据链路层与传输层的流量控制的关联与区别?
1.数据链路层的流量控制是点对点的,而传输层的流量控制是端到端的。
2.数据链路层流量控制的手段是接收方收不下就不回复确认帧。传输层的流量控制手段是接收端通过滑动窗口告诉发送方。
Q:数据链路层与网络层的安全如何保障?
Q;数据链路层的数据是否可以直接转发至子网?
Q:NAT?ARQ协议?ICMP协议?
Q:同步传输与异步传输?
Q:TCP与udp的区别?
操作系统
操作系统:作业调度、进程调度、内存管理等
Q:进程和线程,线程与进程的异同点
进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位(也可以理解为进程当中的一条执行流程);
线程是进程的一部分;同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的;一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
Q:OS实现什么?
是计算机硬件上的第一层软件,对于硬件系统的首次扩充,是计算机系统资源的管理者(文件、设备、处理机、存储器),是用户与计算机之间的接口(命令接口,GUI图形用户接口),具有并发(并行,多CPU),共享、虚拟、异步(由于资源有限,进程的执行不是一贯到底,而是以不可预知二等速度向前推进);
Q: 中断相关?
中断使得CPU由内核态变为用户态,夺回操作系统对于CPU的控制
中断是否与正在执行的指令相关,内中断,外中断(时钟中断,I\O设备中断)
每执行一条指令,检查是否由外部中断;中断类型->中断向量表;
应用程序可以通过系统调用来请求获得操作系统内核的服务,系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求;
Q: 互斥锁如何解决临界区的资源问题?
多个并发进程都需要访问临界区的资源时候,只能有一个进程可以进去临界区访问,其他进程不可以访问,其他进程需要等到进入临界区的进程访问结束后,才有资格访问临界区,这就是互斥;
Q:生产者消费者模型
Q:调度算法
其他专业课(数据库、软件工程、计算机组成原理、密码学)
数据库:关系数据库模型、视图等
软件工程:软件开发模型
Q:计组的衡量计算机的性能指标
CPU的综合性能、存储容量、数据的输入\输出能力(即I\O吞吐率)、响应时间和功耗等。
Q: 视图
是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储,对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,多表视图一般用于查询,不会改变基本表的数据。
Q:数据库的视图,数据库的物理与逻辑结构
Q:SQL注入基本原理是什么?
Q:数据库事务原子操作如何实现?内存泄露?
Q:软件开发模型
软件的生命周期分为6个阶段,即需求分析、计划、设计、编码、测试、运行维护。
1.瀑布模型:每个阶段都只执行一次,因此是线性顺序的软件开发模型。
2. 螺旋模型:是渐进式开发模型的代表之一。
3. 迭代模型:迭代模型是类似小型的瀑布式项目。每一个迭代都会产生一个可以发布的产品,这个产品是最终产品的一个子集。
4. 增量模型:采用随时间进展而交错的线性序列。
5. 敏捷模型:敏捷模型是一种轻量、高效、低风险、更强调团队协作和沟通的开发方式,适合于中小型开发团队,客户需求模糊或多变。
Q:为什么要进行软件测试,目标是什么?
软件测试就是为了发现软件产品中错误和缺陷,然后软件开发人员对错误和缺陷进行修复,提高软件的质量,最后提交一个满足用户需求的软件产品。
Q:密码学
AES、DES
哈希函数SHA256,SHA3,SM3:哈希(散列、杂凑)函数,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数,又被成为信息指纹。
Q:哈希函数的特点:
压缩:输入为任意长度,输出是固定长度;>高效:计算速度快;
单向性:由哈希值得到输入是计算不可行的;
抗碰撞性:
弱碰撞性:给定x1,找到x2≠x使得H(x1)
=H(X2);
强碰撞性:找到一对x1和xz使得H(1)= H(x;
灵敏性:明文的一比特变化对散列值由明显影响
数字签名:是签名者利用其私钥和消息产生的别人无法伪造的一段数字串,这段数字串的有效性可以利用签名者的公钥和消息来验证。
椭圆曲线数字签名算法(ECDSA)SM2是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。
区块链是一种安全共享的去中心化的数据账本。区块链技术支持一组特定的参与方共享数据。它可以收集和共享多个来源的事务数据能够将数据细分为以哈希形式的唯一标识符链接在一起的共享区块,并通过单一信息源确保数据完整性,消除数据重复,提高数据安全性。相关技术:哈希函数(SHA-256)、数字签名算法(ECDSA)等
Q:RSA加密算法
其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)
非对称的加密算法,单向函数正向求解简单,逆向求解复杂,信息接受方生成公钥与私钥,将公钥公布,发送方将原文与接收方的公钥运算得到密文,接受方通过密文与私钥进行解密
数学
Q:什么是二元关系?
二元关系主要是描述两个集合之间元素与元素的关系或者是一个集合内部元素之间的关系;给定两个集合 A 和 B,R 是笛卡儿积 A × B 的任意子集,则称 R 为从 A 到 B 的一个二元关系。
Q:傅里叶变换是什么
傅里叶变换的目的是可将时域(即时间域)上的信号转变为频域(即频率域)上的信号,随着域的不同,对同一个事物的了解角度也就随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理。
傅里叶变换认为一个周期函数(信号)包含多个频率分量,任意函数(信号)f(t)可通过多个周期函数(基函数)相加而合成。从物理角度理解傅里叶变换是以一组特殊的函数(三角函数)为正交基,对原函数进行线性变换,物理意义便是原函数在各组基函数的投影。
Q:最大似然估计?正定矩阵?
是一种参数估计方法,通过给定的数据对于模型的参数进行估计,利用已知样本结果(统计概率)反推最有可能导致这样结果的参数值
Q:常微分方程解法?
Q:微积分相关的人物?
Q:上确界和下确界区别?
Q:等价关系证明?
Q:命题的定义?感叹句是不是命题?
Q:朴素贝叶斯原理
Q:泰勒公式,泰勒级数,泰勒展开?
Q:二次积分与二重积分的区别与联系?
Q:数列极限?
Q:可导?
Q:微分中值定理的区别与联系?
Q:方向导数?
Q:梯度?
Q:洛必达法则?
Q:可积函数性质?
Q:积分中值定理?
Q:反函数存在的条件?
Q:一致连续?
Q:n阶矩阵可对角化的充要条件?2.数学期望的性质?
Q:概率论的条件概率、全概率公式,贝叶斯公式,条件概率,举个应用的例子?文章来源:https://www.toymoban.com/news/detail-556293.html
Q:高数的求导,求偏导文章来源地址https://www.toymoban.com/news/detail-556293.html
到了这里,关于2023届计算机保研面试基础专业问题(数据结构、算法、计算机语言、计算机网络、数据库、操作系统、数学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!