前几天刚收到百度电话面试,答得不好,不过还是记录一下吧。
一共问了两题:
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 ==