操作系统:
1.非抢占式轮转算法的弊端:
不能用于实时系统和分时系统,
2.抢占式算法的遵循原则
优先权原则、短进程优先原则、时间片原则
3.进程和程序的区别
4 程序并发时的特征
5 难度较大的Peterson锁(此题目是老师刁难我的)
6 进程的通信方式
7 同步和互斥是两个核心概念,可以直接问,也可以问一下同步机制四个准则;
8 死锁产生条件:
9银行家算法思想
10 内存管理
动态分区的算法:
计算机网络:
1 协议IEEE802.11(被难为的题目)
参考如下:
大概率是答不上来是WIFI的
2.信道极限容量的原因:
3 CSMA/CD
重点是要回答出碰撞检测的时间为2t,如果传输时间为t的话,只能是半双工通信,
然后还有动态退避算法。
退避算法:
4 问问RIP和OSPF这两个是关于路由选择的就问两者的区别:
liangzhege
5 TCP拥塞控制:必须要会的图5-25,可以让他简述这个过程
6 TCP三次握手和四次挥手
三次握手建立连接
四次挥手释放连接
数据结构
1不基于比较的排序算法,请简述一下过程
基数排序 桶排序,
2基于分治算法的排序算法是?简述一下思想
归并排序 快速排序
归并排序分割成多个子序列,通过有序子序列的合并,达到全局有序性
快速排序,找出中枢元素位置,划分为两个子序列的排序,依次在前后两个子序列中找出中枢元素位置,再划分成两个子序列,如此反复,直至最终的待排序子序列长度为0
3基于贪心的图的算法
最小生成树 prim 克鲁斯卡尔 可以接着问简述他们俩的区别
4 广度搜索遍历可以求取最短路径?
可以的话,接着问适用环境为?
5 平衡二叉树的调整
LL RR RL LR的算法阐述
6 如何两个栈实现一个队列
听他说就好了
7 如何用栈实现算术运算,算法步骤
一个数值栈,一个算术符号栈,重点在于算术符号栈的弹出与压入,如果待压入的运算符优先级大于栈顶的优先级,直接压入。如果待压入的运算符的优先级小于栈顶符号优先级,就弹出栈顶元素,并弹出数值栈进行运算。
8课程之间存在着先后制约关系,如何实现课程的排序,并简述其步骤
即简述拓扑排序
计组
1 程序的局部性原理
时间局部性和空间局部性
2 数据表示问题
float b = 1.0f/3
if(b==1.0/3) cout<<“yes”;
能不能输出yes
答案不能,精度缺失
也可以适当出一个溢出的问题
short a = 0x8000
cout<<a-1;
结果为 7FFF
有负数到整数
-a的溢出也可以问一下
3 串行进位加法器
Xi和Yi代表当前位置上的数,Ci代表进位
当前位置S = Xi 异或 Yi 异或 Ci-1
进位表示 Ci = (Xi&&Yi)||(Xi+Yi)异或 Ci-1
说出差不多的公式就行
怎么实现X-Y,末位的C置为1,完成取反+1
4 、74LS138的简介
三八译码器
5 RISC与CISC的区别
课本上有的
6 流水线的控制冲突解决办法,
预取、循环展开等等
编译原理
1 编译的过程
数据库
1 第一范式 第二范式 第三范式 BC范式
第一范式条件:必须不包含重复组的关系,即每一列都是不可拆分的原子项。
第二范式条件:关系模式必须满足第一范式,并且所有非主属性都完全依赖于主码。注意,符合第二范式的关系模型可能还存在数据冗余、更新异常等问题
第三范式的条件:关系模型满足第二范式,所有非主属性对任何候选关键字都不存在传递依赖
2 数据库事务的四大特征
四个特征:原子性、一致性、隔离性、持久性
原子性: 事务是数据库的逻辑工作单位,事务中的操作要么全做,要么不做。
一致性: 事务执行的结果必须是使数据库从一个一致性变到另一个一致性。
隔离性: 一个事务的执行不能干扰其他事物。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
持久性: 一个事务一旦提交,他对数据库中的数据的改变应该是永久性的。接下来的其它操作或者故障不应该对其执行结果有任何影响。
3 S锁和X锁
共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
两者对比
共享锁就是允许多个线程同时获取一个锁,一个锁可以同时被多个线程拥有。
排它锁,也称作独占锁,一个锁在某一时刻只能被一个线程占有,其它线程必须等待锁被释放之后才可能获取到锁。
4 脏读、不可重复读、幻读
1.脏读:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
2.不可重复读:
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)
例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
3.幻读:
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象
发生了幻觉一样。
例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。
JAVA
1 单例模式
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。
饿汉式
---------------------------------------------
//饿汉式
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
硬汉式
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
-------------------------------------------------------------------------------------------------
2 string和 stringbuffer 和stringbuilder区别
1 string:
String是被final修饰的类,不能被继承;
String实现了Serializable和Comparable接口,表示String支持序列化和可以比较大小;
String底层是通过char类型的数据实现的,并且被final修饰,所以字符串的值创建之后就不可以被修改,具有不可变性。
2:面试题:String、StringBuffer和StringBuilder的异同?
相同点:底层都是通过char数组实现的
不同点:
String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;
StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较安全,在多线程系统中可以保证数据同步,但是效率比较低;而StringBuilder 没有实现同步,线程不安全,在多线程系统中不能使用 StringBuilder,但是效率比较高。
如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。
3 装箱拆箱操作
装箱就是将基本数据类型转化为包装类型,那么拆箱就是将包装类型转化为基本数据类型。
package day1119;
public class TestBox2 {
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.println(a == b);
System.out.println(c == d);
}
答案是true false
原因是因为对象比较地址,基本数据类型比较数值
-128到127之间的数被放到cache里面,已经有固定的地址
当超过这个范围会重新创建对象,所以第一个时打印为true,两者地址相同。
200超出范围,c和d都指向不同的对象。
4 public protected default private
public:共有访问。对所有的类都可见。
protected:保护型访问。对同一个包可见,对不同的包的子类可见。
default:默认访问权限。只对同一个包可见,注意对不同的包的子类不可见。
private:私有访问。只对同一个类可见,其余都不见。
即:public > protected > default > private
5 Spring中常用的注解
@Required@autowired@Configuration
@controller@Component
@Service 提供逻辑服务
@Repository 提供数据访问
@request@RequestMapping
6 什么是Mybatis?
(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。
(2)作为一个半ORM框架,MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
称Mybatis是半自动ORM映射工具,是因为在查询关联对象或关联集合对象时,需要手动编写sql来完成。不像Hibernate这种全自动ORM映射工具,Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
(4)由于MyBatis专注于SQL本身,灵活度高,所以比较适合对性能的要求很高,或者需求变化较多的项目,如互联网项目。
7 mvc模式的简述
MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
是将业务逻辑、数据、显示分离的方法来组织代码。
MVC主要作用是降低了视图与业务逻辑间的双向偶合。
MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
8 redis 持久化两种方式
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
9get和post的区别
get和post的区别主要有以下几方面:
1、url可见性:
get,参数url可见;
post,url参数不可见
2、数据传输上:
get,通过拼接url进行传递参数;
post,通过body体传输参数
3、缓存性:
get请求是可以缓存的
post请求不可以缓存
4、后退页面的反应
get请求页面后退时,不产生影响
post请求页面后退时,会重新提交请求
5、传输数据的大小
get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)
post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
6、安全性
这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。
7、数据包
GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
数字图像处理
1 灰度直方图
灰度直方图是反映一幅图像中各灰度级像素出现的频率与灰度级的关系,以灰度级为横坐标,频率为纵坐标,绘制频率同灰度级的关系图像就是一幅灰度图像的直方图。
简单地说,就是把一幅图像中每一个像素出现的次数都先统计出来,然后把每一个像素出现的次数除以总的像素个数,得到的就是这个像素出现的频率,然后再把像素与该像素出现的频率用图表示出来,就是灰度直方图。
2 灰度直方图性质
1、灰度直方图只能反映图像的灰度分布情况,而不能反映图像像素的位置,即丢失了像素的位置信息
2、一幅图像对应唯一的灰度图像图,但是不同的图像可对应相同的直方图,如下
3、一幅图像分成多个区域,多个区域的直方图之和即为原图像的直方图
直方图有一个应用就是它可以确定图像二值化的阈值。当我们的发现某一幅图像的灰度直方图中有两个波峰,有一个波谷的话,那么这个波谷就可以作为这幅图像二值化的阈值
c++
1 STL中map和unordered_map:
unordered_map供我们使用,其实unordered_map的底层是用防冗余的哈希表(开链法解决冲突问题的)实现的。unordered_map的key需要定义hash_value函数并且重载operator ==。
哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,时间复杂度为O(1);而代价仅仅是消耗比较多的内存。哈希表的查询时间虽然是O(1),但是并不是unordered_map查询时间一定比map短,因为实际情况中还要考虑到数据量,而且unordered_map的hash函数的构造速度也没那么快,所以不能一概而论,应该具体情况具体分析
对于map的底层原理,是通过红黑树(一种非严格意义上的平衡二叉树)来实现的,因此map内部所有的数据都是有序的,map的查询、插入、删除操作的时间复杂度都是O(logn)。此外,map的key需要定义operator <,对于一般的数据类型已被系统实现,若是用户自定义的数据类型,则要重新定义该操作符。
2 C++中不能重载的运算符
C++中不能重载的运算符有5个,分别为:“?:”、 “.”、 “::” 、“sizeof”、“.*” 。
3 C++引用和指针
C++引用的底层也是指针实现的,那C++为什么还需要引入引用呢?
1.引用是为了支持C++运算符重载,比如,使用引用传递参数实现运算符重载,重载后使用运算符时就成了 a = b - c ,这样与运算符的使用比较相近,但是写 a = &b - &c 就显得很奇怪。
2.使用指针经常容易犯错误:1.操作空指针,2.操作野指针,3.不知不觉地改变了指针的值
3.使用引用的特性与好处:1.不存在空引用,2.必须初始化,3.一个引用永远指向他初始化的那个对象
4 C++中重载和重写的区别
重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。
重写是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,知识函数的实现体不一样。
C
1 字符串的strlen的实现
字符串需要以‘\0’作为结尾,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0)
参数指向的字符串必须要以\0作为结束
2 static的作用
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。