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
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是值传递这个值是对象的引用,把实参对象引用的地址当做值传递给了形式参数。
严格意义上说是共享传递
值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参

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

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拥塞控制算法

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

操作系统

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

补:进程和程序的区别?

  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.进程通信的方法

  • 共享内存
  • 消息队列
  • 管道(匿名管道、命名管道)
  • 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-控制方法
  • 通道-控制方法

计算机组成原理&系统

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

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

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

软件工程

查看文章
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.事务是什么?四大特性?
事务是用户定义的操作序列,是并发控制的单位,操作序列要么全部执行,要么全部不执行
A atom 原子性
C consistency 一致性 如果执行事务前数据库是一致的,执行事务后数据库也是一致的
I isolation 隔离性
D durability 持久性

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

3.数据库范式

  • 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 多个表的行或者列的子集
比如写一个很复杂的查询又不想写很多语句,可以用到视图
视图的特点:简单、安全

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

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

面向对象&设计模式

1.面向对象三大特性

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

2.类和类之间的关系?

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

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

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

数学&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:把数据投影到高维空间,然后找一个平面使得能将这些点划分开来,并且让距离超平面最小的点距离最大化

猜你喜欢

转载自blog.csdn.net/weixin_39666736/article/details/105605224