【interview——Ali】project interview_18 summer
完全没有准备的一次面试……意外
两部分:Word2vec + 中位数 (还有聊对科研的想法和自己研究能力的评价?
word2vec //解释模型
原本是one-hot,存在缺点:稀疏和无法表现语义,词与词之间无法计算距离 //CBOW和skip-gram简要介绍一下是什么
CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。
Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。 //这两种算法如何选择
CBOW对小型数据比较合适,skip-gram在大型语料中表现更好 //word2vec的损失函数是什么
NCE-loss: NCE的主要思想是,对于每一个样本,除了他自己的label,同时采样出N个其他的label,从而我们只需要计算样本在这N+1个label上的概率,而不用计算样本在所有label上的概率。
峰哥教我是负采样?使用所谓的“负采样”(negative sampling)来改进优化对象,这将造成每一个训练的样本只会更对模型权重的很小一个比例的更新。
//瞎扯了交叉熵
因为上面的问题回答错了嘛……sigh
信息熵 + 相对熵= 交叉熵
K-L散度:就是相对熵,是一种量化两种概率分布P和Q之间差异的方式。
换句话说,KL散度计算的就是数据的原分布与近似分布的概率的对数差的期望值。
如何找出一个整数数组的中位数:
//最简单的思路
排序,quicksort然后找中位数【nlogn】 //quicksort的最差情况
时间复杂度【n^】就是每次选定的数都是最大或者最小 //改进一点的找中位数的做法
partition法 ,利用快排关键字的查找方法
a.随机选取一个关键字key,将序列二分;
b.若关键字的下标大于N/,则继续对序列的左半部分执行partition;
c.若关键字的下标小于N/,则继续对序列的左半部分执行partition;
d.若关键字的下标等于N/,则返回key。
这种算法:partition的时间复杂度为【O(n)】因为是n+n/+n/+n/+…所以是O(n)
取中位数的时间复杂度是【O()】
简单解释就是:每次会丢掉一半 //堆
原理分析:
中位数无非就是将序列分为两个部分,左边的部分都小于中位数,右边的序列都大于中位数。这比较符合堆的特性(看看数据结构在算法中的重要性,选择好的数据结构能够让算法事半功倍)。可以将序列分成两个部分,左边的部分够着大根堆,右边的部分构造小根堆。
具体实现细节:
a.如果堆中元素的个数为偶数时,将新数字插入小根堆中(插入后堆元素的个数为奇数,此时结束插入,返回小根堆堆顶元素);如果堆中的元素个数为奇数时,将新数字插入大根堆中(插入后堆元素的个数为偶数,此时结束插入,返回两堆堆顶元素的均值)。
b.若插入小根堆的元素大于大根堆堆顶的元素,说明新元素位于序列的右半部分,应当插入大根堆。而此时大根堆堆顶元素应当位于左半序列(小顶堆)中,因此需要将大根堆堆顶元素插入小根堆。若插入若插入小顶堆的元素不大于大顶堆堆顶的元素,则直接插入小根堆。
c.同理,向大根堆插入元素时也有如上考虑。
调整堆的时间复杂度为【O(logn)】,取中位数的时间复杂度为【O()】。 参考:https://blog.csdn.net/cpu_12593/article/details/48231213
面试题41
partition函数找中位数的写法(做递归之前要判断):
求第k大数的时候,pivot的不满足条件的那一侧数据不需要再去处理了,平均时间复杂度为O(N+N/2+N/4+...)=O(N)。而快排则需要处理,复杂度为O(nlogn)。
public int findMiddleByPartition(int[] array, int left, int right) {
int i = left, j = right;
int key = array[left];
while(i < j) {
// j向左走,直到找到一个小于key的数
while(i < j && array[j] >= key) j--;
if(i < j) {
array[i] = array[j];
i++;
}
// i向右走,直到找到一个大于key的数
while(i < j && array[i] <= key) i++;
if(i < j) {
array[j] = array[i];
j--;
}
}
array[i] = key;
if(i == array.length / 2) {
return i;
}else if(i < array.length / 2){
return findMiddleByPartition(array, i + 1, right);
}else {
return findMiddleByPartition(array, left, i - 1);
} }
堆排序的方法,自己的语言复述:
将数据平均分配到构建的最大堆和最小堆中,为了实现平均分配,可以在数据的总数目是偶数的时候把新数据插入最小堆,否则插入最大堆。
为了保证最大堆中的所有数据都小于最小堆中的数据,当数据的数目是偶数的时候,先把这个新的数据加入最大堆,然后把最大堆中的最大数字拿出来插入最小堆,反之当数据中的数目是奇数的时候,先把这个新的数据加入最小堆,然后把最小堆中的最小值加入最大堆。
template<typename T> class DynamicArray{
public:
void Insert (T num){
if ((min.size() + max.size())& == ){ //这是偶数
if (max.size()> && num <max[]){
max.push_back(num); //加入最大堆
push_heap(max.begin(). max.end(), less<T>());
num = max[]; //取max的最大
pop_heap(max.begin(), max.end(), less<T>());
max.pop_back();
}
min.push_back(num); //将max的最大放入min
push_heap(min.begin(),min.end(),greater<T>());
}
else{
//类似上面的部分,只是加入最小堆,把最小堆的最小取出来,放入最大堆
}
}
T GetMedian(){ //返回中位数
int size = min.size() + max.size();
if (size == )
throw exception("No numbers are available");
T median = ;
if ((size &)==)
median = min[];
else
median = (min[]+max[])/;
return median;
} private:
vector<T> min;
vector<T> max; //用vector实现堆!!!
}
附加题:如果数据非常多,要确定准确的中位数,应该怎么做?
这里,采用基于二进制位比较 和 快速排序算法中的“分割思想”来寻找中位数。具体如下:
假设10亿个数字保存在一个大文件中,依次读一部分文件到内存(不超过内存的限制:1GB),将每个数字用二进制表示,比较二进制的最高位(第32位),如果数字的最高位为0,则将这个数字写入 file_0文件中;如果最高位为 1,则将该数字写入file_1文件中。【这里的最高位类似于快速排序中的枢轴元素】
从而将10亿个数字分成了两个文件(几乎是二分的),假设 file_0文件中有 6亿 个数字,file_1文件中有 4亿 个数字。那么中位数就在 file_0 文件中,并且是 file_0 文件中所有数字排序之后的第 1亿 个数字。
【为什么呢?因为10亿个数字的中位数是10亿个数排序之后的第5亿个数。现在file_0有6亿个数,file_1有4亿个数,file_0中的数都比file_1中的数要大(最高位为符号位,file_1中的数都是负数,file_0中的数都是正数,也即这里一共只有4亿个负数,排序之后的第5亿个数一定是正数,那么排序之后的第5亿个数一定位于file_0中)】。除去4亿个负数,中位数就是6亿个正数从小到大排序之后 的第 1 亿个数。
现在,我们只需要处理 file_0 文件了(不需要再考虑file_1文件)。对于 file_0 文件,同样采取上面的措施处理:将file_0文件依次读一部分到内存(不超内存限制:1GB),将每个数字用二进制表示,比较二进制的 次高位(第31位),如果数字的次高位为0,写入file_0_0文件中;如果次高位为1,写入file_0_1文件 中。
现假设 file_0_0文件中有3亿个数字,file_0_1中也有3亿个数字,则中位数就是:file_0_0文件中的数字从小到大排序之后的第1亿个数字。
抛弃file_0_1文件,继续对 file_0_0文件 根据 次次高位(第30位) 划分,假设此次划分的两个文件为:file_0_0_0中有0.5亿个数字,file_0_0_1中有2.5亿个数字,那么中位数就是 file_0_0_1文件中的所有数字排序之后的 第 0.5亿 个数。
......
按照上述思路,直到划分的文件可直接加载进内存时(比如划分的文件中只有5KW个数字了),就可以直接对数字进行快速排序,找出中位数了。当然,你也使用“快排的分割算法”来找出中位数(比使用快速排序要快)
总结:上面的海量数据寻找中位数,其实就是利用了“分割”思想,每次将 问题空间 大约分解成原问题空间的一半左右。(划分成两个文件,直接丢弃其中一个文件),故总的复杂度可视为O(logN)
【interview——Ali】project interview_18 summer的更多相关文章
- 【intellij idea】Project Structure 讲解
项目的左侧面板 项目设置->Project Project Settings -> Modules Sources面板 Paths面板 dependencies面板 Project Set ...
- 21. 【intellij idea】Project Structure 讲解
转自:.https://www.cnblogs.com/zadomn0920/p/6196962.html 项目的左侧面板 项目设置->Project Project Settings -> ...
- 【核心】project(idea文件)、module(iml文件)到SSM集成、热部署、Tomcat启动、MAVEN依赖冲突
http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/project-composition-introduce.html 在 Inte ...
- 【Visual Studio】The project appears to be under source control, but the associated source control plug-in is not installed on this computer
[问题描述]用 Visual Studio 2013打开一个项目时,出现下面错误: [问题原因]参考 http://codeverge.com/asp.net.web-forms/the-projec ...
- 【57.97%】【codeforces Round #380A】Interview with Oleg
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【已解决】Android Studio下,gradle project sync failed 错误
原文:[已解决]Android Studio下,gradle project sync failed 错误 Android studio下突然报错 gradle project sync failed ...
- 震撼,java面试题整合(良心制作)11万多字拿去。持续更新【可以收藏】
一.javaSE面试题整合 Java部分 JDK中哪些类是不能继承的?[信雅达面试题] [参考答案] 不能继承的是类是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的 ...
- 【.NET MF】.NET Micro Framework USB移植
1.开发环境 windows 7 32位 MDK 4.54 .Net Micro Framework Porting Kit 4.2(RTM QFE2) .Net Micro Framework ...
- 冰冻三尺非一日之寒--Django框架【进阶篇】
第十九章 Django进阶 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
随机推荐
- [蓝桥杯]2016蓝桥省赛B组题目及详解
/*——————————————————————————————————————————————————————————— [结果填空题]T1 (分值:3) 题目:煤球数目 有一堆煤球,堆成三角棱锥形 ...
- HashMap源码解读(jdk1.8)
1.相关常量 默认初始化容量(大小) static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 最大容量 static final int M ...
- golang面向对象和interface接口
一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...
- 利用ajax技术 实现用户注册。
一.ajax? 异步加载技术,在不刷新网页的前提下,实现部分网页内容的更新! AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容. 思考? 注册界面刚好可以应用 ...
- codeforces581D
Three Logos CodeForces - 581D Three companies decided to order a billboard with pictures of their lo ...
- Glide和Picasso的区别
首先简单的介绍下两个库的出身: Picasso是Square公司出品的一款非常优秀的开源图片加载库Glide是由Google开发,基于 Picasso,依然有保存了Picasso的简洁风格,但是在此做 ...
- magento-2.2.6-1VM环境镜像-沙箱 - - 完全隔离的环境
打包处理下载地址: 链接:https://pan.baidu.com/s/1HX0WjWEN8Wc-4TDvgEWMog 提取码:s2ls 官方下载 文档 BITNAMI MAGENTO堆栈虚拟机 B ...
- 微信小程序onLaunch、onLoad执行生命周期
原文转载自:微信小程序onLaunch.onLoad执行生命周期 1.需求:先执行App的onLaunch添加验证权限等,再执行Page里的onLoad. 2.问题:还没有等onLaunch执行完成, ...
- js重点--原型链
通过将一个构造函数的原型对象指向父类的实例,就可以调用父类中的实例属性及父类的原型对象属性,实现继承. function animals(){ this.type = "animals&qu ...
- I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成, ...