苏宁北京研发中心Python面试题

匿名网友 匿名网友 发布于: 2016-11-18 00:00:00
阅读 196 收藏 0 点赞 0 评论 0

1.堆排序的原理及堆调整的代码实现

先将所有记录构建成一个堆(例如最小堆)。把堆顶最小元素输出,将最后一个叶子结点L移动到堆顶,这样会破坏堆的结构,所以自上往下

调整这个L结点,直到找到合适的位置满足堆的性质。然后再输出堆顶的最小元素,重复上述过程,直到所有元素输出。

初始构造堆的过程不是每个元素依次进堆,而是初始所有元素进堆,但是堆是无序的,然后依次调整所有的非终端结点即可得到初始堆。

堆排序适合记录数较多的情况,对n较小的情况不提倡,因为其运行时间耗费在初始建堆和调整堆栈时所进行的反复比较,比较次数较多。

另外,堆排序时所有记录结点使用的是数组连续存储,而不是类似二叉树的指针链式存储。

堆排序及堆调整的代码实现见job_interview分支

2.最长公共字串

用给定的两个字符串A[n]和B[m]构建n行*m列的一个矩阵AB。A[i]和B[j]的值相等时AB[i][j]的值为矩阵上其左上角的值(AB[i-1][j-1])加1。

否则AB[i][j]的值赋值为0。最后扫描整个矩阵找出最大值,即使最长公共字串的长短,返回该值所在横坐标或纵坐标即可求出最长公共字串。

3.使用python对一个dict中的元素按value的值排序输出

print sorted(d.items(), lambda x,y : cmp(x[1], y[1]))

4.讲一下你关注的开源的东西,libevent吧

Libevent是C语言编写的,开源高性能网络库。特点是事件驱动,跨平台,轻量级(专注于网络),高性能。

Libevent在linux上是封装epoll实现,实现方式是典型的Reactor模式,首先初始化libevent,相当于新建一个reactor实例。然后添加事件,

注册事件响应的处理函数。之后启动libevent中的事件循环,等待监听事件发生。当事件发生后,reactor调用相应的接口函数(类似回调函数)

进行处理。

5.什么情况下用红黑树实现的map,什么情况下更适合用哈希表实现的hash_map?

如果对内存的使用比较严格,希望尽可能的减少内存的使用就使用红黑树,如果更注重效率就使用哈希表,因为查找速度与数据量无关。

如果有动态调整的需要,红黑树的可扩展性更好。如果数据是完全静态的,用一张哈希表更好。

6.什么情况下需要把类和方法的实现写入.h文件?

模板类以及模板函数的定义和实现需要都写入.h文件。(具体原因见面试经历2.txt)

7.gdb输出16进制变量,backtrace,frame n用于切换栈帧

显示变量的16进制: p/x var。另外 x/3uh 0x2058 (x命令可以用来查看内存地址上的值)

评论列表
文章目录