这里写自定义目录标题
常见面试问题类型:
操作系统:内存管理,线程处理,文件系统,网络
编程:语言java/python/go,递归,继承,类型
算法:时间复杂度,搜索,排序,图
数据结构:数组,堆、队列、栈,树和图,集,哈希映射
数学:概率,平方,阶乘,乘除、mod
系统设计
Algorithms:
1,排序算法:快速排序,归并排序,计数排序
2,搜索算法:回溯,递归,剪枝技巧
3,图论:最短路,最小生成树,网络流模型
4,动态规划:背包问题,最长子序列,计数问题
5,基础技巧:分治,倍增,二分,贪心
Data Structres:
1,数组和链表:单/双链表,跳舞链
2,栈和队列
3,树和图:最近共同祖先,并查集
4,哈希表
5,堆:大小根堆,可并堆
6,字符串:字典树,后缀树
数据结构与算法:
STL标准库
vector:向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
vector实现及基本用法
set:所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。
我们不可以通过set的迭代器改变set元素的值,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterator是一种const_iterator.
set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。
multiset容器基本概念
multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复。set和multiset的底层实现是红黑树。
set 和 unorder_set的区别 ,同 map和unorder_map
set基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。
unordered_set基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。
set使用时设置:
我们需要有序数据(不同的元素)。
我们必须打印/访问数据(按排序顺序)。
我们需要元素的前身/后继者。
在以下情况下使用unordered_set:
我们需要保留一组不同的元素,不需要排序。
我们需要单个元素访问,即没有遍历。
查找算法
排序算法
二叉树的前中后和层次遍历
搜索树
平衡(AVL)树
红黑树
计网:
浏览器输入URL后,到网页响应的全过程
1.浏览器获得url对应的请求,向操作系统请求该url对应的iP地。
2.操作系统查询DNS (首先查询本地host文件,没有则查询网络)获得对应ip地址
3.浏览器发送tcp连接请求向 ip地址对应的服务器(带SYN标志数据包)。4.服务器收到tcp连接请求后,回复可以链接请求(有SYN/ACK标志的数据包)。
5.浏览器收到回传的数据,确认ok后,还会向服务端发送数据(带ACK标志的数据包)包表示三次握手结束。
6.三次握手成功后,浏览器和服务端开始tcp连接形式传输数据包。
7.服务器传给浏览所需要的资源数据。
8.浏览器获得数据,渲染网页然后呈现给用户。
http详解
TCP/IP
三次握手与挥手
TCP之流量控制和拥塞控制
VXLAN详解
TCP连接与断开:
为什么需要“三次握手”:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
只有两次握手,服务端不知道客户端是否已经收到自己的同步信号,如果同步信号丢失,两边的服务端同步信号无法一致。
为什么需要“四次挥手”:
第二次挥手是为了告诉A,B知道你不再发送信息了,且B不再接收信息。但B仍可以向A发送信息。因为A是主动关闭的一方,但B可能仍然有信息未发送完。
第三次挥手是为了告诉A,B的信息发完了,A你可以关闭连接了。
第四次挥手是为了告诉B,A我知道可以关闭连接了,你也可以关闭了。对B来说,第四次挥手B才知道A成功关闭连接了,不关闭很耗费资源,所以要保证关闭了。若B接收不到第四次挥手信息,将会继续第三次挥手,直到收到确认信息为止。
注意:对A来说,第四次挥手后2MSL内未接收到B的第三次挥手信息才会关闭连接,否则会继续第四次挥手。防止B接收不到第四次挥手信息。(若B接收不到第四次挥手信息,将重复发送第三次挥手信息,这个2MSL就是如果真的有重复发送的第三次挥手信息,在这个时间内肯定到达A了(路由不出问题的话),就是为了保证B收到第四次挥手信息)
流量控制和拥塞控制
1)TCP采用大小可变的滑动窗口机制实现流量控制功能。窗口的大小是字节。在TCP报文段首部的窗口字段写入的数值就是当前给对方设置发送窗口的数据的上限。
在数据传输过程中,TCP提供了一种基于滑动窗口协议的流量控制机制,用接收端接收能力(缓冲区的容量)的大小来控制发送端发送的数据量。
2)采用滑动窗口机制还可对网络进行拥塞控制,将网络中的分组(TCP报文段作为其数据部分)数量维持在一定的数量之下,当超过该数值时,网络的性能会急剧恶化。传输层的拥塞控制有慢开始(Slow-Start)、拥塞避免(Congestion Avoidance)、快重传(Fast Retransmit)和快恢复(Fast Recovery)四种算法。
拥塞: 大量数据报涌入同一交换节点(如路由器),导致该节点资源耗尽而必须丢弃后面到达的数据报时,就是拥塞。
数据库:
数据库事务是数据库运行中的逻辑工作单位,单个逻辑工作单元所执行的一系列操作,要么都执行,要么都不执行。例如银行取款事务分为2个步骤(1)存折减款(2)提取现金,2个步骤必须同时完成或者都不完成。
数据库事务的
四大特性(ACID):
(1) 原子性(Atomicity):
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
(2)一致性(Consistency) :
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
(3)分离性(Isolation):
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
(4)持久性(Durability):
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中