1.TCP建立连接过程
2.HTTP操作过程
3.长连接怎么设置
connection keep-alive,这个没想起来,答了一下长连接和短链接,说了下现在浏览器很多都是默认HTTP 1.1但具体设置忘记了,其实就是在headers里面加connection keep-alive
4.求镜像树
递归就行,比较简单。
5.有一个1亿的用户UID,求出里面出现次数前100的UID,计算时间复杂度。
采用小顶堆,分治,先将1亿数据分为若干组,然后分别求出每组的前100的UID,然后汇总求出一共的100个UID,总的时间复杂度是nlogk
这边又问了小顶堆是什么数据结构实现的,我其实没太想起来,说了数组实现的完全二叉树,面试官笑我看的东西挺多,但是自己动手实践的太少~哈哈,这东西好久之前看到的,刚才网上看了一下,的确是二叉堆
问了我一下父节点和孩子节点的索引。比如当前节点是i父节点是i/2,孩子节点是i*2和i*2+1;其实是不完整的,要根据根节点是0还是1来确定,但大致差不多。
6.进程和线程,这边没答好,前几天总结过,线程才是CPU调度的最小单位
7.线程同步(不会)答了进程的通信。。233333 - -#哈哈哈,需要了解一下。
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,目前实现线程同步的方法有很多,临界区对象就是其中一种。我这边通过单例模式说了一下,刚才查了一下,的确有点差不多,C++通过std::mutex的加锁和解锁来保证。其实这边我感觉可以引申一下我之前做的异步IO的爬虫知识,其实和这个也是相关的。
8.vector容器的动态扩增
它主要分为三个步骤:配置新空间,数据移动,释放旧空间。这三个步骤执行的次数以及每次执行时的效率是影响最终 vector 效率的关键因素。为了减少执行的次数,就需要未雨绸缪,每次扩充空间时,成倍增长。而每次执行的效率,就主要是数据移动的效率了。
9.string a="abc";
sizeof(a);
a += "cde";
sizeof(a);
没答好,这边sizeof的值都是不变的,具体值是根据编译器和系统是32位还是64位决定的,因为这边a只是一个指针。sizeof()它本身只是一个操作法,而不是函数!!
在C++中,string的size可以用a.size()
10.查找中位数,说了两种,一种就是最简单的排列以后查找,第二种就是基于快排的查找,分别计算时间复杂度。
这边时间复杂度没答好,想当然的以为是log(n)其实计算可以发现,比如pivot每次都是接近中点的话,第一次比较N次,第二次N/2,第三次N/4.。。。。所以总的时间复杂度是O(2N)和log没有关系。
不要想当然啊~~~!!!
11.vector容器push_back总的时间复杂度,之前有看过,但是没有看它具体是怎么实现的,需要去了解一下。
我只答了对于没有重新分配空间复杂度是O(1)但是计算上分配空间总的时间复杂度没有分析,因为我没有深入了解过。只记得总的平均复杂度也是常数。
了解了一下,其实对于vector来说,具体是常数几要看他移动了几次,比如就扩容了一次,那么相当于对n个元素移动1次,那么就是2的时间复杂度,如果移动两次,那么前k个移动2次,n-k个移动1次,所以总的算下来还是常数 时间复杂度。
12.问到了右值引用,他的作用,这个记得不怎么清楚
13.谈到了移动构造函数,没有问,但自己吓了一下,因为移动构造函数了解的不深,需要补一下。
14.神经网路中卷积核的作用。因为这个项目做的东西比较久了,所以很多都忘记了,需要回顾一下。
15.红黑树的实现,怎么实现平衡的,最后还问了个什么三大经典算法什么的,我不是特别清楚具体指什么,反正没答上来。
网上查了一下,貌似是三大平衡树,Treap /Splay/ SBT, http://blog.csdn.net/u012077152/article/details/44944499 这个没有了解过,需要适当了解一下
除了这个还需要看一下B树,B+,B*树大致的概念和适用的情况。
16.因为项目里写了爬虫,问到了动态页面的抓取,因为没有碰到过,所以不了解。需要了解一下
目前记得这么多,想到再补充。