一、数据结构(Data Structure)
数据结构是 "如何高效组织和处理数据" 的学科,核心是逻辑结构(数据间的关系)和物理结构(数据在内存中的存储方式),以及基于这两种结构的操作算法。
1. 基本概念
数据结构定义:由数据元素(如整数、对象)和元素间的关系(如线性、树形)组成的集合。
逻辑结构:
线性结构:元素间一对一(如线性表、栈、队列);
非线性结构:元素间一对多(树)或多对多(图)。
物理结构(存储结构):
顺序存储:元素连续存放(如数组),可随机访问,但插入删除效率低;
链式存储:元素分散存放,通过指针 / 引用连接(如链表),插入删除方便,但访问需遍历。
算法的评价指标:时间复杂度(执行次数与输入规模的关系,如 O (n)、O (logn))、空间复杂度(占用内存大小),优先选时间复杂度低的算法。
2. 线性表
线性表是 n 个元素的有限序列(n≥0),核心是 "一对一" 关系。
顺序表:用数组实现,特点:
优点:随机访问(通过下标直接定位,时间 O (1));
缺点:插入 / 删除需移动元素(如在第 i 位插入,需移动 n-i 个元素,时间 O (n))。
考点:插入 / 删除的代码实现、边界条件(如空表、满表)。
链表:用节点(数据 + 指针)串联,分单链表、双链表、循环链表:
单链表:每个节点只有后继指针,只能从头遍历;
双链表:每个节点有前驱和后继指针,可双向遍历,插入删除更方便(需修改两个指针);
循环链表:尾节点指针指向头节点,适合环形结构(如约瑟夫问题)。
考点:链表的创建、插入、删除、反转、求环(快慢指针法)、合并两个有序链表。
3. 栈和队列
栈和队列是 "操作受限" 的线性表,核心是操作规则。
栈:"后进先出(LIFO)",仅允许在栈顶操作(push 入栈、pop 出栈):
实现:顺序栈(数组)或链栈(链表);
应用:表达式求值(中缀转后缀)、递归调用(系统栈保存现场)、括号匹配。
队列:"先进先出(FIFO)",允许在队尾入队(enqueue)、队头出队(dequeue):
实现:顺序队列(易假溢出,用循环队列解决,通过 front 和 rear 指针标记队头队尾)、链队列;
应用:层次遍历(树 / 图)、缓冲机制(如打印机队列)。
4. 串
串是 "字符的线性表",核心是模式匹配(找子串在主串中的位置)。
朴素匹配算法:逐位比对,主串指针经常回溯,时间复杂度 O (n*m)(n 为主串长,m 为子串长);
KMP 算法:利用子串的 "部分匹配表(next 数组)",主串指针不回溯,时间复杂度 O (n+m)。
关键:next 数组记录子串中每个位置的最长前缀后缀匹配长度,用于跳过无效比对。
5. 数组和矩阵
数组:多维线性表,如二维数组可看作 "线性表的线性表",存储时按行或按列优先(如 C 语言行优先,Fortran 列优先)。
特殊矩阵:
对称矩阵:a [i][j] = a [j][i],只存上三角或下三角,节省空间;
稀疏矩阵:非零元素少,用三元组(行、列、值)或十字链表存储。
6. 树与二叉树
树是 "一对多" 的非线性结构,二叉树是最常用的树(每个节点最多 2 个子树)。
基本概念:根节点(无父节点)、叶子节点(无子女)、深度(根到节点的层数,根为 1)、高度(节点到叶子的最大层数)。
二叉树的性质:
第 i 层最多 2^(i-1) 个节点;
深度为 h 的二叉树最多 2^h -1 个节点(满二叉树);
非空二叉树中,叶子数 = 度为 2 的节点数 + 1。
特殊二叉树:
满二叉树:所有层都满;
完全二叉树:除最后一层,其他层满,最后一层节点靠左(适合顺序存储,父节点 i 的左孩子 2i,右孩子 2i+1);
二叉搜索树(BST):左子树值 < 根 < 右子树,中序遍历为升序,用于快速查找;
平衡二叉树(AVL):左右子树高度差≤1,避免 BST 退化为链表(查找效率保持 O (logn))。
二叉树遍历(核心考点):
前序:根→左→右;
中序:左→根→右;
后序:左→右→根;
层次遍历:按层从左到右(用队列实现)。
技巧:已知前序 + 中序或中序 + 后序,可唯一确定二叉树(中序是 "定位根" 的关键)。
树、森林与二叉树的转换:树转二叉树(左孩子右兄弟),方便用二叉树算法处理树。
哈夫曼树:带权路径长度(WPL)最小的二叉树,用于哈夫曼编码(前缀编码,无歧义),构建方法:选两个最小权值节点合并,重复直到只剩一个节点。
7. 图
图是 "多对多" 的非线性结构,由顶点和边组成,用于描述复杂关系(如社交网络、地图)。
基本概念:
有向图(边有方向)/ 无向图(边无方向);
度:顶点的边数(有向图分入度和出度);
连通图(无向图任意两顶点可达)/ 强连通图(有向图任意两顶点互达)。
存储方式:
邻接矩阵:二维数组,a [i][j] 表示 i 和 j 是否有边,适合稠密图,查找快(O (1)),但占空间 O (n²);
邻接表:每个顶点对应一个链表,存相邻顶点,适合稀疏图,省空间,遍历方便。
遍历算法(核心):
深度优先搜索(DFS):类似树的前序,用栈(或递归),可能走 "死胡同" 后回溯;
广度优先搜索(BFS):类似树的层次遍历,用队列,按 "层次" 扩散。
应用:
最小生成树(MST):无向连通图中,权和最小的生成树(连接所有顶点,无环),算法有 Kruskal(选最小边,避环)和 Prim(从顶点扩展,加最小边);
最短路径:从起点到其他顶点的最短距离,Dijkstra(单源,权非负)和 Floyd(多源,可负权,不能有负环);
拓扑排序:有向无环图(DAG)中,顶点按 "前驱在前" 排列,用于任务调度(如课程先修关系);
关键路径:DAG 中,从起点到终点的最长路径,决定项目最短完成时间。
8. 查找
查找是 "在集合中找关键字等于给定值的元素",核心是效率。
顺序查找:逐个比对,O (n),适合无序或小规模数据;
二分查找:仅适用于有序表,每次缩半,O (logn),但需顺序存储;
分块查找:分块有序(块内无序,块间有序),先查块,再块内顺序,O (√n);
哈希表(散列表):通过哈希函数直接定位存储位置,理想 O (1),但有冲突(不同 key 映射到同一位置):
冲突解决:开放定址法(线性探测、二次探测)、链地址法(冲突元素用链表连接);
考点:哈希函数设计、冲突处理、查找成功 / 失败的平均长度。
B 树和 B + 树:多路平衡查找树,用于磁盘等外存(减少 I/O 次数),B + 树叶子节点串联,适合范围查询(数据库索引常用)。
9. 排序
排序是 "按关键字递增 / 递减排列元素",核心是算法的时间复杂度、稳定性(相等元素相对位置是否不变)。
排序方法 | 平均时间 | 最坏时间| 最好时间 |空间 |稳定性 |特点|
冒泡排序 O(n²) O(n²) O(n) O(1) 稳定 相邻比对,大的 "冒" 到后面,优化:加 flag 判断是否有序
插入排序 O(n²) O(n²) O(n) O(1) 稳定 类似整理扑克牌,逐个插入到前面有序部分
选择排序 O(n²) O(n²) O(n²) O(1) 不稳定 每次选最小的放前面,交换可能破坏稳定性
快速排序 O(nlogn) O(n²) O(nlogn) O(logn) 不稳定 分治,选基准,小的放左,大的放右,递归,平均最快
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定 分治,先分后合,适合链表,外部排序常用
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定 用堆(完全二叉树),每次取堆顶(最大 / 小),再调整
希尔排序 O(n^1.3) O(n²) O(n) O(1) 不稳定 分组插入排序,缩小增量,效率高于简单排序
基数排序 O(d(n+r)) O(d(n+r)) O(d(n+r)) O® 稳定 按位排序(从低到高),适合整数、字符串
二、计算机组成原理(计组)
计组研究 "计算机硬件各部分如何协同工作",核心是 "冯・诺依曼体系"(存储程序、五大组成部分)。
1. 计算机系统概述
基本概念:
计算机系统 = 硬件 + 软件(系统软件 + 应用软件);
冯・诺依曼结构:运算器、控制器、存储器、输入设备、输出设备,核心是 "程序存储"(指令和数据存在存储器)。
性能指标:
主频(CPU 时钟频率,如 3GHz,越高运算越快);
CPI(每条指令平均时钟周期数);
MIPS(每秒百万条指令)、FLOPS(每秒浮点运算次数)。
2. 数据的表示和运算
数制转换:
二进制→十进制:按权展开(如 101=1×2²+0×2¹+1×2⁰=5);
十进制→二进制:整数除 2 取余,小数乘 2 取整。
机器数和真值:
机器数:带符号(最高位 0 正 1 负),如 + 5(0101)、-5(1101);
真值:实际值(如 + 5、-5)。
码制:
原码:符号位 + 数值位(简单但加减麻烦,0 有 + 0 和 - 0);
反码:正数同原码,负数符号位不变,数值位取反;
补码:正数同原码,负数 = 反码 + 1(解决 0 的唯一性,加减统一为加,CPU 常用);
移码:补码符号位取反(用于浮点数阶码,方便比较大小)。
定点数运算:
加减:补码加法([A+B] 补 =[A] 补 +[B] 补),减法转加法([A-B] 补 =[A] 补 +[-B] 补);
乘法:原码一位乘(符号单独算,数值位累加),补码一位乘(Booth 算法)。
浮点数:N = 尾数 × 基数 ^ 阶码(如 3.14×10²),用于表示大范围数据:
格式:符号位 + 阶码(指数)+ 尾数(有效数字);
IEEE 754 标准:单精度(32 位,阶码 8 位,尾数 23 位),双精度(64 位);
运算:对阶(阶码对齐)→尾数运算→规格化(尾数第一位为 1)。
3. 存储系统
存储系统是 "多级结构",速度从快到慢:寄存器→Cache→主存→辅存(硬盘、SSD),容量反之,目的是 "用较低成本获得接近高速存储的性能"。
Cache(高速缓冲存储器):位于 CPU 和主存之间,临时存常用数据,减少 CPU 访问主存的时间:
映射方式:直接映射(主存块固定映射到 Cache 块,冲突多)、全相联映射(任意映射,灵活但成本高)、组相联映射(分组,组内全相联,平衡两者);
替换策略:LRU(最近最少使用)、FIFO(先进先出)等。
主存:DRAM 芯片组成(动态随机存取存储器,需刷新),与 CPU 通过总线连接,容量一般 GB 级。
辅存:硬盘(HDD,磁存储)、SSD(固态硬盘,闪存),容量 TB 级,用于长期存储,速度慢于主存。
存储保护:防止多程序冲突(如越界访问),通过基址寄存器 + 限长寄存器实现。
4. 指令系统
指令是 "CPU 能执行的基本操作命令",指令系统是软硬件的接口。
指令格式:操作码(做什么,如加、减)+ 地址码(操作数在哪,如寄存器号、内存地址):
零地址指令:无地址码(如栈操作);
一地址指令:一个操作数(如自增);
二地址指令:两个操作数(如 a+b,最常用)。
寻址方式(找到操作数的方式):
立即寻址:操作数在指令中(如 ADD R1, #5,#5 是立即数);
直接寻址:地址码是操作数地址(如 ADD R1, (100H));
间接寻址:地址码是操作数地址的地址(多一次访问);
寄存器寻址:操作数在寄存器(快,如 ADD R1, R2);
寄存器间接寻址:寄存器存操作数地址(如 ADD R1, (R2))。
CISC 和 RISC:
CISC(复杂指令集):指令多而杂(如 x86),支持多种寻址;
RISC(精简指令集):指令少而简单(如 ARM),单周期指令,依赖编译器优化,效率高。
5. 中央处理器(CPU)
CPU 是 "计算机的大脑",由运算器和控制器组成。
运算器:执行算术和逻辑运算,核心是 ALU(算术逻辑单元),还有寄存器(暂存数据)、累加器等。
控制器:指挥全机工作,包括:
取指:从主存取指令;
译码:分析指令操作;
执行:发出控制信号(如控制 ALU 运算、内存读写);
中断控制:处理突发事件(如键盘输入)。
指令流水线:将指令执行分为多个阶段(如取指、译码、执行、写回),多个指令并行处理,提高效率:
性能指标:吞吐率(单位时间完成的指令数)、加速比;
冲突:结构冲突(硬件资源不足)、数据冲突(指令依赖前序结果)、控制冲突(分支指令导致流水线断流),需通过暂停、转发、预测等解决。
6. 总线系统
总线是 "连接计算机各部件的公共导线",用于传输数据、地址、控制信号。
分类:数据总线(传数据,双向)、地址总线(传地址,单向,决定寻址范围)、控制总线(传控制信号,如读 / 写信号)。
总线仲裁:多设备争用总线时的协调,有集中仲裁(如链式查询、计数器定时查询)和分布仲裁。
7. 输入输出(I/O)系统
I/O 系统是 "CPU 与外部设备的接口",负责数据交换。
I/O 控制方式:
程序查询:CPU 不断查询设备状态,忙等,效率低;
中断驱动:设备就绪后发中断,CPU 暂停当前工作处理 I/O,效率高;
DMA(直接存储器访问):DMA 控制器直接在设备和主存间传数据,CPU 只需初始化和结束处理,适合大量数据(如硬盘读写)。
中断系统:
中断源:外部设备、故障、软件中断等;
中断响应:保护现场→中断服务→恢复现场;
中断优先级:高优先级中断可打断低优先级(嵌套)。
三、操作系统(OS)
OS 是 "管理计算机硬件和软件资源的系统软件",核心是 "向上为用户提供接口,向下管理硬件",目标是提高资源利用率、方便用户。
1. 操作系统概述
功能:进程管理(CPU 调度)、内存管理(分配回收)、文件管理(磁盘文件)、设备管理(I/O 设备)。
特性:并发(多程序同时运行,宏观并行,微观交替)、共享(资源被多个程序共用)、虚拟(如虚拟内存、虚拟终端)、异步(程序执行速度不确定,但能保证完成)。
接口:命令接口(如 CMD 命令、Linux 终端)、程序接口(系统调用,如 C 语言的 open ()、read ())。
体系结构:单用户(如 DOS)、批处理、分时(如 UNIX,多个用户轮流用 CPU)、实时(如嵌入式系统,响应时间严格)。
2. 进程管理
进程是 "程序的一次执行过程",是资源分配和调度的基本单位。
进程状态:
就绪:具备运行条件,等 CPU;
运行:占用 CPU 执行;
阻塞(等待):等资源(如 I/O 完成),放弃 CPU;
状态转换:就绪→运行(CPU 调度)、运行→就绪(时间片到)、运行→阻塞(等资源)、阻塞→就绪(资源就绪)。
PCB(进程控制块):每个进程唯一标识,存进程状态、优先级、程序计数器等信息,OS 通过 PCB 管理进程。
进程调度:从就绪队列选进程占 CPU,算法:
先来先服务(FCFS):按到达顺序,简单但可能 "长作业霸占 CPU";
短作业优先(SJF):选运行时间最短的,平均周转时间短,但长作业可能饿死;
高优先级优先:紧迫任务先执行,分抢占(高优先级可打断低优先级)和非抢占;
时间片轮转:每个进程占 CPU 一个时间片(如 10ms),轮转执行,适合分时系统。
进程同步与互斥:
互斥:多个进程争用临界资源(如打印机),同一时间只能一个用;
同步:进程间按顺序协作(如生产者 - 消费者,生产者放数据后消费者才能取);
信号量(PV 操作):解决同步互斥的工具,信号量 S>0 表示可用资源数,S=0 无资源,S<0 绝对值是等待进程数:
P 操作:S--,若 S<0 则阻塞;
V 操作:S++,若 S≤0 则唤醒一个阻塞进程;
经典问题:生产者 - 消费者(同步 + 互斥)、读者 - 写者(读可共享,写互斥)、哲学家进餐(避免死锁)。
死锁:多个进程互相等待对方资源,无限阻塞:
必要条件:互斥、占有并等待、不可剥夺、循环等待;
处理:预防(破坏必要条件,如静态分配资源)、避免(银行家算法,安全状态)、检测与解除(如剥夺资源、终止进程)。
3. 内存管理
内存管理是 "合理分配内存,让多程序并发运行"。
连续分配:
单一连续:整个内存给一个程序(单用户);
分区:固定分区(内存分大小固定的块)、动态分区(按需分配,有外部碎片,可用紧凑技术合并)。
非连续分配:
分页:内存分大小相等的页框,程序分同样大小的页,页映射到页框(通过页表),无外部碎片,有内部碎片(页内未用空间);
分段:按逻辑意义分块(如代码段、数据段),段大小可变,有段表,方便共享和保护(如共享代码段);
段页式:先分段,段内分页,结合两者优点,但复杂。
虚拟内存:基于局部性原理(程序运行时只用到部分数据),将硬盘当 "虚拟内存",让程序 "感觉内存很大":
实现:请求分页(缺页时从硬盘调页到内存);
页面置换算法:选换出哪个页,目标是减少缺页率:
最佳置换(OPT):换最远不用的,理想但难实现;
先进先出(FIFO):换最早进入的,可能 "Belady 异常"(内存增大缺页率上升);
最近最少使用(LRU):换最近最少用的,效果好但实现复杂;
时钟置换(CLOCK):用位标记是否最近用,近似 LRU,易实现。
4. 文件管理
文件是 "有名字的一组相关信息的集合",文件管理负责文件的创建、删除、读写等。
文件结构:逻辑结构(流式、记录式)、物理结构(连续、链接、索引,决定文件在磁盘的存储方式)。
目录结构:管理文件的索引,有单级、多级(树形,如 Windows 文件夹)、无环图(支持文件共享)。
文件操作:创建(create)、删除(delete)、打开(open)、关闭(close)、读(read)、写(write)。
磁盘调度:减少磁盘寻道时间(磁头移动时间),算法:
先来先服务(FCFS):按请求顺序;
最短寻道时间优先(SSTF):选离当前磁头最近的;
扫描(SCAN,电梯算法):磁头单向移动,到端点反向,公平性好。
5. 设备管理
设备管理是 "管理 I/O 设备,提高利用率"。
设备分类:块设备(如硬盘,按块读写)、字符设备(如键盘,按字符读写)。
I/O 控制方式:同计组部分(程序查询、中断、DMA)。
SPOOLing 技术(假脱机):将独占设备(如打印机)变为共享,通过缓冲区存多个程序的输出,逐个打印,提高设备利用率。
四、计算机网络
计算机网络是 "地理上分散的计算机通过通信设备互联,按协议通信",核心是 "协议"(规则)和 "分层"(复杂问题分解)。
1. 网络概述
分类:按覆盖范围(局域网 LAN、城域网 MAN、广域网 WAN);按拓扑(总线、星型、环型、网状)。
性能指标:带宽(最高数据率,如 100Mbps)、时延(发送 + 传播 + 处理 + 排队)、吞吐量(实际数据率)。
体系结构:
OSI 七层:物理层→数据链路层→网络层→运输层→会话层→表示层→应用层(理论模型);
TCP/IP 四层:网络接口层→网际层→运输层→应用层(实际用)。
协议三要素:语法(格式)、语义(含义)、时序(顺序)。
2. 物理层
"最底层,负责比特流传输",关注信号、介质、接口。
基本概念:比特(0/1)、数据通信模型(源→发送器→信道→接收器→目的)。
传输介质:有线(双绞线、同轴电缆、光纤,光纤快且抗干扰)、无线(无线电、微波、卫星)。
编码与调制:数字数据→数字信号(编码,如曼彻斯特编码,含时钟);数字数据→模拟信号(调制,如调幅、调频)。
信道复用:多个信号共用信道,如时分复用(TDM,时间分片)、频分复用(FDM,频率分片)、码分复用(CDM,CDMA,手机常用)。
3. 数据链路层
"负责相邻节点间帧的传输,差错控制和流量控制"。
帧:数据链路层的传输单位(包装比特流,加首部尾部)。
差错控制:检测 / 纠正错误,如 CRC(循环冗余检验,检错)、海明码(纠错)。
流量控制:防止发送方过快淹没接收方,如停止 - 等待(发一帧等确认)、滑动窗口(可连续发多帧)。
MAC 协议(介质访问控制,解决多设备争用信道):
信道划分(如 TDMA、FDMA、CDMA);
随机访问(如 CSMA/CD,以太网用,先听后发,冲突停发,退避重发);
轮询(主设备轮流问从设备)。
以太网:最常用 LAN,用 CSMA/CD,帧格式含目的 MAC、源 MAC、类型、数据、CRC。
PPP 协议:广域网常用,点到点,支持多种网络层协议。
4. 网络层
"负责跨网络的分组传输,选路径",核心是 IP 地址和路由。
IP 地址:32 位(IPv4),分网络号 + 主机号,如 192.168.1.1,通过子网掩码划分子网(如 255.255.255.0 表示前 24 位是网络号)。
子网划分:将大网络分成小 subnet,减少广播域,如 255.255.255.128 将 C 类网分成 2 个子网(子网号 1 位)。
ARP(地址解析协议):将 IP 地址→MAC 地址(广播查,单播回);RARP 反之(少用)。
ICMP(网际控制报文协议):辅助 IP,如 ping(测试连通性,用回显请求 / 应答)、 traceroute(查路由)。
路由算法:
静态路由:人工配置;
动态路由:RIP(距离向量,跳数,小网)、OSPF(链路状态,大网,收敛快)。
IPv6:解决 IPv4 地址耗尽,128 位地址,简化首部,支持即插即用。
5. 运输层
"端到端(进程到进程)通信,保证数据可靠 / 高效传输",核心协议 TCP 和 UDP。
UDP(用户数据报协议):
无连接、不可靠(不确认、不重传)、快(首部 8 字节);
应用:视频、语音(容忍丢包,要速度)、DNS。
TCP(传输控制协议):
面向连接、可靠(确认、重传、排序、流量控制、拥塞控制)、慢(首部 20 字节);
连接管理:三次握手(建连接)、四次挥手(断连接):
三次握手:客户端发 SYN→服务器回 SYN+ACK→客户端回 ACK(防止无效连接);
四次挥手:客户端发 FIN→服务器回 ACK→服务器发 FIN→客户端回 ACK(确保数据传完);
流量控制:用滑动窗口,接收方告诉发送方可发多少(避免接收方缓冲区满);
拥塞控制:网络拥堵时降速,算法(慢开始→拥塞避免→快重传→快恢复)。
6. 应用层
"最高层,直接为用户服务",协议最多。
HTTP(超文本传输协议):
用于 Web(浏览器 - 服务器),基于 TCP,默认端口 80;
特点:无状态(服务器不记客户端历史),HTTP/1.1 支持持久连接(一次连接发多个请求);
请求方法:GET(取资源)、POST(提交数据)等;状态码(200 成功,404 未找到,500 服务器错)。
FTP(文件传输协议):传文件,基于 TCP,控制端口 21,数据端口 20,有匿名登录。
DNS(域名系统):域名→IP 地址(如www.baidu.com→180.101.50.242),基于 UDP,端口 53,分布式(本地 DNS→根 DNS→顶级 DNS→权威 DNS)。
SMTP(简单邮件传输协议):发邮件,基于 TCP,端口 25;POP3/IMAP 收邮件。