数据结构
1. 数据结构的排序算法有哪些?每种时间复杂度都说一下,快排和堆排的编程思想是什么?
排序算法主要有以下几种:
-
冒泡排序(Bubble Sort) :时间复杂度为O(n²),最优时间复杂度O(n),空间复杂度O(1)。其基本思想是通过两两比较相邻元素,将较大的元素交换到末尾,重复此过程。
-
选择排序(Selection Sort) :时间复杂度为O(n²),空间复杂度O(1)。它通过不断选出最小的元素并将其放到已排序部分的末尾。
-
插入排序(Insertion Sort):时间复杂度O(n²),最优时间复杂度O(n),空间复杂度O(1)。插入排序的思想是将未排序的元素插入到已排序部分中合适的位置。
-
快速排序(Quick Sort):时间复杂度O(n log n),最坏时间复杂度O(n²),空间复杂度O(log n)。它采用分治法的思想,选择一个基准值,将数组分为两个子数组,其中一个子数组的元素都小于基准值,另一个都大于基准值。然后对两个子数组递归进行排序。
-
堆排序(Heap Sort):时间复杂度O(n log n),空间复杂度O(1)。堆排序利用堆这种数据结构实现排序,基于完全二叉树来完成。
-
归并排序(Merge Sort):时间复杂度O(n log n),空间复杂度O(n)。归并排序采用分治法,将数组分割成两部分,分别排序,然后合并。
-
桶排序、计数排序、基数排序:这些排序算法的时间复杂度通常是O(n),但是它们适用于特定的条件,如数据分布均匀或范围有限的情况。
快排和堆排的编程思想:
- 快排 :基于分治法的思想,将数组划分为左右两个子数组,通过递归排序两个子数组。基准元素的选择对算法效率有较大影响。
- 堆排:利用堆(特别是最大堆)来排序,首先构造堆,然后将堆顶元素与数组的最后一个元素交换,再调整堆,直到数组完全有序。
2. 经典的图论算法及使用场景(最短路、最小生成树等等)
-
最短路径算法 :
-
Dijkstra算法 :用于求解单源最短路径,适用于无负权边的图。
-
Bellman-Ford算法 :能够处理带负权边的图,适用于含负权边的图,但不能处理负权环。
-
Floyd-Warshall算法:用于求解所有顶点对的最短路径,适用于稠密图。
-
-
最小生成树(MST) :
-
Kruskal算法 :基于边的贪心算法,适用于稀疏图。
-
Prim算法:从一个节点开始,逐步扩展最小生成树,适用于稠密图。
-
-
拓扑排序:用于有向无环图(DAG)的节点排序,通常用于任务调度等应用。
-
强连通分量(Kosaraju算法):用于图的强连通分量的求解,广泛应用于网络连接分析。
3. 如何判断有向图是否有环?(拓扑排序)
通过拓扑排序判断有向图是否有环。若有向图中存在环,则无法进行有效的拓扑排序。具体做法是:
- 使用Kahn算法,依次删除入度为0的节点并更新其邻接节点的入度,直到所有节点都被处理。如果图中存在环,则会在处理过程中无法找到入度为0的节点。
4. 更高级的树的算法了解哪些?他们的使用场景有什么?
- 二叉树:最基本的树结构,每个节点最多有两个子节点。
- 二叉搜索树(BST):对于每个节点,其左子树的所有节点值小于该节点值,右子树的节点值大于该节点值。适用于高效查找、插入和删除。
- 平衡二叉树(AVL Tree):是二叉搜索树的一个自平衡版本,适用于需要频繁查找、插入和删除的场景。
- 红黑树:一种自平衡二叉搜索树,常用于实现关联容器(如C++中的map和set),具有较好的性能。
- B树、B+树:多路搜索树,适用于磁盘存储和数据库索引。
5. 字典树了解吗?它有什么用途?
字典树(Trie)是一种树形数据结构,通常用于存储字符串集合,具有非常高效的查找和前缀查询性能。广泛应用于字典搜索、自动补全等应用场景。
网络
1. 介绍一下HTTP协议
HTTP(HyperText Transfer Protocol)是一种无状态的、应用层协议,主要用于Web浏览器与服务器之间的通信。HTTP基于请求和响应的模式,客户端发起请求,服务器返回响应,数据传输通过TCP连接进行。
2. 介绍一下HTTP1.0、1.1、2.0以及未来规划的3.0有什么区别和联系
- HTTP/1.0:每次请求和响应都需要建立一个TCP连接,效率较低。
- HTTP/1.1:引入了持久连接(Connection: keep-alive),支持管道化和分块传输,性能有所提升。
- HTTP/2.0:引入了二进制传输、流优先级、请求和响应 multiplexing 等优化,显著提高了性能。
- HTTP/3.0:基于QUIC协议,使用UDP替代TCP,进一步减少延迟和拥塞,提高传输效率。
3. 了解过IO多路复用吗?
IO多路复用是一种允许单个线程同时处理多个IO操作的技术。它通过系统调用(如select、poll、epoll等)来监控多个IO事件,能够在一个线程内处理多个连接,广泛应用于高并发的网络服务器中。
操作系统
1. 介绍一下你知道的操作系统的知识
操作系统是管理硬件和软件资源的系统软件。它提供了文件系统、进程调度、内存管理、设备管理、网络通信等基本功能。
2. 进程和线程是怎么切换的?
进程切换是通过操作系统的调度程序来完成的,涉及保存当前进程的状态,并加载新进程的状态。线程切换的代价较低,通常通过保存和恢复寄存器、堆栈等进行。
3. 了解过协程吗?
协程是比线程更轻量级的并发单元,通常由程序员手动控制其执行,支持协作式多任务处理。
4. 数据从内存写到磁盘是怎么样的一个过程?CPU读数据又是怎样的一个过程?(面试官想问的是DMA)
数据写入磁盘时,CPU将数据通过内存传递给硬盘控制器,硬盘控制器再通过DMA(直接内存访问)将数据写入磁盘,避免了CPU的直接干预,从而提高效率。
算法题
1. 给你一个大小为10的整数数组和一个目标值target,每个数只能用一次,判断是否能用数组中的某些整数相加得到目标值target。(01背包,leetcode原题)
这是典型的01背包问题,可以使用动态规划来解决。
2. 课程表(leetcode207)
该问题是关于拓扑排序的问题,可以通过BFS或DFS来实现,判断是否存在环并返回是否能够完成所有课程的学习。