2019.03.26牛客网第二套题知识点整理——小米2019秋招算法笔试题

1 判别模型&生成模型
监督学习分为判别模型和生成模型。
判别模型:由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。
例子:SVM 、逻辑回归(LR)、决策树、K-means聚类
生成模型:由数据学习联合概率密度分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型。
例子:朴素贝叶斯、隐马尔科夫(HMM)

2 快速排序最好时间复杂度是O(nlogn),最坏时间复杂度是O(nn)。快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。在最优情况下(数组完全无序),每次都划分得很均匀,递归的深度最浅为logn。在最坏的情况下,待排序的序列为正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,递归的深度很深为n.
冒泡的最好时间复杂度是O(n),最坏时间复杂度是O(n
n)。最好时间复杂度是建立在对冒泡进行改进的基础上。

public void bubbleSort(int arr[]) {
    boolean didSwap;
    for(int i = 0, len = arr.length; i < len - 1; i++) {
        didSwap = false;
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j]) {
                swap(arr, j, j + 1);
                didSwap = true;
            }
        }
        if(didSwap == false)
            return;
    }    
}

初始didswap=false. 当发生一次交换就将didswap置为true,这样如果原始有序,那么一次扫描完一次交换也不会有,即didswap=false,此时return,终止排序。此时时间复杂度是O(n)。原始数据只要有一对需要改顺序,复杂度就又会变成O(n^2)的。

3 数据库-索引类型
①主索引:主索引是一种只能在数据库表中建立不能在自由表中建立的索引。在指定的字段或表达式中,主索引的关键字绝对不允许有重复值
②候选索引:和主索引类似,它的值也不允许在指定的字段或表达式中重复。一个表中可以有多个候选索引。
③唯一索引:唯一索引允许关键字取重复的值。当有重复值出现时,索引文件只保存重复值的第1次出现。提供唯一索引主要是为了兼容早期的版本。
④普通索引:普通索引允许关键字段有相同值。在一对多关系的多方,可以使用普通索引。

4 深度学习——K-means聚类
K-means聚类目的:将样本聚成k个簇。
步骤:1 随机选取k个聚类质心。
2 重复{对每个样例i,计算其该属于的类;对于每个类,重新计算其类心}直至收敛。
K-means属于聚类分析,只有x,没有y。找到每个样本x潜在的类别y,将同类别y的样本x放在一起。
K-means畸变函数J表示每个点到质心距离的平方和,目标是求畸变函数的最小值。畸变函数是非凸函数,所以只能得到局部最优解。
影响基本K-均值算法的主要因素:样本输入顺序模式相似性测度(通过一定的相似性准则来去掉聚类中心的侯选集,降低算法的时间复杂度);初始类中心的选取

5 深度学习——模型过拟合
模型过拟合:一味的去提高训练数据的预测能力,所选模型的复杂度往往会很,这种现象称为过拟合。所表现的就是模型训练时候的误差很小,但在测试的时候误差很大
造成过拟合的原因:样本数量太少、模型太复杂
降低过拟合的方法:增加更多的样本、Dropout、增加参数惩罚

6 数据结构——二叉树
完全二叉树:前k-1层和满二叉树一样,第k层的节点都集中在左侧。性质:n0=n2+1
平衡二叉树:左右子树的高度差不超过1,左右子树也为平衡二叉树。

7 数学&深度学习——凸函数
凸函数的判定:二阶导是否非负。
凸函数的应用:在深度学习和神经网络中,最好使得目标函数是凸函数,便于取得最优解而非局部最优。

8 深度学习——激活函数
目的:给输出添加非线性因素。
例子:sigmoid()函数,取值在(0,1),用于二分分类。
ReLU()函数,当输入小于0时,输出为0;输入大于0时,输出为其本身。
属性:计算简单、非线性、具有饱和区

9 操作系统——进程与线程
一个任务就是一个进程,一个进程中可以包含多个线程。例如:使用word是一个进程,在这个进程中打字、核查字数、打印是多个线程。操作系统通过交替执行、快速切换来同时执行多个进程、多个线程。
进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
线程间可以直接读写进程数据段(如全局变量)来进行通信。
线程上下文切换比进程上下文切换要快得多。
线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。线程并非一创建就开始运行。

猜你喜欢

转载自blog.csdn.net/weixin_43854189/article/details/88831981
今日推荐