百度内推一面

前几天刚收到百度电话面试,答得不好,不过还是记录一下吧。

一共问了两题:

1)给定一个数据集,记录是(单词,频率),比如(“love”, 100),(“of”, 30),……。要求设计一个抽样算法,使得样本中单词出现的概率分布和原数据集一致。

举个例子,已知("a",100), ("b",50),样本容量10。当时没有答出来,后来和同学讨论,可以用随机数与记录映射来抽取样本,具体设计如下:

1. 对记录进行排序,按出现频率的降序(或升序)

1. 计算所有单词出现的频率之和(Sum)。这里Sum=100+50。

2. 用随机数算法产生1~150的随机数,记这个算法为Random(start, end) 这里start=1, end=150。约定某个范围的数值代表抽取某个单词。比如可以约定1~100代表单词"a",101~150代表单词"b"。

3. 样本容量为10,运行10次随机数算法Random(1, 150),抽取样本。


2)设计一个算法,在分段有序数组中查找给定值,比如[0,1,4,5,2,10,9,3]。【比较笼统,没说是不是已知各个区间,还有区间长度。。大概知道问题就行。。】

我的想法是设计B-树算法,多路查找树,每个节点包含多个值,将其孩子节点分隔开来。构造成B-树之后,从根节点开始向下查找。

但是有个问题,就是不同的有序区间可能会重叠(具有相同的元素)。

面试官说理解我的意思,但要求更具体的方案,没想出来~~

面试过后,自己又考虑了一下,想了下面这个方法:

扫描一遍数组,将每个有序数组记录下来,比如map< pair<min,max>, pair<left_index, right_index> >这种形式,对min进行排序。

然后查找元素(x),顺序扫描map元素,当x>=min 且 x <= max时,对 Array[left_index, right_index]进行二分查找。


== The End ==


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值