网易:
1.TCP的三次握手和四次挥手
中断连接端可以是Client端,也可以是Server端。
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
2.阐述一下DNS域名解析过程
{1、当客户机提出查询请求时,首先在本地计算机的缓存中查找。如果在本地无法获得查询信息,则将查询请求发给DNS服务器。
2、首先客户机将域名查询请求发送到本地DNS服务器,当本地DNS服务器接到查询后,首先在该服务器管理的区域的记录中查找,如果找到该记录,则利用此记录进行解析;如果没有区域信息可以满足查询要求,服务器在本地的缓存中查找。
3、如果本地服务器不能在本地找到客户机查询的信息,将客户机请求发送到根域名DNS服务器。
4、根域名服务器负责解析客户机请求的根域部分,它将包含下一级域名信息的DNS服务器地址返回给客户机的DNS服务器地址。
5、客户机的DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域我的DNS服务器地址。
6、按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应IP地址信息。
7、客户机的本地DNS服务器将递归查询结果返回客户机。
8、客户机利用从本地DNS服务器查询得到的IP访问目标主机,就完成了一个解析过程}
3.介绍一下post与get的区别
4.遍历一下一个字符串所有的子串
关于自带排序算法的讲解
https://blog.csdn.net/weixin_43721000/article/details/120504199
测试开发面试题
问1. 链表和数组的区别,和各自应用场景。
数组:我们知道不管是一维数组还是二维数组培训它们在内存里面的地址都 必须是连续的
优点:既然地址是连续的那么必然给我查找数据提供了极大的方便,让我们很容易的就能根据下标找到你需要的数据,提高了我们的效率
缺点:我们刚刚在它的优点中只讲到提高我们查找数据的效率,因为毕竟我们对数组的运用不只是查找数据,还有增加数据,插入数据,删除数据等一些操作;由于数组的特殊性,使得我们在进行这些操作的时候不能对其进行直接操作,还要重新开辟一个新的数组并使其长度增加来存放数据,这样的工作模式给我们带来了很大的不便,影响了效率
链表:链表的地址不是连续的,可以随意存放,删除等操作,通过引用来关联数据,链表可以分为单向的和双向的
优点:链表和数组的差别就在于链表在对数据进行插入和删除的时候可以不用开辟新的空间,只需要找到需要操作的结点就可以了,大大提高了人我们的效率
缺点:数组利于了查找,那链表就不利于查找咯
数组应用场景:数据比较少;经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定。
链表应用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。
问2. 如何不免堆内推的碎片化。
答自己提前申请一大片内存,自己定义上面的内存结构。
问3. 决策树算法。
决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。
问1. 链表和数组的区别,和各自应用场景。
数组:我们知道不管是一维数组还是二维数组培训它们在内存里面的地址都 必须是连续的
优点:既然地址是连续的那么必然给我查找数据提供了极大的方便,让我们很容易的就能根据下标找到你需要的数据,提高了我们的效率
缺点:我们刚刚在它的优点中只讲到提高我们查找数据的效率,因为毕竟我们对数组的运用不只是查找数据,还有增加数据,插入数据,删除数据等一些操作;由于数组的特殊性,使得我们在进行这些操作的时候不能对其进行直接操作,还要重新开辟一个新的数组并使其长度增加来存放数据,这样的工作模式给我们带来了很大的不便,影响了效率
链表:链表的地址不是连续的,可以随意存放,删除等操作,通过引用来关联数据,链表可以分为单向的和双向的
优点:链表和数组的差别就在于链表在对数据进行插入和删除的时候可以不用开辟新的空间,只需要找到需要操作的结点就可以了,大大提高了人我们的效率
缺点:数组利于了查找,那链表就不利于查找咯
数组应用场景:数据比较少;经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定。
链表应用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。
问2. 如何不免堆内推的碎片化。
答自己提前申请一大片内存,自己定义上面的内存结构。
问3. 决策树算法。
决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。
关于深度学习
深度学习项目,怎么训练的,网络如何设计?数据集是什么?
Input:一个人脸数据库,15个人,每人20个样本(左右)。
Output:人脸检测,并识别出每张检测到的人脸。
深度学习网络设计流程
Step 1:定义问题收集数据
Step 2:选择衡量成功的指标
Step 3:确定评估方法
Step 4:准备数据
Step 5:开发比基准更好的模型
Step 6:扩大模型规模:开发过拟合的模型
Step 7:模型正则化与调节超参数
Step 1:定义问题收集数据
确定问题是什么:即输入与预测分别是什么;
确定分类问题:是二分类问题、多分类问题、标量回归问题、向量回归问题, 还是多分类、多标签、聚类、生成、强化学习等;
假设输出是可以根据输入进行预测的(排除不可预测问题,Eg: 根据夏装销量预测冬装销量的非平稳问题;)
假设数据包含足够多信息,足以学习出输入和输出的关系;
Step 2:选择衡量成功的指标
观测是否成功的标志:
平衡分类问题:精度(accuracy)和接收者操作特征曲线下面积(ROC AUC)?
类别不平衡问题:准确率(precision)和召回率(recall)
排序或多标签分类:平均准确率均值(Mean Average Precision)
Step 3:确定评估方法
衡量当前进展(只选其一):
留出验证集:数据量大时可以采用;
折交叉验证:用于流出验证样本量太少;
重复的K折验证:如果可用的数据很少,同时模型评估又需要非常准确;
Step 4:准备数据
知道训练什么、要优化什么以及评估方法基础上,格式化数据使其可以输入到模型:
将数据处理为张量;
张量数值保持在较小范围,比如 (0,1) (-1,1);
不同的特征具有不同的取值范围(异质数据),那么应该做数据标准化;
对小数据问题,需要做特征工程;
Step 5:开发比基准更好的模型
开发一个小模型,打败纯随机基准(dumb baseline),获得统计功效(Statistical power):
假设输出是可以根据输入进行预测的;
假设数据包含足够多的信息,足以学习输入和输出之间的关系;
构建
最后一层激活函数:对网络的输出进行限制;
损失函数:匹配要解决的问题的类型;
优化配置:使用的 优化器、学习率 【一般使用rmsprop与默认的学习率】
Step 6:扩大模型规模:开发过拟合的模型
获得统计功效模型,判断模型是否足够强大,增加模型规模;
(1)添加更多层;
(2)让每一层变得更大;
(3)训练更多的轮次;
出现过拟合后,准备正则化和调节模型;
Step 7:模型正则化与调节超参数
尝试以下几项,达到模型最佳性能:
(1)添加 Dropout;
(2)尝试不同的架构:增加或减少层数;
(3)添加 L1 和/或 L2 正则化;
(4)尝试不同的超参数(比如每层的单元个数或优化器的学习率),以找到最佳配置;
(可选)反复做特征工程:添加新特征或删除没有信息量的特征;
【验证过程中,使用同一数据验证模型效果,会出现模型对验证过程过拟合,降低验证过程的可靠性;】
最后开发出满意的模型,在所有可用数据(训练数据+验证数据)训练最终模型,并用测试数据评估;若结果不理想,表明验证流程不可靠,可能需要更换可靠的评估方法,如重复的K折验证;
数据集的拆分:
首先要准备好已经处理好的数据集(注意数据集要满足独立同分布),分为训练集、验证集、测试集。可按80%,10%,10%分割。
训练集用来整个模型的训练。
验证集在训练过程中验证是否过拟合。
测试集切记只用在最终判断模型的质量的,切记变成根据测试集调参了,这样测试集没意义。
训练的关键:
在输入数据做迭代训练时的关键要关注模型在训练集(绿线)和验证集(紫线)所画出的误差曲线之间关系(或准确度曲线,曲线任选其一,误差越小越好或准确度越高越好)
欠拟合及应对方法:
如果训练集和验证集的误差均较高,则说明训练还不够,处于模型欠拟合状态,需要继续迭代训练,当然如果迭代多久都无法降低误差,则考虑所用的模型是否太小了,导致模型学不到东西。
过拟合及应对方法:
如果训练集和验证集的两者之间的误差差别较大,训练集的误差较低(训练集的误差永远是越来越低的,因为模型就是在不断拟合训练集的),而验证集的误差相对较高,则模型已经处于过拟合状态了。因为模型已经训练的过头,倾向于死记硬背的记住训练集,不再具有泛化性,而在验证集上的表现就很差。此时可以考虑用正则化的方法,如L1正则化或L2正则化,也可以使用Dropout(随机丢弃神经元的)的方法,防止过拟合。
最佳拟合:
当然,欠拟合和过拟合的中间状态就是刚好拟合,是最佳的训练效果,这里用到的方法叫做Early Stopping,就是当你的验证集的误差曲线不断降低,但是验证集的误差开始有向上反弹的趋势时就可以停止训练的迭代了,此时模型的参数就是拟合的较好的情况。
人脸识别过程中输入的是视频流,在识别过程中视频流速率多少?是否有丢帧情况?是每一帧都都识别吗?
这个跟嵌入式端程序运行速度有关,如果能运行到30ms以内 就是每一帧都识别,如果60ms 就是跳一帧, 90ms就跳两帧 相当三帧识别一帧,所以要求帧率越高越好 也就是是程序运行越快越好,识别的帧率只跟运行的速度有关。
电影模糊是比特率低,视频播放卡是帧速率低。视频的比特率和帧速率的区别:
1、定义的区别
比特率是指每秒传送的比特(bit)数。比特率越高,传送数据速度越快。
帧速率是帧的位图图像连续出现在显示器上的频率(速率)。
2、单位的区别
比特率单位为 bps(Bit Per Second)。
帧速率单位为赫兹(Hz)。
3、表示的对象的区别
比特率是单位时间播放连续的媒体如压缩后的音频或视频的比特数量。在这个意义上讲,它相当于术语数字带宽消耗量,或吞吐量。
解释jvm原理
在人脸识别中,我们通常采用欧氏距离和余弦距离来衡量人脸特征的相似度,判别是否为同一个人。
欧氏距离
欧氏距离比较简单,采用欧氏公式直接计算两个点之间的距离,如下:
diff = np.subtract(feature1, feature2)
dist = np.sqrt(np.sum(np.square(diff)))
余弦距离
余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。
当两个向量直接的夹角趋向0时,两个向量越接近,差异就越小。此时 = 1,即越接近1值时,说明人脸越相似。
区别
欧氏距离计算的是空间中两个点的绝对距离,距离dist越小,特征越相似;
余弦距离衡量的是空间中两个向量的夹角,夹角越靠近0,即dist越接近1,特征越相似。
从上面的代码,可以看到其实我们在实际的人脸识别中,可以对标准的欧氏距离和余弦距离做适当的放大,这样在更有利于阈值的比较,更精准。那么阈值我们怎么选值呢?在上面第二段代码中可以找到答案,可以看到最佳阈值是可以算出来的,代码 thresholds = np.arange(0, 4, 0.001) ,最佳阈值在(0, 4)之间进行查找,在acc_train 最高时的threshold来当中最佳阈值。
识别率99.8是怎么评估的?实际环境中识别效果也很好吗?
给定两个有序数组a,b以及一个数n,求这两个数组中第n小的数。并用测试的角度增加健壮性。有没有优化思路?如何进行优化?
A = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’] # 出现的元素
B = [1, 5, 0, 45, 78] # 元素出现的次数(统计结果)
Z = zip(B, A) # 对AB进行封装,把频率放在前面
Z = sorted(Z, reverse=True) # 进行逆序排列
B, A = zip(*Z) # 进行解压,其中的AB已经按照频率排好
for i,j in zip(B, A):
print(i,’\t’,j)
a=[1,4,6,8,90,30]
b=[3,5,78,90,76,54]
c=a+b;
d=sorted©
print(d)
print(d[3])
1.http请求都有哪些?有什么区别?
HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的不同操作方式,具体介绍如下:
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET:向特定的资源发出请求。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟。
带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。
延迟:
o浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有 4 个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。
oDNS 查询(DNS Lookup):浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是 DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的。
o建立连接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大
HTTP1.0和HTTP1.1的一些区别
HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:
1.缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
2.带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
3.错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
4.Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
5.长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
四、HTTPS与HTTP的一些区别
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
2.对服务器命令熟悉?
3.数据库查询怎么实现的?
4.你项目中的亮点?
5.numpy或者矩阵运算为什么比一般循环快?
numpy,他能把简单好用的python和高性能的c语言合并在一起,当调用numpy功能的时候,其实调用了很多的c语言而不是纯的python
其实numpy就是c的逻辑,创建存储容器’array’的时候在c上是寻找到一连串区域来存放,但是python存放的时候则不是连续的区域,这使得
python在索引这个容器里的数据时不是那么的有效率,numpy只需要在这块固定的连续区域前后来回走动就能拿到数据了
在运用numpy的时候我们通常不是一个一维的array来存放数据,而是用二维和三维的快来存放,因为numpy的快速矩阵相乘的运算,能将乘法分配
到计算机中的多个核,让运算并行,从而实现多线程/多进程,这种并行的计算大大加快了运算的速度
6.有如下代码,请问运行结果是?
还是来做一下题吧:假设有一个有序数组,给定一个数target,求数组中对数和等于target的对数,比如数组是1,2,3,4,5 target=6,则[1,5]就是一对数答案,请将所有答案存放在二维数组里面,时间复杂度O(n).
假设数组无序,请保证时间复杂度O(