462-百度面经2

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

462-百度面经2_第1张图片


方法2:

cd /proc/	#进入proc文件系统

proc文件系统中有以pid号命名的文件夹,
462-百度面经2_第2张图片

进入22969进程的目录:
462-百度面经2_第3张图片
可以查看下进程的状态:

462-百度面经2_第4张图片


查看某一个服务

比如查看tcp服务:

netstat -tanp

462-百度面经2_第5张图片
拿到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不断的检测现在已经读了多少,剩下多少,可以显示进度信息!
  • 从以上这些角度说就行了!

你可能感兴趣的:(C++面经,哈希算法,散列表,算法)