2015百度校招笔试真题以及解析(一)

1、为分析用户行为,系统常需存储用户的一些 query ,但因 query 非常多,故系统不能全存,设系统每天只存 m 个 query ,现设计一个算法,对用户请求的 query 进行随机选择 m 个,请给一个方案,使得每个 query 被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量。



解析1:思路:如果用户查询的数量小于 m ,那么直接就存起来。如果用户查询的数量大于 m ,假设为 m+i ,那么在 1—–m+i 之间随机产生一个数,如果选择的是前面 m 条查询进行存取,那么概率为 m/ ( m+i ),如果选择的是后面 i 条记录中的查询,那么用这个记录来替换前面 m 条查询记录的概率为 m/ ( m+i ) * ( 1-1/m ) =(m-1)/(m+i) ,当查询记录量很大的时候, m/ ( m+i ) == (m-1)/(m+i) ,所以每个 query 被抽中的概率是相等的。

解析2:

大致伪代码如下:
int count = 1;
string query[m+1]; //为了方便理解,从1开始存
while(scanf("%s",&cur_query)!=EOF) {
      count++;
      if(count <= m) {  // 如果输入小于m,直接存。
         query[count] = cur_query;
      } else {  // 剩余的,就随机一个数,并交换。具体为何,在下述证明可见
         int M = random(1, count);
         if( M < m) {
             query[M] = cur_query;
         }
}

证明每个query被抽中的概率相等:(假设总请求量为N)

1、如果N<=m,每个query都被存下来,那么query被抽中保存下来的概率均为1。

2、N > m, 将query分成前m个和后m个来看(其实也就对应伪码中if/else 两种处理方式):

对于第i个数(i < m),在前m步被选中的概率仍是1.但是从第m+1步,i就有可能被替换掉,被替换掉的概率是
1/count。第m+1步,count = m+1,所以不被替换的概率为m/m+1。接下来的也就是m+1/m+2、m+2/m+3 。
那么读到第N个数时, 显然第i个数被选中的概率 = 每一步都不替换的概率,即 m/m+1 * m+1/m+2 … n-1/n =
m/n。

对于第i个数(i >= m)时。要想被选中的概率为,首先,在它出现的那一次,M的取值要小于k,这个概率就是m/count.
接下来每一步都不被替换的计算过程跟上面一样。所以此时第i个数被选中的概率 = m/count * count /count+1
*…*n-1/n = m/n所以用这种方法,概率是相同的。



2、设 rand ( s , t )返回 [s,t] 之间的随机小数,利用该函数在一个半径为 R 的圆内找随机 n 个点,并给出时间复杂度分析。

思路:这个使用数学中的极坐标来解决,先调用 [s1 , t1] 随机产生一个数 r ,归一化后乘以半径,得到 R* ( r-s1 ) / (t1-s1 ),然后在调用 [s2 , t2] 随机产生一个数 a ,归一化后得到角度: 360* ( a-s2 ) / ( t2-s2> )。



3 、 C++ STL 中 vector 的相关问题:
( 1 )、调用 push_back 时,其内部的内存分配是如何进行的?
( 2 )、调用 clear 时,内部是如何具体实现的?若想将其内存释放,该如何操作?



vector 的工作原理是系统预先分配一块 CAPACITY 大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。

vector 为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存, clear 只是清数据了,未清内存,因为 vector 的 capacity 容量未变化,系统维护一个的默认值。

有什么方法可以释放掉 vector 中占用的全部内存呢 ?

标准的解决方法如下:

template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}

事实上, vector 根本就不管内存,它只是负责向内存管理框架 acquire/release 内存,内存管理框架如果发现内存不够了,就 malloc ,但是当 vector 释放资源的时候 ( 比如 destruct), stl 根本就不调用 free 以减少内存,因为内存分配在 stl 的底层: stl 假定如果你需要更多的资源就代表你以后也可能需要这么多资源 ( 你的 list, hashmap 也是用这些内存 ) ,所以就没必要不停地 malloc/free 。如果是这个逻辑的话这可能是个 trade-off。

一般的 STL 内存管理器 allocator 都是用内存池来管理内存的,所以某个容器申请内存或释放内存都只是影响到内存池的剩余内存量,而不是真的把内存归还给系统。这样做一是为了避免内存碎片,二是提高了内存申请和释放的效率 —— 不用每次都在系统内存里寻找一番。

时间: 2024-10-15 16:33:00

2015百度校招笔试真题以及解析(一)的相关文章

2015百度校招笔试真题以及解析(二)

1.static关键字,static全局变量与普通全局变量的区别,static局部变量与普通变量的区别,static函数与普通函数的区别. 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有

2013百度校招笔试真题以及解析(内存管理及其优缺点总结)

简述Windows内存管理的几种方式以及优缺点. Windows内存管理方式如下图所示: 1.单一连续分配 所谓单一,是指内存中只驻留一道作业.为便于地址转换,把作业连续的存放在内存中,而不是离散的存放.单一连续区的管理思想主要用在早期的单道批处理系统中,采用静态分配的方式,即作业或进程一进入内存,就要等到它结束后才释放内存. 优点: 方法简单,易于实现 缺点: 仅适合于单道程序 2.分区管理 分区管理是把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共

2013百度校招笔试真题以及解析(二)

1.一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词.提供一个单词,在字典中找到它的兄弟.描述数据结构和查询过程. 思路1:使用hash_map和链表 (1)首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key.例如,将单词按字母从小到大重新排序后作为其key,比如bad的key为abd,good的key为dgoo. (2)使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址. (3)开始时,先遍历字

2014Microsoft 校招笔试真题(找工作的虾米们赶紧做题晒答案喽)

2014百度研发真题及其解析-求比指定数大且最小的“不重复数”

题目: 给定一个正整数n,求比n大的第一个"不重复数"."不重复数"的定义:如果一个数,任何相邻两个数位上的数字都不相同,则称为不重复数.例如1234是不重复数,而1101不是. 思路一:暴力 数值加一,判断是否是重复数,如果是,继续加一判断,直到找到一个不是重复数的. #include <iostream> #include <cstring> #include <vector> #include <algorithm&g

2013第四届蓝桥杯 C/C++本科A组 真题答案解析【交流帖】

今年的蓝桥杯又已经结束了,做的还是不怎么样,很多题目不难但就是算不出最终的结果,很是纠结,看来路还很长,另外昨天(2013-5-7)也受到了也受到了微软的thank you letter了,哎,都是苦逼的一天.不说了,直接看题吧,如果你对我的做法有异议或者有更好的解法,请给我留言,我会及时更新~~~~~ 1.高斯日记  大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯

京东2017校园招聘笔试真题(希尔排序)

对关键字{10,20,8,25,35,6,18,30,5,15,28}序列进行希尔排序,取增量d =5时,排序结果为( ) A. {6,18,8,5,15,10,20,30,25,35,28} B. {10,18,8,5,15,6,20,30,25,35,28} C. {10,20,8,5,15,6,18,30,25,35,28} D. {10,20,30,5,8,6,15,18,25,28,35} 希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法

备战2016年软考必做真题!

网络规划设计师 2012年下半年网络规划设计师下午案例分析真题+答案解析:http://down.51cto.com/data/1405756 2013年网络规划设计师上午真题及答案解析:http://down.51cto.com/data/1861654 2014年下半年网络规划师下午1案例分析真题及答案:http://down.51cto.com/data/1906669 2015 年下半年网络规划师下午案例分析真题及答案:http://down.51cto.com/data/2117462

JAVA认证历年真题解析二(附答案)

问题描述 我在网上偶然看到一个网站,这个网站里面的资料非常全,除了一些免费的资料,还有网络视频,觉得非常不错,大家有兴趣或者需要,可以去看看[中华IT学习网]www.100itxx.com内容介绍>>本试卷共有45道题,每题后面都有详细解析.例:1.Whichofthefollowingrangeofshortiscorrect?A.-27--27-1B.0--216-1C.?215--215-1D.?231--231-1翻译下面哪些是short型的取值范围.答案 C解析 短整型的数据类型的长