踏潮面试总结

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的爬虫知识,其实和这个也是相关的。

临界区、互斥量、事件、信号量四种方式
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作

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.因为项目里写了爬虫,问到了动态页面的抓取,因为没有碰到过,所以不了解。需要了解一下

目前记得这么多,想到再补充。

原文地址:https://www.cnblogs.com/rockwall/p/5783535.html