2020北大软微复试知识整理

前言

现在是2020年4月18日
大概还有20天北大软微2020的复试,整理一下知识点
此文不仅仅是复试使用,今后找实习,春招秋招都会使用
收集常见CS面试问题
持久更新~~

数据结构&算法

1.树的定义?
来个优雅的递归定义
树是N个节点的集合(N >=0),N=0的情况没有根节点
1)有且仅有一个根节点
2)当N>1时,可以分为m个互不相交的集合,T1,T2…Tm,每个集合是根节点的一个子树

2.TopK问题
冒泡排序 复杂度 O(n*k)
堆排序 复杂度 O(n*log(k))
随机选择+partition 复杂度O(n)
巧解 TopK之代码:https://blog.csdn.net/weixin_39666736/article/details/105891232

【加强版TopK】100亿数字中找到最大的100个
稍有常识的人都知道,这么大数不能读入内存,只能用外部排序
解法:分大区、大区再分小块,一个大区分为1000个小块
利用linux下一个进程最多开1024个线程进程并行计算,利用多线程的优势处理,每个小块可以用上述的优雅O(n)求解

3.常见排序算法
不稳定的排序:快排 希尔排序 堆排序 选择排序
复杂度O(n*log(n)):快排 堆排序 归并排序

  • 插入排序:直接插入排序、折半插入排序、希尔排序
  • 交换排序:冒泡排序、快速排序
  • 选择排序:简单选择排序、堆排序
  • 归并排序
  • 基数排序

4.哈夫曼编码
主要目的是根据频率,来最大化节省编码的存储空间
是一种无前缀编码,解码的时候不会发生混淆

5.AVL树
AVL树,首先是二叉查找树,再满足平衡树
故AVL简而言之是:平衡的二叉查找树
AVL树回顾
树的进化迭代:
二叉树 --> 二叉查找树(左<根<右) --> 平衡二叉查找树 (AVL树)–> 平衡多路查找树(B-Tree)
B树和B+树回顾
B树每个节点占用一个磁盘块的空间,节点上的关键字按照升序排列
B+树相对于B树的优点,所有叶子节点之间都有一个链指针,所有非叶子节点只存储键-值信息,B+树一般有两个指针,一个指向根节点,一个指向最小的那个叶子节点,B+树一般2~4层,一个磁盘块16KB(也是一页的大小 page),long int型8B,指针类型也取8B,故一个节点可以存16KB/(8B+8B)=1K个键值,仅仅3层的B+树就可以存10^3 × 10^3 × 10^3 =10亿数据!!
B+树叶子节点存放数据,非叶子节点存放指针和键值
B+树的索引可以分为聚集索引辅助索引
聚集索引(clustered index)存放的是整张表的行记录数据
辅助索引(secondary index)存放的是行数据的主键

语言特性(C C++ Java Python)

C语言:

1.C语言的指针
Type *p,声明指针变量,告诉计算机p这个指针指向的对象占用多少字节
p可以理解成快捷方式,快捷方式存放的是你对象所在的地址
p多大?这个根据操作系统来,比如32位系统,寻址空间2^32,那么p就是32个2进制数,等于4个字节,同理,64位系统,p是8个字节,因此,指针指向对象的大小由前面的基本类型(如 int 、float)决定,指针本身大小由系统决定
比如 int *p=a,p存放的内容就是a所在地址的第一位,然后发现是int型,顺着读4个字节,得到的也就是a的值
分清这三个值:*是取内容,&是取地址
p的值:指向对象的地址
*p的值:指向对象的内容
&p的值:p的地址

野指针:指向不可用内存区域的指针,如何避免?指针释放后置null

2.C语言的union
所有成员占同一段内存,union占用的内存等于最长成员占的内存,
union使用到了内存覆盖技术,共用体成员之间会相互影响,共用体在单片机中应用较多

3.函数指针和指针函数?
指针函数:落点是函数,本质上是函数,是返回指针的函数(返回的是地址值)
函数指针:本质上是一个指针,指向这个函数的指针

C++
1.static作用?
详细版:https://blog.csdn.net/majianfei1023/article/details/45290467

  • 隐藏,修饰变量和函数,表示不能被其他文件访问的全局变量和函数,并且其他文件可以取同名变量
    (静态全局变量,静态函数)
  • 唯一一次初始化,保证变量内容的持久(静态局部变量)
  • 用来修饰类的函数or变量,表示属于类、且不属于类对象的变量or函数(和Java中相同)

2.C++class 和struct的区别?
在C语言中 struct不能定义函数,
在C++中 struct能定义访问级别和函数,C++ struct和class用法完全相同,使用struct定义类,所有成员的默认访问级别是public,使用class定义类,所有成员的默认访问级别是private

3.C++虚函数和纯虚函数:
详细请参考这里

//首先看看c++里面的语法
//虚函数 使用关键字virtual
class CShape
{
public:
    virtual void Show();
};
//纯虚函数 关键字virtual 再在函数后面加上 =0
class CShape
{
public:
    virtual void Show()=0;
};

理清下面的概念

  • 定义一个函数为虚函数,不代表该函数未被实现
  • 定义它为虚函数是为了用父类指针调用子类的函数
  • 定义一个纯虚函数是为了定义一个接口,起到一个‘规范协议’的作用,继承它的类必须要实现这个接口
  • 定义一个纯虚函数,代表这个函数没有被实现

为什么叫虚函数?虚函数,虚就虚在一个类函数的调用不是在编译时刻被确定的,而是在运行时刻被确定的
带有纯虚函数的类是抽象类,纯虚函数,声明了纯虚函数的类(即抽象类)不能生成对象,纯虚函数要求继承类必须重写声明函数,如果派生类没有重写定义纯虚函数,派生类任然是一个抽象类。

虚函数是c++用于实现多态的机制

虚函数和纯虚函数不同点:

  • 虚函数在子类中可以不重载,纯虚函数必须在子类中实现
  • 虚函数继承了接口同时继承了父类的实现,纯虚函数仅仅留给子类一个必须重写的接口

4.C++为啥要设计引用这个东西?
将函数的形参定义为引用,函数会修改参数的值,达到对象指针的效果

  • 为了支持操作符重载,*可能被重载了
  • 不使用引用会带来拷贝的临时开销,使用引用更高效
  • 避免指针是否为null的判断
    防止引用改变真值?使用 const &
void Func(Foo* foo); //c
void Func(const Foo& foo);//c++

补充:&引用的理解,int & p=a;a和p的地址是一样的,值也是一样
相当于一个‘别名’,引用使用的是原始数据,不是别名,就像一个人的大名和小名一样,都是代表这个人

5.C++和脚本语言的区别
c++、java是编程是需要定义好类型,需要编译
脚本语言不需要编译,在运行中天然跨平台,比如浏览器中的JavaScript

6.C++中const和define
const修饰的值,在编译过程中不能改变,编译器会把它放到一个只读的内存区(全局区)
define是纯文本替换

7.C++ new和delete,C++的new和malloc的区别

new不仅分配了内存,还创建了对象,delete可以删除由new分配的内存

  • new是关键字,malloc是函数,效率 关键字>函数,故new效率高于malloc
  • new和delete配对使用,malloc和free配对使用
  • new不需要指定开多大的内存,malloc需要
  • new和malloc都是在堆上开辟内存,new不仅开辟空间,还进行初始化

8.C++ extern
extern放在变量或者函数前面,表示该变量或函数已经在别的文件中定义好了,提示编译器去别的模块寻找,想要使用要加上include

9.函数传参的三种方法?
传值、传址、传引用
传引用形参和实参是指向同一块地址
传址是形参的值(*p)是指向实参的地址
声明上

  • 传值 void swap(int a,int b)
  • 传址 void swap(int * a,int * b)
  • 传引用 void swap(int & a,int &b)

调用上
传值和传引用调用方式相同,
传址需要传入地址(也就是加取地址&符)

10.overload (重写)和override(重载、覆盖)的区别?

11.c++内联函数
inline:相应的函数代码替换函数调用
目的是减少指令在内存中不同位置的切换的时间

12.c++友员
使用关键字friend,但是有权限访问类里面的私有成员和保护成员

Java
0.抽象类和接口区别(接口是抽象类的变体)

  • 抽象类要被子类继承extends,接口要被类implements实现
  • 抽象类可以做方法声明,也可以做方法实现,接口只能方法声明
  • 接口里面定义的变量只能是公共的静态常量,抽象类变量是普通变量
  • 接口的抽象级别最高,抽象类主要用来抽象类别,接口主要用来抽象功能
  • 抽象类可以有具体的方法和属性,接口只能有抽象方法和静态常量
  • 抽象类里面可以有非抽象方法,接口里面只能有抽象方法

0.1重写和重载的区别

重写:“两同两小一大”
发生在子类和父类中

  • 方法名相同,参数列表相同
  • 子类返回类型小于等于父类返回类型 (子:String 父:Object)
  • 子类抛出异常小于等于父类方法抛出异常
  • 子类访问权限大于等于父类方法访问权限

重载:
发生在同一个类中
方法名必须相同,参数列表不同
返回值可以不同

1.Java回收机制
java回收机制是java虚拟机提供的能力,在空闲时间回收未被引用的对象占据的内存空间
delete unreferenced object in the heap memory

2.Java虚拟机
Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,跨平台。

3.char在Java中统一占2个字节

4.C++和Java的区别?

  • 内存管理:Java具有垃圾回收机制,c++没有
  • Java一切都是对象 (不严谨),Java基本类型不是对象,比如数值型、字符型和布尔型
  • Java和c++ 数据类型所占字节不同,Java有JVM,屏蔽掉平台相关信息,统一int是4个字节,char是2个字节,float是4个字节等等
  • Java不使用指针,c++可以使用指针对某个内存地址进行显式转化后访问c++私有成员,破坏安全性
  • Java不能运算符重载,C++可以重载
  • Java不使用全局变量,而是在某个类定义一个公用的静态变量完成全部变量的效果
  • Java的对象变量,相当于C++里面的对象指针
  • Java定义抽象类是用abstract关键字,C++是在尾部加上=0表示纯虚函数,只要有一个纯虚函数,这个类就是抽象类

5.Java反射机制?
通俗理解就是允许程序对自身进行检查,就像照镜子一样,能够直接操作程序内部的属性和方法
反射是指程序运行期间发现更多类及其属性的能力 --《Java核心技术》
概念:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

核心是JVM运行时才动态加载类,并且对于任意一个类,都知道这个类的属性和方法

作用:

  • 可以通过外部类的全路径名创建对象
  • 让开发人员可以枚举出类的全部成员
  • 测试的时候可以使用private API,保证测试覆盖率

在我们用API时,创建一个对象,一按点号,就能显示类里面的所有属性和方法,这用到的就是反射

6.HashMap和HashTable
HashMap是非同步的,不是线程安全,允许空值key=null
HashTable是线程安全的,可以在多个线程之间共享
在单线程中,HashTable比HashMap慢得多,现在在多线程下保证安全,多用currentHashMap,拓展性比HashTable要好

7.Java的参数传递到底是值传递还是引用传递
参考知乎回答
Java是值传递这个值是对象的引用,把实参对象引用的地址当做值传递给了形式参数。
严格意义上说是共享传递
值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参

  • 值传递:会创建副本,无法改变原对象
  • 引用传递:不会创建副本,可以改变原始对象

8.方法重载也被称为编译时多态
编译期间不知道调用哪个方法,比如

public class A {
   public int compute(int input) {          //method #3
        return 3 * input;
   }        
} 

public class B extends A {
   @Override
   public int compute(int input) {          //method #4
        return 4 * input;
   }        
}

编译器遇到以下代码

public int evaluate(A reference, int arg2)  {
     int result = reference.compute(arg2);
}

编译器没发知道传入的参数reference是类型A还是类型B
只有在运行时,查看类实例才能确定
也称为动态编译,在运行时确定类型,绑定对象

9.抽象类和接口区别?
只能继承一个抽象类,可以实现多个接口

抽象类 abstract class:可以有方法的具体实现,变量可以各种类型,可以有非抽象方法,可以有静态方法,

接口 interface [抽象方法的集合]:所有的方法都是抽象方法,方法不能有具体的实现,只能由实现接口的类来实现;成员变量只能是public static final类型;可以有静态方法,但必须实现;接口的所有方法默认、也一定只能是public abstract
除非实现接口的是抽象类,否则都要实现接口里的所有方法

Python
1.is和==的区别?
is是同一性运算,判断对象的id是否相同,a is bid(a)==id(b)
== 是判断对象的value是否相同

2.Java是强类型的语言,Python也是强类型的语言,是动态类型

计算机网络

查看文章
https://blog.csdn.net/weixin_39666736/article/details/105552401
1.OSI模型全称?OSI七层分别是?
open system interconnect 开发式系统互联
物理层 链路层 网络层 传输层 回话层 表示层 应用层

2.数据链路层成桢的方法?

  • 字符计数法:桢头部使用一个计数字段(帧头出问题就凉了)
  • 字符填充首尾定界法:使用特定的字符来定界桢的开始和结束(flag esc)
  • 比特填充定界法:使用特定的比特模式来定界,01111110

3.网络的拓扑结构?

  • 星型拓扑
  • 总线型拓扑
  • 环型拓扑
  • 树形拓扑

4.静态路由和动态路由?

  • 静态路由是网络管理员手工配置路由信息、适用于比较简单的网络环境
  • 动态路由是指路由器能够自动建立自己的路由表,并根据实际情况适时调整

5.说一下IPv6
Internet Protocol version 6
IPv4 地址已经耗尽
ipv4地址有2^32个
ipv6地址有2^128个
优点:新的头部格式、速度快、安全性高、地址很多用不完

6.常见的TCP拥塞控制算法
拥塞窗口cwnd:发送方当前试探网络容量的窗口,表示网络当前容量
以下这四个算法的值也是基于拥塞窗口的

  • 慢启动(指数增大)
  • 拥塞避免(加法变大)
  • 快重传(连续收到三次冗余ACK就直接重传,不需要等待未传来的报文段计时器过期)
  • 快恢复(将慢开始门限ssthresh设置为出现拥塞时cwnd的一半,同时慢启动阈值等于新的ssthresh值)

7.请你说一下http和https?

http三大缺陷:
1.明文传输
2.不验证身份,容易被伪装者迷惑
3.不校验信息完整性,可能被劫持并篡改

区别:

  • http是超文本传输协议,明文传输;https加密的安全传输,SSL加密
  • https需要CA认证,http不需要
  • http端口号是80,https端口号是443
  • http是无状态的连接,https是SSL+http协议构成的加密传输

优点:

  • 通过证书可以更信任服务器,更安全,防篡改

缺点:

  • 需要证书
  • 对传输进行加密,一定程度增加cpu消耗
  • https需要密钥和加密算法认证,首次建立连接会慢一点
  • 带宽消耗会增加

8.说一下http状态码分类

1xx:继续传输信息(100continue·,101 switching protocols)
2xx:成功(至少是部分成功)
3xx:重定位,需要进一步操作
4xx:客户端错误,请求包含语法错误或者无法完成请求
5xx:内部服务器错误

9.说一下http你理解的无状态和无连接?
无连接:每次服务器处理完请求之后,并收到客户应答后,就关闭连接
无状态:服务器没有保存客户端的状态,客户端每次必须带上自己的状态去请求服务器,每次请求都是独立的,不会受前面和后面请求应答情况而影响

操作系统

0.并发和并行区别?
答1:最关键的点是【同时】
并行能【同时】处理多个任务;并发是一段时间处理多个任务,而不是同时

答2:看这些线程能不能同时被多个cpu执行,并发是多个线程被一个cpu轮流执行;

https://www.zhihu.com/question/33515481

1.进程和线程?【说说协程?】
进程是资源分配的基本单位,线程是处理机调度的基本单位
进程有自己独立的地址空间,同一个进程下的线程共享进程地址空间
进程之间的资源是独立的,同一个进程下的线程共享进程的资源,会有线程安全问题

【协程】
协程是一种用户态轻量级的线程
协程的调度完全由用户控制
协程拥有自己的寄存器上下文和栈(能够保留上一次调用状态)

  • 一个进程可以有多个协程,一个线程也可以有多个协程
  • 进程线程是同步,协程是异步
  • 线程是协程的资源,协程是一种任务调度机制

补问1:【说一下上下文切换要切换什么内容】
上下文切换也叫做进程切换,是指cpu从一个进程切换到另一个进程,要切换的内容有:

  • cpu寄存器(通用寄存器、程序计数器pc、程序状态字寄存器psw)
  • 页表切换(页表是进程中页号到内存地址的映射)
  • 栈区(程序段编译后形成的指令代码集,数据集)

补问2:进程和程序的区别?

  1. 进程是动态的,程序是静态的
  2. 进程具有一定生命周期,程序可以长期保存
  3. 1个程序可以对应多个进程,一个进程只能对应一个程序
  4. 进程由 程序、数据、PCB组成;程序是一组有序的指令

2.系统调用?
系统调用是应用程序同系统之间的接口
用户为了使用操作系统所提供的一些高级权限功能,如进程控制、读写
通过系统调用从用户态转化到内核态
使用线程作为最小调度单位可以有效减少系统切换的开销

系统调用是一种特殊的中断 trap(内中断)

3.中断
0)中断概念:中断是指某个事件(如断电、除0)发生时,系统中止现行程序运行,切换到处理该事件的程序,处理完毕后返回断点,继续执行
1)中断流程:中断请求 --> 中断响应 --> 中断保护 --> 中断服务程序 --> 断点恢复 --> 中断返回
2)内中断:cpu执行指令内部的事件,如爆栈,越界,算术溢出
外中断:cpu执行指令外部的事件,如断电,I/O
3)中断要保存什么?
PC(program count程序计数器)存放下一条指令的位置
PSW(program status word程序状态字)
系统调用号
通用寄存器

4.windos文件系统和linux文件系统有哪些?
windows:FAT16 FAT32 NTFS(new Technolegy)
linux:一切对象都是文件 ext2 ext3 ext4

5.宏内核和微内核
微内核:OS将最基本的功能如进程管理保留在内核,将不需要在内核态执行的功能移到用户态,降低了内核设计的难度
宏内核:将OS主要功能作为一个紧密联系的整体运行在内核态
windows是微内核、Mac也是微内核(软的os是内核)
linux是宏内核
补充:window文件目录都是反斜杠\
(联想win10下面一开始学c,输出都是反斜杠\n
linux下面文件目录都斜杠/

6.PV操作?
PV操作是实现进程互斥和同步的方法,PV操作和信号量的处理相关,P表示申请资源,当value<=0,需要调用block原语;V表示释放资源,当value<=0,需要唤醒一个等待队列中的进程

7.内存的分区?

  • 栈区stack:存放参数值,局部变量的值
  • 堆区heap:由程序员分配释放 比如malloc,new
  • 全局区(静态区):全局变量和静态变量都是放这里
  • 文字常量区:存放常量字符串
  • 程序代码区:存放函数体的二进制代码

8.进程调度算法?

  • 先来先服务 FCFS
  • 短作业优先 SJF
  • 优先级调度
  • 高响应比优先
  • 时间片轮转
  • 多级反馈队列

9.进程通信(IPC)的方法

  • 共享内存【速度最快、效率最高】
  • 消息队列
  • 管道(匿名管道、命名管道)
    管道是半双工,先进先出,实质是一个内核缓冲区,缓冲区大小有限,
    匿名管道只能用于有亲缘关系(父子、兄弟)的进程
    有名管道可以不存在亲缘关系的进程之间通信
  • socket
  • 信号
  • 信号量

共享内存存在用户空间中,不需要用户态和内核态切换

追问:进程通信用共享内存的注意点?

  • 没有引用计数器,进程结束没有引用时,需要手动删除
  • 注意不要超过共享内存的大小

10.进程控制块PCB

  • 进程标识信息:如进程id,父进程id
  • 进程控制信息:进程调度信息,进程通信方式
  • 进程资源信息:进程优先级,打开的文件、资源地址
  • 处理机状态:pc(下一条指令的地址)、psw(表示用户态还是内核态),各种寄存器的值,以便中断时能够恢复现场

11.同步和异步?

  • 同步:同一时刻,只能有一个线程访问共享资源(同步限制了并发访问)
  • 异步:多个线程可以同时访问共享资源(容易出现脏读和冲突)

补充:进程同步机制应该遵循的四个准则?

先介绍两个重要概念
临界资源:一次仅允许一个进程使用的资源,如打印机
临界区:每个进程中访问临界资源的那段代码

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待:进入了临界区,但是明知得不到临界资源的进程,应该主动释放掉处理机

12.什么是线程不安全?
多个线程,同时访问同一段代码,得到不同的结果就是线程不安全

什么情况会产生线程不安全?
当多个线程,同时使用共享资源

如何解决?
采用同步互斥访问,即同一时刻,只有一个线程能访问共享资源,访问时要加锁,访问结束要解锁,让其他线程继续访问

13.死锁的四个必要条件?

  • 互斥条件
  • 不可剥夺
  • 请求保持
  • 循环等待

预防死锁(怎么解决?)
1.破坏互斥:一般不可以破坏
2.破坏不可剥夺:允许对资源剥夺,即抢占资源
3.破坏请求保持:一次性分配全部所需资源
4.破坏循环等待:对资源统一编号,申请资源按照升序

避免死锁?
银行家算法

解除死锁?
(1)资源剥夺法
(2)撤销进程法
(3)进程回退法

补充:死锁和饥饿?
饥饿是指一个进程很久得不到资源
饥饿一般不占资源,死锁一定占资源

14.操作系统内存管理方式?
OS中内存访问的最小单元是字节 8bit,通常说的32位的总线是说一次读写可以从内存中读or写32bit,也就是4字节

  • 重定位(reallocation)
  • 分段(segmentation)
  • 分页(paging)
  • 虚拟存储(virtual memory)

linux采用按页虚拟存储
地址分配策略:最先匹配、最佳匹配、最差匹配

15.常见的内存页面置换算法

  • 最佳置换法 OTP optimal
  • 先进先出
  • 最近最久未使用 LRU lasted recent used
  • 时钟算法

16.交换区(swap)的功能?
swap分区是一块特殊的硬盘空间,当内存不够用时,os会将内存中暂时用不到的东西放入swap分区
linux下swap分区一般是内存的两倍,但是不超过8G
windows下swap分区称为虚拟内存(匀出一部分硬盘空间当内存)

17.I/O控制方式

  • 直接程序-控制方法
  • 中断驱动-控制方法
  • DMA-控制方法
  • 通道-控制方法

18.页表和快表
页表,快表都是操作系统中内存管理的概念
页表存储的是进程中的页号内存中的块号映射
页表存储在内存中,快表存储在cache中,所有通过慢表查询需要经过两次内存;通过快表查询只需要经过一次内存

19.简单介绍linux文件系统
详情查看
https://www.cnblogs.com/llife/p/11470668.html
操作系统将硬盘划分为两个区域,一个是数据区,存放文件数据,一个是inode区,存放inode所包含的信息
注意:inode中不存放文件名,用inode号码表示

硬盘划分为一个个block
块组0内容有:引导块、超级块、块组描述符、预留GDT块(GDT:全局描述符表)、数据块位图、inode位图、inode表、数据块
块组i内容有(i>0):数据块位图、inode位图、inode表、数据块
在这里插入图片描述
20.硬链接和软链接?

硬链接:在linux下,多个文件名指向同一个inode号码,可以使用不同的文件名访问相同的内容
当一个文件有多个硬链接时,对文件内容修改会影响到所有的文件名,删除一个文件,只会让inode减1

软链接:类似windows下面快捷方式,可以快速连接到目标文件或目录,文件B的内容是A的路径,如果删除了文件A,打开文件B就会报错,文件B指向文件A的文件名,而不是文件A的inode号码,文件A的inode号码不会改变

21.线程之间的通信方式

  • wait / notify
  • 共享变量:如volatile,(volatile不是锁啊) 两大特性:可见性、有序性,不能保证原子性
  • 使用synchronized同步
  • 信号量(线程之间同步)

计算机组成原理&系统

1.按字节编址和按字编址?
一次寻址一个字节(32位)
一次寻址一个字(8位)
在这里插入图片描述

2.计算机系统的存储层次
主存=内存,外存=辅存

  1. cpu寄存器
  2. 内存:高速缓存(cache)、主存储器(内存条、RAM、ROM)
  3. 外存:磁盘、u盘、光盘
    在这里插入图片描述

3.磁盘和硬盘?
磁盘:将圆形的磁性盘片装在一个密封的盒子里面,防止磁盘表面划伤
磁盘包括硬盘和软盘,所以硬盘是磁盘的一种
硬盘主要有:固态硬盘(也称SSD solid state disk)和机械硬盘
两者区别如下

  • 固态硬盘比机械硬盘读写快出几十上百倍
  • 缺点是SSD单位成本高,固态硬盘寿命短;寿命机械硬盘更久
  • 固态硬盘防震抗摔,机械硬盘怕摔
  • 固态硬盘本质是半导体存储,机械硬盘本质是电磁存储

软件工程

查看文章
https://blog.csdn.net/weixin_39666736/article/details/105583789
1.最最经典的-软件工程的定义?
IEEE的定义:软件工程是开发、运行、维护和修复软件的系统方法
(developing、working、repairing)

2.软件开发的过程?
可行性分析 --> 需求分析 --> 概要设计 --> 详细设计 --> 编码 --> 测试 -->维护
feasibility study --> requirement analysis --> high-level design --> low level design --> coding --> testing --> repair

3.解释一下内聚和耦合
模块设计追求 高内聚低耦合
内聚:模块内部追求高内聚,功能相关的放到一个模块(高内聚)
耦合:模块之间追求低耦合,模块之间的关联越少越好,接口越简单越好(低耦合)

4.SaaS PaaS IaaS
software as a service 软件服务化
platform as a service 平台服务化
Instruction as a service 基础设施服务化
基础设施在最下端,平台在中间,软件在最上层
知乎精辟回答:
IaaS就是租服务器
PaaS就是服务器+mysql+Tomcat
SaaS就是3000块挂个logo就能使用的电商网站

5.非功能性需求包括?
(1)性能需求:软件响应速度、运行时资源消耗等方面的要求
(2)…

数据库&SQL

SQL查看文章
https://blog.csdn.net/weixin_39666736/article/details/104530984

1.事务是什么?四大特性?
事务就是一组sql语句,要么全部执行成功,要么全部执行失败
事务是用户定义的操作序列,是并发控制的单位,操作序列要么全部执行,要么全部不执行
A atom 原子性
C consistency 一致性 如果执行事务前数据库是一致的,执行事务后数据库也是一致的
I isolation 隔离性
D durability 持久性

2.事务的隔离级别
i)未提交读
ii)提交读
iii)可重复读
iv)可串行化

3.数据库范式

码:K,K确定的情况下,除K之外的所有属性也就确定了,那么K就是码,通常选取其中的一个码作为主键

  • 1NF(1 normal form)所有属性不可分割
  • 2NF 不存在非主属性对码的部分依赖
  • 3NF 不存在非主属性对码的传递依赖
  • BC 不存在主属性对码的部分依赖和传递依赖

4.数据库中的关系是什么?
详细请参考:
https://www.zhihu.com/question/19857108/answer/40367985

关系是一个名字,满足一些规则(rules)的就是关系,关系是一个集合
每一列是一个属性,属性有自己的域 domain
一个table的某个状态,是一个relation(关系)

5.介绍一下关系型数据库
关系型数据库类似一个图书馆
一楼的大目录作为索引(1层科技书、2层历史文化书、3层外国文学等)
书作为数据存在
书架、楼层是关系型数据库的数据结构
所有的图书馆管理员就是数据库的进程
有的救火(数据修复、备份)
有的整理书架(数据整理、归档)
而用户进程是来到图书馆的客户,他们看书、移动书,而管理员进行维护

6.介绍一下NoSQL(not only SQL)
泛指非关系型数据库,主要代表:Redis、MongDB
适合存储非结构化数据,如微博、文章、评论
NoSQL常见类型

  • 列式数据:应用场景:按列存储,如 HBase
  • 文档数据库:通常采用 json 或 xml 格式,如 MongDB
  • 图形数据库:典型应用场景:社交网络、推荐系统,如 Neo4j
  • 键值:典型应用场景:内容缓存,如 Redis

7.为什么MySQL的索引要用B+树而不是B树?

因为B树不管是叶子节点还是非叶子节点都会保存数据,这样导致在非叶子节点保存的指针数量变少,会增加树的高度,导致IO操作变多,查询性能变低

8.数据库的视图是什么?
视图实际上提供了一种观察数据的逻辑窗口
视图并不在数据库中实际存在,是一种虚拟表
视图是一个表 or 多个表的行或者列的子集

视图的特点:简单、安全

作用:
1.比如一个复杂的查询,不想反复写,就可以写个视图,简化操作
2.开放特定的表的读取权限

CREATE VIEW <视图名> (列1,列2,...列n)
AS <查询语句>
[WITH CHECK OPTION]

9.存储过程?
是一个预编译的SQL语句
一次编译、永久有效

10.触发器?
触发器是一个特殊的存储过程
当一个预定义的事件发生时,会被MySQL自动调用
简单的说,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行。

11.InnoDB和MyISAM的区别

  • InnoDB支持事务,MyISAM不支持
  • 如果大多数操作是读,可以考虑myisam,既有读也有写,用myisam
  • 系统崩溃后,MyISAM恢复起来很难

详情查看
https://blog.csdn.net/qq_35642036/article/details/82820178
依据索引的顺序和数据库的物理存储顺序是否相同,分成聚簇索引和非聚簇索引
聚簇索引确定表中数据的物理顺序,聚簇索引对表中物理数据重新排列,再重新存储到磁盘上

12.外键约束
外键的作用:保证数据的完整性和一致性
①对子表
在子表上INSERT UPDATE要和主表中的主键值匹配,否则不允许
②对父表
更新或删除中各个选项作用
2.1 no action:数据库引擎引发错误,将回滚对表的删除or更新操作
2.2 cascade级联:删除主表记录,也删除子表的匹配记录
2.3 set null:删除主表记录,子表匹配记录的外键值改为null
2.4 set default:删除主表记录,子表匹配记录的外键值改为default

面向对象&设计模式

1.面向对象三大特性

  • 封装
  • 继承
  • 多态
    • Java实现多态三个条件? 继承 重写 向上转型(父类引用指向子类对象)
    • C++多态用一句话概括:基类的函数加上virtual关键字,派生类重写(overload)该函数,运行时会根据对象的实际类型调用相应的函数

2.类和类之间的关系?

  • 继承:is-a 表示特殊和一般的关系
  • 实现:类和接口之间的关系
  • 组合:整体不存在了,部分会消亡
  • 聚合:has-a,类A的对象包含类B的对象
  • 依赖:类A使用到了类B,类B的变化会影响类A,关系具有临时性、偶然性

类与类之间关系由弱到强:
无关系 --> 依赖 --> 关联 --> 聚合 -->组合

3.继承和派生?
继承着重点是保持原有特性
派生着重点是增加新的特性

4.手写线程安全的单例模式
三个要注意的点

  • 用static修饰单例,保证值创建一次
  • 用private修饰构造方法和单例对象,保证只有类内部能使用
  • synchronized括号里面加上Singleton.class 修饰类,保证线程安全
public class Singleton {
    
    private static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

数学&nlp基础

1.欧氏距离(欧几里得距离) 曼哈顿距离?
欧式距离是最常见的那个,用的勾股定理
曼哈顿距离就是绝对值之差的和

2.蒙特卡洛方法
蒙特卡洛是一类随机方法的统称,这类方法的特点是,可以在随机采样上计算得到近似结果,随着采样的增多,得到正确结果的概率增大

3.HMM (hidden markov model)隐马尔可夫模型
HMM是关于时序的概率模型
定义:模型描述了 由隐藏的马尔可夫链产生不可观测状态序列,再由状态序列产生观测序列的过程
模型三要素:A 状态转移概率 B 观测概率 C 初始概率分布
两个基本假设:

  • 时刻 t 的状态 只依赖于时刻 t-1
  • 任意时刻的观测,只依赖该时刻马尔可夫链的状态

4.CRF(conditional random fiel)条件随机场

5.知识图谱(Knowledge Graph)
知识图谱本质上是语义网络
目的是让机器‘看到’不仅仅是字符串,更能理解文本后的知识
概念:知识图谱由相互连接的实体和他们的属性构成的
节点表示实体,边表示实体和实体之间的关系
知识图谱的存储:

  • RDF(resource description framework)资源描述框架
  • 图数据库(Graph DataBase)

应用:不一致性验证、组团欺诈、异常分析、精准营销

6.word-embedding
参考 https://www.jianshu.com/p/2a76b7d3126b

将文本转化为数值,将一个word,映射(嵌入)到一个数值型向量中

  • 基于频率的word-embedding:counter-vector,TF-IDF,co-occurence vector(共现矩阵)
  • 基于预测的word-embedding:CBOW(continue bag of words)
    skip-gram
    CBOW是已知上下文,预测当前词
    skip-gram是已知当前词,预测上下文

7.TF-IDF(Term Frequency-Inverse Ducument Frequency)
TF:词频=在一个文档中某单词出现的次数/文档所有的词
IDF:逆文档频率=包含该单词的文档数/词库中所有文档数
TF-IDF=TF×IDF
引入IDF的目的就是惩罚在所有文档都经常出现的单词

8.解释一下alpha-beta搜索算法
首先我们知道下棋的过程,用伪代码描述就是

while game is not finish:
	A.step()
	B.step()

A下棋,B下棋,A下棋…直到游戏结束
那么可以描述成一颗N叉数,每个节点是棋盘的状态,根节点是初始状态,奇数层是A下棋之后得到的所有状态,偶数层是B下棋之后得到的所以状态
那么什么是alpha-beta搜索呢?对于每个状态,有个估值函数来打分,在自己的层取最大值,在别人的层取最小值,max-min搜索就是alpha-beta算法的基础,alpha-beta算法是max-min搜索算法的剪枝版本
不管是DFS还是BFS都是盲目搜索,当树很大的时候,效率很低
alpha-beta加上的一些优化:某一定的层退出,搜索超过一定时间退出
DFS搜索 --> max-min搜索 --> alpha-beta搜索 -->排序+启发式搜索

9.启发式(heuristic)搜索
h(x)描述当前状态和目标状态的距离
g(x)描述从起始状态到当前状态的代价
h(x)越小,表示离目标状态越近,如果h(x)=0说明达到了目标状态
搜索依据函数F(x)

  • 当F(x)=g(x),表示根据代价去搜索,比如BFS,从离层最近的开始搜
  • 当F(x)=h(x),表示贪婪搜索,每次向靠目标状态最近的去搜索

10.五子棋棋盘:15×15,0表示空,1表示A的落子,2表示B的落子,状态压缩可以用3进制数表示,15个3进制的数表示行,解码的时候是唯一的,一个3进制定义为short,占2个字节,那么30个字节可以表示当前棋盘状态

11.KNN和K-means

  • KNN(K-nearest-neighbor)有监督学习,需要打标,对于一个未知类别的点,在周围找最近的k个点。投票,谁类别多,归谁的那一类,和K值大小有关
  • Kmeans,无监督学习算法,聚类c个中心,首先从n个数据对象中随机选k个作为聚类中心,剩下的对象计算和中心的距离,和谁近归那个聚类;然后计算新聚类的中心,不断重复这个过程,直到聚类中心不变

详细查看:数据挖掘十大经典算法

12.简单介绍一下决策树和SVM?
决策树是一种树形结构,每个节点是对父节点属性的细分,细分到叶节点,表示某一种分类结果,决策树是不断细分属性,最后叶节点用来分类的树
SVM:把数据投影到高维空间,然后找一个平面使得能将这些点划分开来,并且让距离超平面最小的点距离最大化

  • 22
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值