目录
- 选择题
- 简答题
- 第一题
- 第二题
- 编程题
- 第一题
- 题意
- 思路
- 代码
- 第二题
- 题意
- 思路
- 代码
笔试共有选择题30道、简答题2道、编程题2道,分别为60分、60分、40分,两个小时。以下内容的编写全凭记忆和个人理解,如有什么不对的地方,希望大家见谅。
选择题
具体题目肯定记不住了,就说说都有哪些题型吧。
①.给出一段程序,问你这段程序输出啥。
②.给出一段程序,填补缺失部分,让程序得到正确输出。
③.计算机网络知识,ICMP、ipv6基本头啥啥的。
④.编译原理知识,求逆波兰表达式啥啥的。
⑤.数据结构知识,哈夫曼编码长度啥啥的。
⑥.概率论知识,贝叶斯概率啥啥的。
⑦.图论知识,最小生成树啥啥的。
⑧.二维离散沃尔什变换。
⑨.C++里链接器的工作步骤。
我依稀记得那道贝叶斯概率的题,一百度还真找到了。
有一家医院做普查,得到统计数字:(1)每1000人有5个癌症病人;(2)每100个正常人有1个人试验结果为阳性;(3)每100个癌症患者有95个人试验结果为阳性。问:小明连续两次实验结果均为阳性,他是癌症病人的概率。
我的做法是:用表示正常人,用表示癌症患者,则可以得到:
则小明是癌症病人的概率为
简答题
简答题一共两道题。
第一题
相机模型中有哪些参数,写出三维空间中点到图像坐标的投影公式,镜头畸变系数有哪几种,矫正公式是什么。
这题感觉不做相关方向的人根本不会。。。
第二题
细粒度图像检索,如何构建模型,模型大致分为哪几部分,模型如何训练,模型的参数如何确定,怎么提升模型的效果。
我回答如下:
(1)模型结构分为:数据预处理部分、数据读取部分、特征提取部分、DeepHash部分、损失函数部分。数据预处理部分用于对数据进行一些数据增强和变换。数据读取部分用于为模型读入数据。特征提取部分使用vgg模型或者alexnet模型,对输入图片的特征进行提取。DeepHash部分将图片得到的特征图进行Hash编码,用于后续检索。损失函数部分将图片的预测结果和真实标签进行对照,得出损失,用于优化网络参数。
(2)训练方法使用SGD或者ADAM,参数的确定使用grid search方法。
(3)提升性能可以使用集成学习方法,比如bagging和boosting,也可以将特征提取网络部分改为更深层的网络。使用bagging的话,需要将数据分为n组,分别训练出n个模型,最后经过各个模型投票得到结果。使用boosting的话,先将数据进行等概率采样,得到第一次训练的数据集,用其训练一个基模型,对基模型可以正确检索的数据降低其被采样的概率,重复进行:采样+训练+修改概率,得到更好的模型。使用更深层的特征提取网络需要更多的数据,因为网络深导致参数过多,数据量不够容易造成过拟合,过拟合可以通过加dropout和BN层等方法缓解。
当时选择题浪费了太多时间,这题答得急了,笔试结束后仔细想想,题目的重点在于细粒度图像检索,凉凉。
可以参考这篇博客。
编程题
第一题
题意
的字符串,将第一个字符移到字符串的末尾,得到一个新的字符串,无限进行这个移位操作,就可以得到无限多个字符串,输出这些字符串中不重复的字符串个数。
思路
,暴力吧,string+map,直接MLE。那咋整,string+hash+map,这回不MLE了,变成了TLE,只过了58%。
额,笔试后想了想,周期串才会导致重复,所以用KMP求最小循环节,然后应该就可以了。
代码
#include<cstdio>
#include<map>
#include<iostream>
#include<string>
#include<algorithm>
#include<functional>
using namespace std;
char ss[1000001];
int main()
{
while(scanf("%s",ss)!=EOF)
{
string s = ss;
hash<string> hh;
map<size_t,int> mm;
//mm.clear();
//hh.clear();
int ans = 0;
int len = s.length();
s = s + s;
for(int i=0;i<len; ++i)
{
//string tmp1 = s.substr(1,len-1);
//string tmp2 = s.substr(0,1);
//string tmp = s.substr(i,len);
size_t tmp = hh(s.substr(i,len));
if(mm[tmp]==0)
{
mm[tmp]=1;
ans++;
}
//cout<<s<< endl;
}
printf("%d\n",ans);
}
return 0;
}
第二题
题意
和,个询问(没记错的话),每次询问包括两个数字和,求字符串在字符串中出现的次数。
思路
在字符串的所有前缀的答案,然后查询就是O(1)的了,没准就过了。
代码
#include<cstdio>
#include<map>
#include<iostream>
#include<string>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
string a,b;
while(cin>>a)
{
cin>>b;
int lenb = b.length();
int q;
scanf("%d",&q);
while(q--)
{
int l,r;
scanf("%d%d",&l,&r);
int ans=0;
for(int i=l;i<=r-lenb+1;++i)
{
string tmp = a.substr(i,lenb);
if(tmp == b)
{
ans++;
//cout<<i<<" "<<tmp;
}
}
printf("%d\n",ans);
}
}
return 0;
}