机器学习方向
1.为什么需要对数值类型的特征做归一化?
- 为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同指标之间具有可比性。
- 对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。
2.什么是偏差(bias)、方差(variable)之间的均衡?
- 偏差:度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;
- 方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;
- 噪声:表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
3.监督学习和非监督学习有什么不同?
- 监督学习需要训练有标签的数据,例如:分类与回归;
- 无监督学习利用数据本身的特性进行训练,不需要标签,例如:聚类。
4.KNN和 k-means 聚类有什么不同?
- K-Nearest Neighbors是一种监督分类算法,而 k-means聚类是一种无监督的聚类算法;
- K-Nearest Neighbors将待分类的节点类别标记为离它最近的k个节点中的类别众数;
- K均值聚类仅需要一组未标记的点和阈值:算法将采用未标记的点并逐渐学习如何通过计算不同点之间的距离的平均值将它们聚类成组。
5.解释一下ROC曲线的原理?
- ROC曲线是真阳率与各种阈值下的假阳率之间的对比度的图形表示。
6.精度和召回率?
- 精度是预测为阳性的样本中有多少是预测正确的;
- 召回率是真阳性样本中有多少被检测出来了。
7.什么是贝叶斯定理?它在机器学习环境中如何有用?
- 贝叶斯定理描述了当你不能准确知悉一个事物的本质时,你可以依靠与事物特定本质相关的事件出现的多少去判断其本质属性的概率。 它给出了已知先验知识下事件的后验概率。
8.为什么我们要称“朴素”贝叶斯?
- 尽管 Naive Bayes 具有实际应用,特别是在文本挖掘中,但它被认为是“天真的”,因为它假设在实际数据中几乎不可能看到:条件概率被计算为组件个体概率的纯乘积。 这意味着特征的绝对独立性 – 这种情况在现实生活中可能永远不会遇到。
9.L1、L2正则之间有什么不同?
- L2正则,对应的是加入2范数,使得对权重进行衰减,从而达到惩罚损失函数的目的,防止模型过拟合。保留显著减小损失函数方向上的权重,而对于那些对函数值影响不大的权重使其衰减接近于0。相当于加入一个gaussian prior。
- L1正则 对应得失加入1范数,同样可以防止过拟合。它会产生更稀疏的解,即会使得部分权重变为0,达到特征选择的效果。相当于加入了一个laplacean prior。
10.你最喜欢的算法是什么?把它解释一下?
- KNN
11.第一类误差和第二类误差有什么区别?
- 第一类误差指的是假正率,第二类指的是假负率。简单来说,第一类误差意味着假设为真的情况下,作出了拒绝原假设的一种错误推断。第二类误差意味着假设为假的情况下,做出了接受原假设的一种错误判断。
12.什么是深度学习,它与机器学习算法之间有什么联系?
- 深度学习是与神经网络有关的机器学习的一个子集:如何使用反向传播和神经科学中的某些原理来更精确地建模大量未标记或半结构化数据。从这个意义上说,深度学习是一种无监督的学习算法,它通过使用神经网络来学习数据的表示。
13.生成模型与判别模型有什么区别?
- 生成模型将学习数据类别,而判别模型将简单地学习不同类别数据之间的区别。 判别模型通常优于分类任务的生成模型。
14.如何对决策树进行剪枝?
- 剪枝是在决策树中,为了降低模型的复杂度,提高决策树模型的预测精度,去除预测能力较弱的分支后所发生的现象。修剪可以自下而上和自上而下进行,方法包括减少错误修剪和成本复杂度修剪。
- 减少错误修剪可能是最简单的版本:替换每个节点。如果不降低预测精度,则保持修剪。虽然很简单,但这种启发式方法实际上非常接近于一种可以最大限度地优化准确性的方法。
15.模型的精度和模型的性能哪个对你更重要?
- 模型的准确性仅仅是模型性能的一个子集
16.什么是F1数,怎么使用它?
- F1分数是衡量模型性能的指标。它是模型精度和召回的加权平均值,结果趋向于1是最好的,结果趋向于0是最差的。
17.如何处理一个不平衡的数据集?
- 例如,当您有一个分类测试,并且90%的数据都在一个类中时,就会产生一个不平衡的数据集。这就导致了问题:如果您对其他类别的数据没有预测能力,那么90%的精度然而可能会出现偏差!下面是一些克服困难的策略:
- 收集更多数据,直至数据集中的不平衡
- 对数据集重新取样以纠正不平衡
- 在你的数据集中尝试一个不同的算法
18.什么时候你应该使用分类而不是回归?
- 分类产生离散值并将数据集转换为严格的类别,而回归则提供连续的结果,使您能够更好地区分各个点之间的差异。
19.举个例子,说明使用集成学习会很有用?
- 集成学习通过组合一些基学习算法来优化得到更好的预测性能,通常可以防止模型的过拟合使模型更具有鲁棒性。
- bagging、boosting、stacking等
20.如何评估你的机器学习模型的有效性?
- 首先你需要将数据分成训练集和测试集,或者使用给交叉验证方法分割。然后你需要选择度量模型表现的metrics,如F1数、准确率、混淆矩阵等。更重要的是,根据实际情况你需要理解模型度量的轻微差别,以便于选择正确的度量标准。
21.什么是核技巧,有什么用处?
- 核技巧使用核函数,确保在高维空间不需要明确计算点的坐标,而是计算数据的特征空间中的内积。这使其具有一个很有用的属性:更容易的计算高维空间中点的坐标。许多算法都可以表示称这样的内积形式,使用核技巧可以保证低维数据在高维空间中运用算法进行计算。
22.如何处理数据集中丢失或损坏的数据?
- 可以在数据集中找到丢失/损坏的数据,然后删除这些行或列,或者决定用另一个值替换它们。
- 在pandas中,有两种非常有用的方法:isNull()和dropna(),这两种方法将帮助您查找缺少或损坏数据的数据列,并删除这些值。如果要用占位符值(例如0)填充无效值,可以使用fillna()方法。
23.K-means 的优点和缺点,怎么改进?
- 算法思想:对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。目标是最小化平方误差E。
- K-means的优点:
- 原理比较简单,实现也是很容易,收敛速度快。
- 聚类效果较优。
- 算法的可解释度比较强。
- 主要需要调参的参数仅仅是簇数k。
- K-means的缺点:
- K值的选取不好把握(改进:可以通过在一开始给定一个适合的数值给k,通过一次K-means算法得到一次聚类中心。对于得到的聚类中心,根据得到的k个聚类的距离情况,合并距离最近的类,因此聚类中心数减小,当将其用于下次聚类时,相应的聚类数目也减小了,最终得到合适数目的聚类数。可以通过一个评判值E来确定聚类数得到一个合适的位置停下来,而不继续合并聚类中心。重复上述循环,直至评判函数收敛为止,最终得到较优聚类数的聚类结果)。
- 对于不是凸的数据集比较难收敛(改进:基于密度的聚类算法更加适合,比如DESCAN算法)
- 如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
- 采用迭代方法,得到的结果只是局部最优。
- 对噪音和异常点比较的敏感(改进1:离群点检测的LOF算法,通过去除离群点后再聚类,可以减少离群点和孤立点对于聚类效果的影响;改进2:改成求点的中位数,这种聚类方式即K-Mediods聚类(K中值))。
- 初始聚类中心的选择(改进1:k-means++;改进2:二分K-means)
- 初始化的改进、聚类簇的改进、小批量训练的改进
- 华为机器学习岗暑期实习面试问了这个问题。
24.
深度学习方向
1.激活函数的作用?都有哪些激活函数?
- 激活函数是作用于神经网络神经元输出的函数,只有加入了非线性激活函数之后,神经网络才具备了分层的非线性映射学习能力。
- 线性激活函数:线性的,此时神经网络并不能真正改善误差,因为每次迭代的梯度(导数)是相同的。
- 非线性激活函数:
- Sigmoid、tanh:二分类任务输出层,模型隐藏层
- Relu、Leaky Relu:回归任务,卷积神经网络隐藏层
- Softmax:多分类任务输出层
- Softmax函数的性质:Softmax(x) = Softmax(x-t),利用此性质来避免计算溢出!(超参数科技公司面试考)
2. 激活函数的使用有什么注意事项?
- 由于梯度消失的问题,在某些时候需要避免使用Sigmoid和Tanh激活函数;(看激活函数的导数的极限!)
- ReLU函数是一种常见的激活函数,在目前使用是最多的,ReLU永远只在隐藏层中使用;
- 如果遇到了一些死的神经元,我们可以使用Leaky ReLU函数;
- 根据经验,一般可以从ReLU激活函数开始,但是如果ReLU不能很好的解决问题,再去尝试其它的激活函数。
3.了解推荐系统吗?
- 推荐系统的作用就是让用户与信息建立更高效的连接,提升用户体验及商业效益。
4.讲讲图神经网络的应用?
- 在推荐系统中,主要的挑战是如何从交互数据和辅助信息中学习到User或Item的有效表示,并让两者能够以最有效的方法连接起来,从这个角度出发,推荐场景的交互行为数据就是非常经典的「图结构数据」。
- 以网易云音乐的歌曲推荐为例:把用户、歌曲作为图中的节点,用户与歌曲之间的交互行为(点赞、收藏、关注等)作为边,形成一个复杂的图结构网络,在此基础上建模分析,实现更高效的表征、群体识别。比如,两位素不相识的宝妈都爱听某些亲子歌曲,她们在“图”中就有可触达的连接,图学习算法通过这些连接关系学习到合适的表征,进而将这些亲子歌曲更好地推荐给相似的群体。
5. 池化层的作用?
- 特征不变性(feature invariant),池化操作使模型更关注是否存在某些特征而不是特征具体的位置
- 降维、去除冗余信息、对特征进行压缩、简化网络复杂度、减小计算量、减小内存消耗等等。
- 实现非线性
- 可以扩大感知野
- 在一定程度上能防止过拟合的发生
6.你读过的最后一篇深度学习论文是什么?
- 相似度融合网络:用于聚合不同的基因数据类型:Similarity network fusion for aggregating data types on a genomic scale
7.CNN原理?
- CNN由三部分组成:卷积层、池化层和全连接层。
- 卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层类似传统神经网络的部分,用来输出想要的结果。
8.随机森林的原理?
- 属于集成学习中的一种,多个基学习器是并行的。先采用m次自助法,从训练集中抽取出T个训练集和T个验证集,将T个训练集分别训练T个决策树模型,训练的时候不是按照普通的决策树那样直接选择最优的属性进行划分,而是随机选择k个属性,在这k个属性中选择最优的属性。训练好这T个决策树模型后,利用之前的验证集对这T个决策树模型进行剪枝,得到最终的集成模型。用于分类的话可以用投票得到最终类别,回归的话,可以是直接将所有结果取平均。
9.大数定律?
- 在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。偶然中包含着某种必然。
10.文本数据的预处理?
- 数据整合以及体量观测:对数据进行读取以及对各个标签数据集合进行整合,对各个标记进行整合
- 文本数据分词:对保存的文本进行一个分词操作,选用jieba分词
- 词云:对分词文本进行词云统计,以获取该语料的词频特性,在词云绘制中我们需要对用于词云绘制的语料进行去停用词操作,停用词往往是一段话、一篇文章出现最多的,如果不去除我们生成的词云将会难以判断出语料的词频特性。
- 句长统计:进行词嵌入以及需要设定的句子序列长短时,就要考虑文本数据的句子长度信息
11.GBDT?
- GBDT(Gradient Boosting Decision Tree):是一种基于决策树的集成算法。其中Gradient Boosting 是集成方法boosting中的一种算法,通过梯度下降来对新的学习器进行迭代。而GBDT中采用的就是CART决策树。
- Boosting指把多个弱学习器相加,产生一个新的强学习器。经典的例子有:adaboost, GBDT, xgboost等。
- adaboost每次加大分错样本的权重,GB则是每次拟合上一预测的残差;
- XGBoost(eXtreme Gradient Boosting)极致梯度提升,是一种基于GBDT的算法或者说工程实现。
- XGBoost的基本思想和GBDT相同,但是做了一些优化,比如二阶导数使损失函数更精准;正则项避免树过拟合;Block存储可以并行计算等。
- XGBoost具有高效、灵活和轻便的特点,在数据挖掘、推荐系统等领域得到广泛的应用。
12.skipgram?
- Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,从直观上理解,Skip-Gram是给定input word来预测上下文。而CBOW是给定上下文,来预测input word。
13.BN层的作用?
- 加快收敛速度:在深度神经网络中中,如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,而如果把 每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。
- 控制梯度爆炸防止梯度消失;
- 防止过拟合:在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。目前在实践上,倾向于把BN放在ReLU后面。
14.常见数据预处理方式?
- 缺失值填补、数据归一化、离散变量编码
15. 数据分箱算法了解吗?分箱算法的好处,python常用的自动分箱的库?
- 无监督分箱:等宽分箱、等频分箱、基于k均值聚类的分箱;
- 有监督分箱:在分箱时考虑因变量的取值,使得分箱后达到最小熵(minimumentropy)或最小描述长度(minimumdescriptionlength)。
- woe库函数
16.K-means和GMM原理,两个有什么联系和区别?
- K-means无法将两个均值相同(聚类中心点相同)的类进行聚类,而高斯混合模型(Gaussian Mixture Model, GMM)就是为了解决这一缺点而提出的。GMM是通过选择成分最大化后验概率来完成聚类的,各数据点的后验概率表示属于各类的可能性,而不是判定它完全属于某个类,所以称为软聚类。其在各类尺寸不同、聚类间有相关关系的时候可能比k-means聚类更合适。
- 基本思想:用多个高斯分布函数去近似任意形状的概率分布,所以GMM就是由多个单高斯密度分布(Gaussian)组成的,每个Gaussian叫一个"Component",这些"Component"线性加和即为 GMM 的概率密度函数。将待聚类的数据点看成是分布的采样点,通过采样点利用类似极大似然估计的方法估计高斯分布的参数,求出参数(用EM算法求解)即得出了数据点对分类的隶属函数。
- k-means:E过程,根据固定的各个簇的中心点,对每个样本就近分配所属的簇;M过程,根据样本划分好的簇,重新计算簇的中心点,更新E过程的固定值。
- GMM的E过程,先固定每个模型的均值和方差,计算该样本属于各个簇的概率;M过程,使用E中的概率,更新各个模型的均值和方差。
- 所以每次循环时, 先固定当前的高斯分布不变, 获得每个数据点由各个高斯分布生成的概率。 然后固定该生成概率不变, 根据数据点和生成概率, 获得一个组更佳的高斯分布。 循环往复, 直到参数的不再变化, 或者变化非常小时, 便得到了比较合理的一组高斯分布。相比于K均值算法的优点是, 可以给出一个样本属于某类的概率是多少。
16.BN的原理和具体实现?
- 在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理,然后再进入网络的下一层。 不过文献归一化层,可不像我们想象的那么简单,它是一个可学习、有参数的网络层。
- BN训练的时候,均值和方差的统计量都是在batch维度上统计得到的,但是测试的时候batch size一般是1,没办法得到统计量,因此一般会保存最后一个训练批次得到的统计量,或者对最后几个批次的统计量进行moving average,用于最后的测试。
17.Dropout前传和后传的差异?
- 按照概率将输出的feature置零,就可以同时解决前传和反传
18.BN和Dropout一起用的时候会出现什么问题?
- BN是采用训练时得到的均值和方差对数据进行归一化的,现在dropout层的方差不一致,因此两种方式一起用会使模型性能下架。
- 拒绝方差偏移,只在所有BN层的后面采用dropout层
- dropout原文提出了一种高斯dropout,论文再进一步对高斯dropout进行扩展,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。
19.
Python知识点
1.Python的多进程实现?
- Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线程对象中的守护线程方法是setDeamon,而Process进程对象的守护进程是通过设置daemon属性来完成的。
2.Python的内存回收与C的区别?
- python由自动垃圾收集器进行内存管理.
- c++中程序员必须自己进行内存管理
- Python垃圾回收机制?
- 引用计数:python的垃圾回收机制主要是引用计数为主,分代回收为辅. 引用计数就是每个对象维护一个ob_refcnt,用来记录当前对象被引用的次数.当计数器减到0,那么该内存就会被python虚拟机销毁.(消耗资源,需要维护计数器的资源.,无法解决循环引用的问题,和shared_ptr一样出现了循环引用无法正常回收)
- 标记删除:标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。
- 分代回收:首先建立了一个链表,把创建的对象都加入,这个链表是Generation Zero.随后,Python会循环遍历零代列表上的每个对象,检查列表中每个互相引用的对象,根据规则减掉其引用计数。减到0的对象就可以被释放,不是0的对象就会被移动到一代链表中.循环上面的过程,如果一代链表中存活下来的就会被放入二代链表.
3. Python的函数怎么实现可变参数数量?
- 用星号实现用来将任意个数的参数导入到 Python 函数中
4.一个星号个两个星号的区别?
- 单星号(*):*agrs:将所有参数以元组(tuple)的形式导入
- 双星号(**)将参数以字典的形式导入
5.Python变量下划线的意义?
6.
PyTorch知识点
1.分布式训练?
- 分布式训练就是指将模型放置在很多台机器并且在每台机器上的多个GPU上进行训练,之所以使用分布式训练的原因一般来说有两种:其一是模型在一块GPU上放不下,其二使用多块GPU进行并行计算能够加速训练。但是需要注意的是随着使用的GPU数量增加,各个设备之间的通信会变得复杂,导致训练速度下降。
- 布式训练主要分为两种类型:数据并行化 (Data Parallel) 以及模型平行化(Model Parallel)。
- Pytorch提供了两种分布式训练方法—DataParallel(DP)、DistributedDataParallel(DDP)。
- DP采用Parameter Server(PS)构架,并且仅支持单台机器多GPU,任务中只会有一个进程
- DDP则是采用Ring-All-Reduce构架,可支持多台机器多GPU,能够使用多进程。
操作系统知识点
1.引起创建进程的事件:
- 用户登录
- 作业调度
- 提供服务(用户程序提出请求)
- 应用请求(基于应用进程的需求)
2.虚拟存储实现的方法?
- 分页请求系统
- 分段请求系统
- 两种方式的结合
3.处理机调度的结构?
- 挂起的意思是将进程从内存搬至外存,激活的意思是将进程从外存搬至内存。
4.高响应比优先调度算法?
- 响应比R=(等待时间+执行时间)/执行时间
- 综合考虑了每个进程的等待时间和执行时间,对于同时到达的长进程和短进程,短进程会优先执行,以提高系统吞吐量;而长进程的响应比可以随等待时间的增加而提高,不会产生进程无法调度的情况。
5.死锁?
- 预防死锁:是干掉死锁的四个条件当中的一个或多个条件
- 银行家算法是最具代表性的避免死锁的方法
6. 低级调度?
- 通常把低级调度(Low Level Scheduling)称为进程调度或短程调度(ShorTerm Scheduling) 它所调用的对象是进程(或内核级线程)
- 如果系统只有用户态线程,则线程对操作系统是不可见的,操作系统只能调度进程;
- 如果系统中有内核态线程,则操作系统可以按线程进行调度;
7.发生“抖动”的根本原因?
- 如果分配给进程的存储块数量小于进程所需要的最小值,进程的运行将很频繁地产生缺页中断,这种频率非常高的页面置换现象称为抖动。
- 系统抖动:是指刚被调出的页又立即被调入所形成的频繁调入调出的现象。
- 原因:置换算法选择不当
- 解决办法:优化置换算法;减少进程数;增大内存
8.进程的特点?
- 1结构性 每个进程有一个控制块 PCB。
2.动态性 进程的实质是进程实体的一次执行过程。动态性是进程的最基本的特征。
3.并发性 可以与其它进程一道在宏观上同时向前推进。动态性是进程的重要特征。
4.独立性 进程是一个能独立运行 独立分配资源和独立调度的基本单位。
5.异步性 每个进程都以其相对独立、不可预知的速度向前推进。
9.进程之间的通信方式?(字节常考)
- 管道通信
- 匿名管道通信:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
- 高级管道通信:将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
- 消息队列通信:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号量通信:信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
- 信号:信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 共享内存通信:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
- 套接字通信(socket):套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。(网络通信)
10.进程与线程?
- 进程:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。
- 线程:进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
计算机网络知识点
1.域名系统?
- 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
2.IP数据报的格式?
- 格式如下:
3.FTP端口?
4.端口号对应服务关系?
5.计算机网络分层结构?
6.CSMA/CD即载波监听多点接入/碰撞检测?
- 使用截断二进制指数退避算法来确定碰撞后重传的时机
- 0坚持:线路忙,等待一段时间,再监听;不忙时,立即发送
- 1坚持:线路忙,继续监听,;不忙时,立即发送
- p坚持:线路忙,继续监听;不忙时,根据p概率进行发送,另外(1-p)概率继续监听
7.私有地址?
- 10.0.0.0~10.255.255.255
- 172.16.0.0~172.31.255.255
- 192.168.0.0~192.168.255.255
8.http属于tcp还是udp?
- HTTP/1.1 和 HTTP/2 都是基于 TCP 传输协议的,而 HTTP/3 是基于 UDP 传输协议的。
- 互联网协议分层模型最厉害的就是解耦,上下层互相不依赖。
9.tcp和udp的区别?
- 是否连接 面向连接 面向非连接
- 传输可靠性 可靠 不可靠
- 应用场合 传输大量数据 少量数据
- 速度 慢 快
- 两者都是支持全双工!
10.http中的状态码有哪些?
11.http中的字段有哪些?
- 求行、首部行和实体主体
12.udp中有哪些字段?
- UDP有两个字段:数据字段和首部字段
13.TCP三次握手?
C语言知识点
1.C语言的预编译?
- C语言由源代码生成的各阶段如下: C源程序-编译预处理(.i)-编译(.s)-汇编程序(.o)-链接程序(加入库文件.a/.so)-可执行文件。
- 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。
2.C语言动态库和静态库区别?
- 一种是静态库(库程序是直接注入目标程序的,不分彼此,库文件通常以.a结尾),另一种是动态库(库程序是在运行目标程序时(中)加载的,库文件通常以.so结尾)
- 静态库和动态库的最大区别是,静态库链接的时候把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度和降低程序的耦合度。
- 静态库的代码在编译的过程中已经载入到可执行文件中,所以最后生成的可执行文件相对较大。
- 动态库的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,所以最后生成的可执行文件相对较小。
3.指针的拷贝?
- 浅拷贝是指针拷贝,2个指针(地址捆绑线)指向同一个地址堆内存区(同一个实例对象区)。
- 浅拷贝就是拷贝指向原来对象的指针,使原对象的引用计数+1,可以理解为创建了一个指向原对象的新指针而已,并没有创建一个全新的对象。
4.常量指针,与指针常量?
- 指针常量:本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。
- 常量指针:本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。
5.
算法与数据结构
1.语言的层级?
2.描述哈希表?
- 哈希表是一种产生关联数组的数据结构。 通过使用散列函数将键映射到某些值。 它们通常用于数据库索引等任务
3.用较快的办法找到一个未排序数组第k大的数字?
- 冒泡排序、堆排序(大顶堆)
- 十大排序算法的复杂度、代码实现、稳定性等是常考的,参考:十大排序方法比较
4. 用均匀分布随机整数生成器rand(7)来实现rand(10)?
5.差分数组?
- 如果给你一个包含5000万个元素的数组,然后会有频繁区间修改操作,那什么是频繁的区间修改操作呢?比如让第1个数到第1000万个数每个数都加上1,而且这种操作时频繁的?
- d0=a0-0,di=a[i]-a[i-1]。差分推导公式。如果是对1-4的数字进行加3操作,那么只需要操作d1和d5即可。