这个文档是我之前在求职时总结的一些知识点,总体来说十分琐碎,可以在没事的时候看一下,如果希望更好地理解知识,建议还是看一些其他的书籍或者总结性比较好得博客~
数据结构与算法
排序
- 常见的稳定的排序算法有:
(1)直接插入排序,(2)冒泡排序,(3)归并排序,(4)基数排序; - 常见的不稳定的排序算法有:
(1)简单选择排序,(2)希尔排序,(3)快速排序,(4)堆排序。
回溯法与分支定界法
- 回溯法是按照
深度优先搜索
的方法,遍历解空间,并且找到最优解。在搜索的过程中,会使用减枝
的方法,避免搜索吴无效解。 - 分支定界法是按照
广度优先搜索
的方法,在解空间中搜索满足条件的解。 - 回溯法与分支定界法的求解方式不同,它们的求解目标一般也不相同,回溯法是希望找到最优解,而分支定界法一般是希望找到满足特定条件的最优解(不需要遍历所有的解空间)。
常见的搜索算法
- 完全搜索
- 广度优先搜索
- 分指定界搜索
- 定向搜索
- 最优优先搜索
- 启发式搜索
- 序列向前选择
- 序列向后选择
- 双向搜索
- 增L去R选择算法
- 序列浮动选择
- 决策树
- 随机搜索
- 随机产生序列选择算法
- 模拟退火算法
- 遗传算法
哈希表/散列表
- 采用开放定址法处理散列表的冲突时,其平均查找长度大于链接法的平均查找长度。
- 开放定址法中,一旦发生冲突,就会去寻找下一个空的散列地址。按照定址方式不同,有
线性探查法、二次探查法、 双重散列法
等。 - 链接法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较小。
深度学习
加速收敛过程
- 深度学习中加速收敛/降低训练难度的方法有:瓶颈结构、残差、学习率、步长、动量、优化方法、预训练。
BN(Batch Normalization)
- 在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(归一化至:均值0、方差为1),然后再进入网络的下一层。不过归一化层可不像我们想象的那么简单,它是一个可学习、有参数( )的网络层。
- 主要步骤为
- 求数据均值。
- 求数据方差。
- 对数据进行标准化。
- 训练参数 。
- 输出y通过 与 的线性变换得到新的值。
BP算法
- 与普通反向传播不同的是,BPTT会在每个时间步长内叠加所有对应权重的梯度。
CNN中感受野和feature map的计算
- 假设上一层感受野的大小为out,当前kernel的size与stride分别是ksize与kstride,则该层感受野大小为
rfsize = f(out, stride, ksize) = (out - 1) * kstride + ksize
。 - 假设上一层feature map大小为N,该层卷积kernel的size与stride分别是ksize与kstride,padding为p,因此当前输出feature map的大小为
M=(N-ksize+2p)/kstride+1
。
网络训练中的参数初始化方法
-
Xavier初始化适合于普通的激活函数,如sigmoid、tanh函数等。Xavier初始化生成的分布是均匀分布,具体如下
其中 为特定层网络输入的大小, 为特顶层网络输出的大小,在caffe中计算如下int fan_in = blob->count() / blob->num(); int fan_out = blob->count() / blob->channels();
其中blob->count()
的大小是
。
- He初始化适合于RELU函数。它是产生符合正态分布的随机数,标准差为
CNN在图像中的广泛应用的原因
- 局部连接
- 权值共享:减小参数量
- 池化操作:增大感受野
- 多层次结构:可以提取low-level以及high-level的信息
CNN不适用的场景
- 数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。
- 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。
神经网络效果不好时,可以思考的角度
- 是否找到合适的损失函数?(不同问题适合不同的损失函数)(理解不同损失函数的适用场景)
- batch size是否合适?batch size太大 -> loss很快平稳,batch size太小 -> loss会震荡(理解mini-batch)
- 是否选择了合适的激活函数?(各个激活函数的来源和差异)
- 学习率,学习率小收敛慢,学习率大loss震荡(怎么选取合适的学习率)
- 是否选择了合适的优化算法?(比如adam)(理解不同优化算法的适用场景)
- 是否过拟合?(深度学习拟合能力强,容易过拟合)(理解过拟合的各个解决方案)
a. Early Stopping
b. Regularization(正则化)
c. Weight Decay(收缩权重)
d. Dropout(随机失活)
e. 调整网络结构
linux基础知识
ls
- Linux下,查看某路径下用(ls -l)查看所有文件的详细属性列表时,会看到文件的操作权限,类似“drwxr-xr-x”的字符串。这串字符可以分成4段理解,结构为“d + 文件所有者操作权限 + 文件所有者所在组操作权限 + 其余人的操作权限”
shell
- 查看本系统支持shell类型的配置文件是
/etc/shells
- 用户登录成功后就会启动/etc/passwd文件配置的shell程序, linux的标准shell是bash, bash首先读取的文件是
/etc/profile
和.bash_profile
。
进程
- 每一个进程的**
周转时间
**为该进程完成时间减去该进程到达时间。 - 如果进程造成死锁,则它只能在
阻塞队列
中;如果进程是在就绪队列
中,说明该进程在等待,其等待其他进程完成任务。
线程
- pthread在多核平台上提供了多种锁机制
- Mutex lock:互斥锁
- Spin lock:自旋锁
- Condition Variable:条件变量
- Read/Write lock:读写锁
- 自旋锁(spin lock):类似于互斥锁,但调用者的线程不会被挂起,而是一直处于忙等待的状态,因此效率远高于互斥锁。
杂
网络基础知识
-
A&B&C类地址的区别
- A类地址:1.0.0.0-126.0.0.0
- B类地址:128.0.0.0-191.255.255.255
- C类地址:192.0.0.0-223.255.255.255
也可以换成2进制判断: - A类地址0开头
- B类地址10开头
- C类地址110开头
-
子域名可以访问根域名的Cookie,反之则不行。
-
TCP断开连接的时候,客户端的变化
- 应用层调用close函数发起关闭连接请求
- 发送FIN到对端,关闭写通道,自己进入
FIN_WAIT1
状态 - 等待对端的确认ACK到来,接受到ACK后进入
FIN_WAIT2
状态;如果在超时时间内没有收到确认ACK直接进入CLOSED状态 - 如果在FIN_WAIT1状态时收到了对端的FIN则进入CLOSING状态
- 在FIN_WAIT2接受到了对端FIN后进入
TIME_WAIT
状态;如果在超时时间内没有收这个FIN则直接进入CLOSED状态 - 在TIME_WAIT状态等待2个MSL后进入CLOSED状态
-
网络的几个层的协议
- 传输层协议:
TCP,UDP
- 应用层协议:
HTTP
- 网络层:
ICMP
- 注意:
TCP/IP
模型中,ARP
协议属于网络层
;在OSI模型
中,ARP协议属于数据链路层
。
- 传输层协议:
C++基础
-
在C/C++中,如果一个int的数前面有一个0,则它是8进制的数,比如
int a = 010, b = 10;
a和b用10进制表示时,a=8,b=10。
-
派生类对基类成员的访问方式有2种:在
派生类类内访问
或者定义派生类对象并访问基类成员
。- 在派生类内访问时,不管是 public、protected、private 继承,总是可以访问基类中的public、protected 成员,基类中的 private 成员永远不能在派生类内直接访问,不论通过哪种方式。
- 使用派生类对象进行定义和访问时,仅当public派生时,对基类中的public成员有可访问/可修改的权限,其他都为不可访问/不可修改。
-
关于类和结构体所占内存的详细说明:https://www.cnblogs.com/-zhangnian/p/6422559.html
-
内存分为几个部分:
- 栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。注意:栈是从高到低分配内存的。
- 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
- 全局数据区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
- 文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
- 程序代码区:存放函数体的二进制代码。
-
对于程序中没有被初始化的全局变量,它们被存储在BSS段(Block Started by Symbol)
-
栈区效率比堆区高,new和malloc分配的空间在堆区,临时变量分配在栈区。区别是:栈区由电脑自己清除(用完自动删),堆区需要程序员清除,或者程序结束后由系统清除
-
new&delete和malloc&free的联系与区别
new和malloc都是申请内存空间,分配的空间都在堆存储区
。- new的时候会初始化内存空间,而malloc只是申请了内存空间,不进行初始化;同时,delete会调用析构函数,而free只是释放内存空间,指针还在(因此free之后,还需要设置指针为NULL)。
- malloc&free是C/C++的标准库函数,而new&delete是C++的运算符。
-
C++中函数不能嵌套定义,因为每一个函数都有一个内存地址,这个地址是函数入口,它是不可以在其他函数中定义的。
-
关于指针和引用:指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间,只是别名,也不传值给他。
-
浮点运算时,
对阶操作
是计算两个浮点数的阶码的差值,差值不为零时阶码较小的尾数右移。 -
面向对象有三种特性:派生,继承,多态
- 其中多态性有两种,一种是依靠函数重载实现的静态绑定,一种是依靠虚函数实现的动态绑定。动态绑定跟对象的引用类型无关,他会根据具体的对象调用对应的方法。
静态函数与静态类
- 静态函数属于类本身,不与类绑定,因此
不能用this指针
。 - 在类定义时,无法使用构造函数,因而无法完成对象的初始化。
- 一般成员变量需要在类内进行初始化。
静态成员变量必须在类外初始化
,静态成员常量在类中初始化
。- 类的静态函数可以不需要对类进行实例化而调用,即使一个指向类的指针为NULL,也可以通过它去调用类中的静态函数而不会发生异常
关于const
- const在
*
的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*
的右边,则指针的指向不可变。简记为"左定值,右定向"。
关于稳定排序与非稳定排序
- stable sort:插入排序、冒泡排序、归并排序、计数排序、基数排序、桶排序。
- unstable sort:选择排序、快速排序、堆排序。
数学知识
排列组合等数学知识
- n个人按顺序坐在自己的位置上。站起来之后,这n个人中每个人都不站在原来的位置的方法数有:
这种直接记住。
高/同/低阶无穷小
- Lim(A/B) 的极限
- 0就是A是B高阶无穷小
- 为无穷就说A是B的低阶无穷小
- 为1就是等价
- 为常数不等于1就是同阶无穷小.
线性代数
矩阵的迹
- 定义:矩阵中所有主对角线元素值的和。
- 一些特征
- 如果矩阵A和B相似,则他们的迹是相同的。
- 一个方阵的迹等于它所有的特征值之和(这种方阵与特征值组成的矩阵是相似的)。
距离度量
- 欧式距离:m维空间中点的真实距离,计算为
- 马氏距离:马氏距离又称为数据的
协方差距离
,它是一种有效的计算两个未知样本集
的相似度的方法。与标准化欧氏距离不同的是它考虑到各种特性之间的联系
。 - 假设
为向量
的均值,
为
的均值,
是
与
的协方差。则X与Y的马氏距离为:
是X与Y的协方差。 - 欧式距离具有旋转不变性。
- 马氏距离是尺度无关的(量纲无关),同时考虑了数据之间的联系,它是基于
卡方分布
的,是用于度量多元outlier离群点的统计方法。 - 曼哈顿距离:为所有维度坐标差值的绝对值之和。
- 汉明距离:汉明距离是两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。