南理预推免面试

  1. C++ include文件<>和“” 的区别

    • #include< > 引用的是编译器的类库路径里面的头文件。
      假如你编译器定义的自带头文件引用在 C:\Keil\c51\INC\ 下面,则 #include 引用的就是 C:\Keil\c51\INC\stdio.h 这个头文件,不管你的项目在什么目录里, C:\Keil\c51\INC\stdio.h 这个路径就定下来了,一般是引用自带的一些头文件,如: stdio.h、conio.h、string.h、stdlib.h 等等。
    • #include" " 引用的是你程序目录的相对路径中的头文件。假如你的项目目录是在 D:\Projects\tmp\ ,则 #include"my.h" 引用的就是 D:\Projects\tmp\my.h 这个头文件,一般是用来引用自己写的一些头文件。如果使用 #include" " ,它是会先在你项目的当前目录查找是否有对应头文件,如果没有,它还是会在对应的引用目录里面查找对应的头文件。例如,使用 #include “stdio.h” 如果在你项目目录里面,没有 stdio.h 这个头文件,它还是会定位到 C:\Keil\c51\INC\stdio.h 这个头文件的。
  2. 你选我们学校的最主要原因是什么

  3. C++面向对象的特点,和c的区别

    (1)C是面向过程的语言,是一个结构化的语言,考虑如何通过一个过程对输入进行处理得到输出;

    C++是面向对象的语言,主要特征是“封装、继承和多态”。封装隐藏了实现细节,使得代码模块化;

    ​ 派生类可以继承父类的数据和方法,扩展了已经存在的模块,实现了代码重用;

    ​ 多态则是“一个接口,多种实现”,通过派生类重写父类的虚函数,实现了接口的重用。

    (2)C和C++动态管理内存的方法不一样,C是使用malloc/free,而C++除此之外还有new/delete运算符

    (3)C++支持函数重载,C不支持函数重载;

    (4)C++中有引用,C中不存在引用的概念。

  4. 面向对象?

    (1)封装

    将客观事物封装成抽象的类,并且设计者可以对类的成员进行访问控制权限控制。

    这样一方面可以做到数据的隐藏,保护数据安全;另一方面,封装可以修改类的内部实现而不用修改调用了该类的用户的代码。同时封装还有利于代码的方便复用;

    (2)继承

    A) 继承具有这样一种功能,它可以使用现有类的所有功能;并且可以在不重新编写原有类的情况下对类的功能进行扩展。

    继承的过程是一般到特殊的过程,即是它们是is-a的关系;

    基类或父类是一般,而子类或派生类是基类的特殊表现;

    要实现继承可以通过继承和组合来实现;

    B) 广义上的继承分成三大类:

    实现继承:使用基类的属性和方法而无需额外编码的能力;

    接口继承:接口继承是指仅使用基类的属性和方法的名称,而具体的实现子类必须自己完成的能力;

    可视继承:子窗体(类)使用父窗体(类)的外观和实现代码的能力;

    (3)多态

    多态指相同对象接收到不同消息或不同对象收到相同消息时产生不同的动作。

    A) 多态的实现分成两种,一种是编译时的多态(静态多态),主要是通过函数重载和运算符重载来实现的,是通过静态联编实现的;

    B) 另外一种是运行时多态(动态多态),主要是通过函数覆盖来实现的,它需要满足3个条件:基类函数必须是虚函数,并且基类的指针或引用指向子类的时候,当子类中对原有的虚函数进行重新定义之后形成一个更加严格的重载版本的时候,就会形成多态;它是通过动态联编实现的;

    运行时的多态(动态多态,必须以封装和继承为基础)可以让基类的指针或引用指向不同的对象的时候表现出来不同的特性。

  5. 数据库建立索引是什么数据结构,为什么建立索引会使得搜索更快

    B树或B+树,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。

    添加索引的话,首先去索引列表中查询,而我们的索引列表是B树的数据结构,查询的时间复杂度为O(log2N),定位到特定值得行就会非常快,所以其查询速度就会非常快。

    为什么说B±tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?

    1. B±tree的磁盘读写代价更低

    2. B±tree的查询效率更加稳定

  6. 为什么tcp三次握手建立连接?

    客户端发出请求,服务端应答请求,客户端发出确认应答消息。如果没有确认应答,只有两次握手,那么如果此时客户端并没有发出建立连接的请求,而是因为网络堵塞的请求到达了服务端,而服务端认为这是客户端发出的建立连接请求,随即建立连接,白白浪费了服务器的资源。

  7. 堆排序的复杂度

    建堆时间为O(n),有n-1次向下调整的操作,每次调整的时间复杂度为O(h),堆排序在最好、最坏、平均情况下的时间复杂度都是O(nlogn)

  8. 进程与线程的区别?

    进程和线程的根本区别是进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。另外区别还有资源开销、包含关系、内存分配、影响关系、执行过程等。

    资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

    包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

    内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。

    影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

    执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。

    进程和线程的根本区别是进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。

  9. 最短路径算法(描述dijkstra算法)

  10. 哈希表的冲突解决方式

    • 开放定址法:线性探测法、平方探测法、
    • 再哈希法:再散列法
    • 链地址法
  11. 操作系统用过linux吗

    linux系统,主要分debian系和bairedhat系,还有du其它自由的发布版zhi本。dao

    1、debian系主要有Debian,Ubuntu,Mint等及其衍生版本;

    2、redhat系主要有RedHat,Fedora,CentOs等,

    3、其它有Slackware,Gentoo,Arch linux,LFS,SUSE等。

    4、如果开发用,推荐redhat系,业内公司的服务器多用centos,考虑到平时使用,那么就选择fedora,可以选择最新的发行版。

    5、如果简单用加开发,可以选择debian系,推ubuntu,mint。

    6、如果是技术狂型,那么就推荐Gentoo,Arch linux,LFS,Slackware等。

  12. 求最小生成树算法?

    Prim算法:小树变大树,O(|V|&2),适合稠密图

    Kruskal算法:将森林合并成树,不用堆:O(|E|2);用堆优化以后:O(|E|log|E|),适合稀疏图

  13. 运行C程序的步骤

    1. 编辑源程序,得到.c文件
    2. 对源程序进行编译,预处理+正式编译,得到.obj文件(二进制目标文件)
    3. 进行连接,得到.exe文件(可执行程序)
    4. 运行可执行程序,得到运行结果
  14. C编译的过程

    编译过程是整个程序构建的核心部分,编译成功,会将源代码由文本形式转换成机器语言,编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及中间代码生成、优化后生成相应的汇编代码文件。

  15. 排序算法(分为内排序和外排序)都是在内存中吗?

    外排序主要用多路归并排序

  16. 进程通信的方式

    liunx六大进程间通信方式 :管道,消息队列,共享内存,信号量,socket,信号,文件锁

  17. 霍夫曼树的时间复杂度

    时间复杂度为O(n)

  18. 操作系统中你学过什么?

    • 处理机调度与死锁
    • 进程与线程
    • 存储器管理
    • 输入输出系统
    • 文件管理
  19. c的内存空间申请malloc()函数

  20. 二叉树遍历时间复杂度

    非递归遍历、递归遍历时间复杂度为O(n),空间复杂度O(n)

    Morris遍历,时间复杂度为O(n),空间复杂度O(1)

  21. 介绍你的学校 in English

  22. 介绍你的报考专业 in English

  23. 什么是死锁?

    如果一个进程集合里面的每个进程都在等待这个集合中的其他一个进程(包括自身)才能继续往下执行,若无外力他们将无法推进,这种情况就是死锁,处于死锁状态的进程称为死锁进程

  24. 死锁产生的原因

    因竞争资源发生死锁

    进程推进顺序不当发生死锁

  25. 产生死锁的四个必要条件?

    (1)互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源

    (2)请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放

    (3)不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放

    (4)环路等待条件:是指进程发生死锁后,必然存在一个进程–资源之间的环形链

  26. 处理死锁的基本方法

    1.预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件

    2.避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁(银行家算法)

    3.检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉

    4.解除死锁:该方法与检测死锁配合使用

9.24发了通过考核信息,计院专硕,可能说口语得时候太拉跨

你可能感兴趣的:(面试,多态,c++,python,面试,linux)