百度面试

 

昨天面试百度~发挥一般~2个算法题都没发挥好~

题1:两个链表La,Lb,La与Lb有公共子链,现要找到La与Lb的第一个公共子节点。

面试的时候没想到什么好方法~扯了一大堆单链结构中双向访问的技术,还是不能完全解决这个问题,因为虽然时间开销是小但是有空间开销而且破坏原链表结构。

后来在返程公车上想到正解,其实很简单,先求La和Lb的长度,然后得到长度差detaLength,较长的链表从head开始先遍历detaLength个节点。然后La,Lb依次遍历,此时La未访问的节点数与Lb未访问的节点数一样,最后可同时访问到第一个子节点。

题2:海量数据中输出最大的200条记录

这 个当时就只想到了外排序算法~所以就把我知道的外排序算法都说了一下,堆,输者树,赢者树。今天早上又是在公车上才想到这样是不行的,内存里边放的输者树 只是海量数据的一部分数据,当前树根只是内存中最大记录。后来还是在公车上才想到一个可行的方法。不断从海量数据中读入,buffer满时在buffer 上建堆或建输者树,保存树根记录和buffer对应的访问地址或数据流区间,即数据结构typedef pair<record,address> tree_trait。一直到把海量数据读完,对内存中已有的tree_trait数组进行内排序,得到最大的200个tree_trait,剩下的堆因 为队中最大的记录都不能位于前200所以被淘汰。

然后对200个堆,不断输出树根记录最大的堆,并调整堆。

另buffer大小为M,记录条数是N,时间复杂度是建堆O(N),内排序O((N/M)*log(N/M)),200次提取最大记录就有

200堆调整200*(logM)总复杂度是O(N)+O((N/M)*log(N/M))+O(logM) = O(N)

 

百度估计是无望了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值