复试专业课知识记录(4)

2020.3.25学习记录

1.什么是P问题、NP问题和NPC问题?
 时间复杂度
 时间复杂度描述了当输入规模变大时,程序运行时间的变化程度,通常使用O来表示。比如单层循环的时间复杂度为O(n),也就是说程序运行的时间随着输入规模的增大线性增长,两层循环的时间复杂度为O(n2),快速排序的时间复杂度为O(nlogn),使用穷举法解决旅行商问题的时间复杂度为O(n!)。时间复杂度根据变化速率的快慢可以分为两类:1、多项式级的时间复杂度,如O(1),O(n),O(na),O(logn)等;2、非多项式级时间复杂度,如O(an),O(n!)等。当我们使用计算机解决一个问题时,我们要尽可能地找到一个具有多项式级时间复杂度的算法,非多项式级时间复杂度的算法一般运行时间较长,当输入数据规模较大时很难被接收。

 P类问题
 如果一个问题能找到在多项式时间内解决它的算法,那么我们说该问题是P类问题。P是多项式(Polynomial)的第一个字母。比如排序问题就是一个P问题,因为我们可以找到一个时间复杂度为O(n2)的冒泡排序算法。

 NP问题
 有些问题比较复杂,如旅行商问题,汉密尔顿回路问题等,当我们使用暴力搜索时,此类问题的时间复杂度为O(n!),看起来很难找到一个能在多项式时间内解决该问题的算法,而如果别人给了我一个解,我可以很快地验证该解是不是问题的正确答案。比如在汉密尔顿回路问题中,我想验证一条路径是否正确,则验证路径是否正确的时间复杂度为O(n),为多项式级的时间复杂度。所以,如果我们可以在多项式级的时间内验证一个问题解的正确性,那么我们说该问题是NP问题,也就是说直接找NP问题的一个解可能很慢,当验证NP问题的解却很快。前面提到的汉密尔顿回路就是一个NP问题。NP问题不是“非P问题”,而是非确定性多项式(nondeterministic polynomial)问题。

 NPC问题
 从上面的介绍我们知道,所有P问题都是NP问题,因为能在多项式时间内解决的问题也能够在多项式时间内验证解的正确性。那么我们还想知道是否所有的NP问题都是P问题,这就是著名的“P对NP问题(P=NP?)”。在2000年美国的Clay数学研究所公布的七个千年数学难题中,P对NP问题位居榜首,可见解决该问题的难度。由于直接证明P对NP问题过于复杂,人们引入了另一类问题--NPC问题(NP -complete,NP-完全问题)。
 四种问题之间的关系:

 参考博客:P、NP、NPC、NPH问题的区别和联系
      什么是P问题、NP问题和NPC问题

2.N皇后问题怎们解决?
 采用回溯法递归方式实现,配合适当剪枝用来优化时间复杂度。
 参考博客:n皇后问题(采用C语言实现)
      N皇后问题

3.需求分析的步骤
 获取需求,识别问题->分析需求,建立目标系统的逻辑模型->将需求文档化,制定规格说明书->需求验证,评审

4.面向对象的特征是什么?
 面向对象的三个基本特征是:封装、继承、多态。
 参考博客:面向对象的三个基本特征

5.常见的概率模型
 伯努利分布(一次伯努利实验)、二项分布(n 重伯努利实验)、几何分布(前n-1次失败,第n次成功)、泊松分布、均匀分布、指数分布、高斯分布、卡方分布
 参考博客:常见的概率分布模型
      概率论:常见概率分布

6.什么是PV操作?
 用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。
 p操作(wait):申请一个单位资源,进程进入
 v操作(signal):释放一个单位资源,进程出来
 PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
     P(S):1.将信号量S的值减1,即S=S-1;
            2.如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。(此处有疑问)
     V(S):1.将信号量S的值加1,即S=S+1;
            2.如果S<=0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。(此处有疑问)
 参考博客:进程同步之信号量机制(pv操作)及三个经典同步问题

7.群中什么是幺元(单位元)?
 幺元(也称作单位元):是集合里面一种特殊的元。当它和其他元素结合时,并不会改变那些元素。逆元的定义需要有单位元
 若ae=a,e称为右幺元;
 若e
a=a,e称为左幺元;
 若ae=ea=a,则e称为幺元。

8.复试心得
 自信是第一要务。自信不光使我本身并不高明的回答显得是经过了深思熟虑的,而且会给人一种胸有成竹一定是很靠谱的学生的感觉。在遇到没听懂的问题的时候,要学会沟通,问题含义不清晰可以跟老师确认,而不要闭着眼睛乱答一通,答非所望不太好。遇到不会的问题的时候就坦诚不会就行,老师也并不指望学生啥玩意都会,不过如果能够在承认自己不足的基础上略微地回答出几个点也很好。

9.数学中许多定理都是与手有关的,你能不能说一下高等数学中的右手定则
 1.向量的数量积:又称“叉乘”,向量积右手定则使用方法为,右手除姆指外的四指合并,拇指与其他四指垂直,四指由A向量的方向握向B向量的方向,这时拇指的指向就是A,B向量向量积的方向。就是说,AB向量积的方向垂直于AB向量确定的平面。如下图所示:

 2.斯诺克斯公式:将第二类曲线积分转换为第一类曲面积分,在通过特殊替代法、二重积分发进行求解。

10.向量积与数量积的区别

11.命题逻辑的连接词有哪些?
 否定连接词、合取连接词、析取连接词、蕴含连接词、等价连接词

12.什么是单射、双射、满射?

13.编译都有哪些步骤?编译的最终结果是什么?
 源程序->预处理->编译、优化->汇编->链接->可执行文件
 参考博客:C/C++程序编译过程
      【linux c】c语言源程序到最终生成可执行文件的过程_学习笔记_001

14.描述一下快排
 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
 步骤为:
  挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
  分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
  递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
 递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

15.你觉得自己的强项在哪,例如语言表达,编码还是数理基础好或者其他?
 我的强项在于团队合作能力和学习能力,喜好外语学习,喜欢与人交流,善于上网搜集资料解决技术问题。

16.职业生涯规划是什么

17.你在过去的编程中,遇到的最困难的事是什么?你是如何解决的?

18.C语言怎样读取一个文件?
 建立文件指针fp,只想需要读取的文件,创建链表,采用函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符,直到文件读取完毕,关闭文件,释放指针。

19.IP地址和MAC地址有什么区别?
 IP地址是指互联网协议地址(Internet Protocol Address),是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。一般用来进行不同网络之间的寻址,IP地址是32位。
 MAC地址又称为物理地址、硬件地址,用来定义网络设备的位置。网卡的物理地址通常是由网卡生产厂家烧入网卡的,具有全球唯一性。MAC地址用于在网络中唯一标示一个网卡,一台电脑会有一或多个网卡,每个网卡都需要有一个唯一的MAC地址。
 IP地址和MAC地址的区别主要有:

  1)对于网络上的某一设备,如一台计算机或一台路由器,其IP地址是基于网络拓扑设计出的,同一台设备或计算机上,改动IP地址是很容易的(但必须唯一),而MAC则是生产厂商烧录好的,一般不能改动。我们可以根据需要给一台主机指定任意的IP地址,如我们可以给局域网上的某台计算机分配IP地址为192.168.0.112 ,也可以将它改成192.168.0.200。而任一网络设备(如网卡,路由器)一旦生产出来以后,其MAC地址不可由本地连接内的配置进行修改。如果一个计算机的网卡坏了,在更换网卡之后,该计算机的MAC地址就变了。

  2)长度不同。IP地址为32位,MAC地址为48位。

  3)分配依据不同。IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商。

  4)寻址协议层不同。IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层。 数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过MAC地址),而网络层协议使数据可以从一个网络传递到另一个网络上(ARP根据目的IP地址,找到中间节点的MAC地址,通过中间节点传送,从而最终到达目的网络)。

 参考博客:IP地址与MAC地址的区别

20.操作系统是由什么组成的?
 进程管理、存储管理、文件管理、设备管理、系统调用

21.操作系统的定义
 操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。

21.汇编语言、高级语言区别
 高级编程语言作为一种通用的编程语言,它的语言结构和计算机本身的硬件以及指令系统无关,它的可阅读性更强,能够方便的表达程序的功能,更好的描述使用的算法。同时,它更容易被初学者所掌握,很容易学习。而且容易学习掌握。但是高级编程语言因为是一种编译语言,所以他的运行速度比汇编程序要低,同时因为高级语言比较冗长,所以代码的执行速度也要慢一些。所以说汇编语言更适合编写一些需要高效率运行的程序或者对程序代码的长度有要求的程序,同时在直接控制硬件方面也能够起到很好的作用。
 高级编程语言,作为用户层面的编程工具,用户并不需要去了解硬件的结构,而是去用逻辑的语言去实现想要的目标,但是因为高级编程语言的架构高于汇编,所以不能编写直接访问硬件资源的系统程序,因次,高级编程语言必须要调用汇编语言编写的程序来访问硬件地址。
 汇编语言的可读性相较于机器语言来说更好,但比高级编程语言差,汇编语言相较于高级编程语言来说对硬件的操作更加直接,可扩展性更好。

22.什么是编译执行和解释执行?
 编译执行,顾名思义,要先编译再执行,这里需要有一个编译器,来将我们的代码全部编译成机器代码,然后进行执行。因为先整体进行编译,所以这里会生成编译后的机器代码。

 解释执行,则是需要一个解释器,它会将我们的一句句解释成机器代码来执行,可以认为是,解释一句,执行一句。在这个过程中,不会生成中间文件。

 通过对比发现,编译执行,只需要编译一次,多次运行。而解释执行的话,每运行一次程序,都要经过解释器的解释过程。
 参考博客:解释执行与编译执行的区别

23.离散数学是重中之重

24.排序算法的稳定性
 稳定性算法:插入排序、冒泡排序、二路归并排序、基数排序
 不稳定性算法:选择排序、谢尔排序、快速排序、堆积排序

25.输入网址点击转到之后发生的事
 域名-IP-端口号-TCP三次握手-返回数据包-浏览器渲染页面
 参考博客:浏览器输入一个URL地址后发生的事情

26.离散数学中的拉格朗日定理

27.临界区是什么?
每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。
 参考博客:操作系统 之 临界区 浅析

猜你喜欢

转载自www.cnblogs.com/call-me-dasheng/p/12563695.html