0、前言
哈希表 红黑树!
1、两个栈实现一个队列,栈的特性、队列的特性
栈的应用:
- 递归代码转成非递归代码,使用栈!
队列的引用:
- 哈夫曼编码,用到非递归,就用到队列!
- …
线性表 排序算法 哈希表 二叉树 五大算法
2、BST树的第K大的节点,BST树的结构和特性?
BST树:
- 左节点的值 < 当前节点 < 右节点的值;
- 是一颗二叉树,不一定平衡!
- 中序遍历是一个从小到大排序的!
BST AVL RB B-树 B+树:
- 都是一颗BST树;(可以进行相互延伸!)
BST树的第K大的节点:求中序遍历第K大的节点即可!
3、vector底层数据结构,为什么是2倍扩容?
size:得到元素的个数;
compacity:容量大小;
可以构造一个函数,不断的向vector中插入元素,打印size大小和compacity大小,即可知道是怎么扩容的!(Win是1.5倍扩容,GCC下是2倍扩容!)
为什么是2倍扩容?
- 涉及到扩容的均摊时间;
- 以倍数扩容时,效率是最高的!
为什么1.5倍扩容最好?
2倍扩容:
- 0 1 2 4 8 16 32 64 2倍扩容; 用户调用malloc,在glibc下是通过ptmalloc实现基于bin和chunk的内存管理, malloc按照页面 - 内核分配brk(分配小块内存) mmap(分配大块内存)
- 2倍扩容新的内存,原来的内存是永远不能重复利用的!
1.5倍扩容:
- 0 1 2 3 4 6 9 1.5倍扩容
- 利于内存的复用 内存碎片的复用;可以将前面释放的内存复用起来!
- 1.5倍扩容新的内存,原来的内存是永远可以重复利用的!
4、map、set
关联容器:
-
set和map:红黑树;
-
unordered_set和unordered_map:哈希表
使用场景:
- 只要应用的场景对数据的增删查都有要求,对于数据的有序性没有要求,一般都使用哈希表;反之使用红黑树。
为什么底层使用红黑树或哈希表?
- 介绍红黑树的特点,旋转、增加、左旋、右旋,颜色时如何变化的;
- 对于哈希表,哈希冲突,链式哈希表,常用的哈希函数;
位图、哈希表、布隆过滤器!解决问题经常一起思考的!
5、gcc是什么工具,编译链接原理
编译链接原理:程序员的自我修养!
gcc:编译工具,编译工具链,最早编译C语言,后面各种语言都可以编译!
g++:编译C++
gdb coredump gcc *.cpp*
coredump:核心的堆转储文件,记录程序挂掉的内存的详细信息,以及各个线程函数调用堆栈的信息!
使用gdb调试,查看程序为什么挂掉了!使用gdb直接调试coredump!
在C++中写的C++代码,用了C++的io流、STL,还有gcc编译时会产生链接错误!默认的链接的是libc.so,而不是libc++.so
6、linux下的进程状态,如何查看进程的状态?
面试考察:
- Linux的进程和线程;
- 怎么解释进程和线程,后面讲解;
- 进程的状态,进程的通信;
- 线程状态,线程的通信;
进程的状态:
- R:表示2个,就绪和运行,不管是正在享受CPU的时间片,正在被调度,还是调度中,收拾R状态;
- S:sleeping,睡眠状态,是可中断的;
- D:不可中断状态,只有通过IO事件唤醒才可以;
- T:调试程序时,线程stop状态;
- Z:僵尸状态,进程结束了,内核资源PCB还没有被回收,没有被wait;僵尸态的资源不能多,太多的话会占用我们内核资源,导致系统能创建进程的数量变少,线程在内核中也是占用PCB,同样也会影响线程的数量;
如何查看进程的状态?
方法1:
ps aux | less
方法2:
cd /proc/ #进入proc文件系统
proc文件系统中有以pid号命名的文件夹,
进入22969进程的目录:
可以查看下进程的状态:
查看某一个服务
比如查看tcp服务:
netstat -tanp
拿到1502这个进程号后,
ps aux | grep 1502
进程怎么通信?
线程怎么通信?
- 线程是共享地址空间的,可以通过共享的数据段和堆来进行共享!
- 互斥。可以用互斥锁、读写锁、自旋锁、CAS(简单的++,–)
- 线程间通信:条件变量、信号量
7、HTTP数据包组成,如何解析HTTP数据包?
http 和 https(http + ssl 加密认证过程,签名,CA认证,对称加密和非对称加密)
HTTP数据包组成?
- 从实践 的角度看,真正的动手做过!
- 怎么查好看的?wirshark抓包,使用浏览器符F12…
8、传输层采用TCP协议,在应用层读取数据时,如何判断是否读完,如果没读完,如何计算还剩下多少?
考察TCP的粘包问题;
TCP是一个流式协议;
TCP的粘包问题怎么解决?
- 给数据加一个数据头;(项目中有体现)
传输大文件,如何判断还剩多少?
- 支持秒传;每一次传输文件,前期都会用文件内容计算md5值,将filesize+md5值发送到服务端,服务端记录了所有已经保存文件的md5值;
- 匹配到了,说明文件已经在服务端存在了,客户端显示直接传输成了;
- 如果是一个新文件,表示服务端返回OK已准备好,可以传输;服务端记录了文件的大小
;服务端接收的时候,就可以根据最开始协商的filesize不断的检测现在已经读了多少,剩下多少,可以显示进度信息! - 从以上这些角度说就行了!