计算机二级公共基础知识
数据结构与算法
这是最核心、分值最高的模块,涉及大量的计算和概念辨析。
算法基础
- 算法定义:解题方案的准确而完整的描述。
- 算法的基本特征:
- 可行性:每一步都必须能执行。
- 确定性:每一步都有确切的含义,无歧义。
- 有穷性:必须在有限时间内执行完毕。
- 拥有足够的情报:输入可以是零个或多个,输出必须有一个或多个。
- 算法复杂度(考点):
- 时间复杂度:衡量算法执行时间随问题规模增长的趋势。不是具体的执行时间,而是执行次数的数量级。例如:\(O(n)\)、\(O(n^2)\)、\(O(\log_2 n)\)。循环变量从 1 到 n,时间复杂度为 \(O(n)\);嵌套循环通常为 \(O(n^2)\);二分查找为 \(O(\log_2 n)\)。
- 空间复杂度:衡量算法执行过程中所需存储空间的大小。如果算法所需的辅助空间不随问题规模 n 变化,则空间复杂度为 \(O(1)\)(常数阶)。
数据结构的基本概念
- 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
- 逻辑结构:数据元素之间的逻辑关系,与计算机存储无关。
- 线性结构:一对一(如:线性表、栈、队列)。
- 非线性结构:一对多或多对多(如:树、图)。
- 存储结构(物理结构):数据在计算机中的表示。
- 顺序存储:逻辑上相邻的节点物理上也相邻,占用连续空间(如数组)。
- 链式存储:逻辑上相邻的节点物理上不一定相邻,通过指针链接(如链表)。
- 索引存储:建立索引表。
- 散列存储:根据关键字直接计算地址。
线性表
- 定义:n 个数据元素的有限序列。
- 顺序表(顺序存储):
- 优点:随机存取(存取速度快),节省空间。
- 缺点:插入和删除需要移动大量元素,效率低;需预先分配连续空间。
- 链表(链式存储):
- 优点:插入删除只需修改指针,无需移动元素;动态分配内存。
- 缺点:非随机存取(查找慢),需要额外空间存储指针。
- 单链表:每个节点包含数据域和指针域。
- 循环链表:表中最后一个节点的指针指向头节点。
- 双向链表:节点有两个指针,分别指向前驱和后继。
栈
- 定义:限定仅在表尾进行插入或删除的线性表。
- 特点:后进先出。
- 术语:
- 栈顶:允许插入删除的一端。
- 栈底:固定的一端。
- 空栈:不含元素的栈。
- 运算:
- 入栈:top 指针加 1。
- 出栈:top 指针减 1。
- 经典考题:给定入栈顺序,判断可能的出栈顺序(如:入栈 a,b,c,d,出栈可能是 d,c,b,a,但不可能 c,a,b,d)。
队列
- 定义:限定仅在表的一端进行插入,在另一端进行删除的线性表。
- 特点:先进先出。
- 术语:
- 队尾:允许插入的一端。
- 队头:允许删除的一端。
- 循环队列:
- 将顺序队列首尾相连。
- 计算公式(考点):
- 队列长度:
(rear - front + MaxSize) % MaxSize。 - 队满条件:
% MaxSize == front。 - 队空条件:
front == rear。
- 队列长度:
树与二叉树
- 基本概念:
- 度:节点拥有的子树个数。树的度是树内各节点度的最大值。
- 叶子节点:度为 0 的节点。
- 深度:树中节点的最大层次。
- 二叉树性质(必背):
- 第 \(i\) 层上最多有 \(2^{i-1}\) 个节点。
- 深度为 \(k\) 的二叉树最多有 \(2^k - 1\) 个节点。
- 叶子节点数(\(n_0\))与度为 2 的节点数(\(n_2\))的关系:\(n_0 = n_2 + 1\)。
- 满二叉树:每一层节点数都达到最大,叶子节点全在最底层。
- 完全二叉树:除最后一层外,每一层都是满的,且最后一层节点从左到右连续排列。性质:具有 \(n\) 个节点的完全二叉树深度为 \(\lfloor \log_2 n \rfloor + 1\)。
- 二叉树遍历(核心考点):
- 前序遍历:根 -> 左 -> 右。
- 中序遍历:左 -> 根 -> 右。
- 后序遍历:左 -> 右 -> 根。
- 已知前序和中序,可唯一确定二叉树;已知后序和中序,可唯一确定二叉树。
- 二叉链表存储:每个节点包含数据域、左指针、右指针。\(n\) 个节点的二叉链表有 \(n+1\) 个空指针域。
- 树的总的节点数为树中所有节点的度数之和再加 1。
查找与排序
- 顺序查找:
- 逐个比较。
- 平均比较次数:\(n/2\)。
- 时间复杂度:\(O(n)\)。
- 二分查找:
- 条件:有序表(顺序存储)。
- 过程:取中间值比较。
- 时间复杂度:\(O(\log_2 n)\)。例:查找 100 个元素,最多比较 7 次(\(2^7=128 > 100\))。
- 排序算法比较(必考表格):
| 排序方法 | 平均时间 | 最坏时间 | 辅助空间 | 稳定性 | 特点 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| 冒泡排序 | \(O(n^2)\) | \(O(n^2)\) | \(O(1)\) | 稳定 | 每次交换相邻元素 |
| 简单选择排序 | \(O(n^2)\) | \(O(n^2)\) | \(O(1)\) | 不稳定 | 找最小值交换 |
| 直接插入排序 | \(O(n^2)\) | \(O(n^2)\) | \(O(1)\) | 稳定 | 类似摸牌,有序区插入 |
| 快速排序 | \(O(n \log n)\) | \(O(n^2)\) | \(O(\log n)\) | 不稳定 | 平均最快,递归实现 |
| 堆排序 | \(O(n \log n)\) | \(O(n \log n)\) | \(O(1)\) | 不稳定 | 最坏情况也是\(O(n \log n)\) |
| 归并排序 | \(O(n \log n)\) | \(O(n \log n)\) | \(O(n)\) | 稳定 | 需要额外空间 | - 稳定性定义:排序前后,相等元素的相对位置不变。
程序设计基础
程序设计风格
- 源程序文档化:符号命名应具有实际含义(见名知意);程序注释(序言性注释、功能性注释)。
- 数据说明:规范数据定义。
- 语句构造:避免复杂的条件嵌套,避免大量使用 GOTO 语句。
- 输入输出:输入数据要有校验,输出格式要清晰。
结构化程序设计
-
原则:自顶向下、逐步求精、模块化、限制使用 GOTO 语句。
-
基本结构:三种结构构成的程序称为结构化程序,且只有一个入口和一个出口。
- 顺序结构:按顺序执行。
- 选择结构:if-else。
- 循环结构:while, for。
面向对象程序设计(OOP)
- 对象:系统中用来描述客观事物的一个实体,是属性和方法的封装体。
- 类:具有相同属性和方法的一组对象的集合,是对象的抽象。
- 属性:对象的状态/数据。
- 方法:对象的行为/操作。
- 面向对象的三大特征:
- 封装:隐藏对象的内部细节,只提供公共访问接口。
- 继承:子类共享父类的属性和方法,实现代码复用。
- 多态:同一操作作用于不同对象产生不同的行为。实现方式:方法重载、方法重写。
- 消息:对象之间通信的载体。
软件工程基础
软件工程基本概念
- 软件定义:程序、数据、文档。
- 软件危机:开发成本高、进度慢、质量低、维护困难。
- 软件生命周期(三个时期,四个阶段):
- 定义期:
- 问题定义:确定系统要解决的问题。
- 可行性研究:技术、经济、操作可行性。
- 需求分析:确定系统做什么(产出:需求规格说明书 SRS,工具:数据流程图 DFD)。
- 开发期:
- 概要设计:确定系统总体架构、模块划分(产出:概要设计说明书)。
- 详细设计:确定模块内部算法、数据结构(产出:详细设计说明书、模块实现的算法设计)。
- 编码:写代码。
- 测试:发现错误。
- 维护期:
- 运行与维护:改正性、适应性、完善性、预防性维护。(成本最高的阶段)
- 定义期:
结构化分析方法(SA)
- 核心思想:自顶向下、逐层分解。
- 工具:
- 数据流图(DFD):图形化描述数据流动过程。如:加工(圆圈)、数据流(箭头)、存储文件(双横线)、源/宿(方框)。
- 数据字典(DD):定义数据流图中出现的所有数据元素。
- 判定表/判定树:描述复杂逻辑判断。
结构化设计方法(SD)
- 基本原理:
- 抽象。
- 模块化:降低复杂度。
- 信息隐蔽:模块内部细节对外不可见。
- 模块独立性:高内聚、低耦合。
- 衡量模块独立性:
- 耦合性:模块间联系的紧密程度。越低越好。
- 顺序(由低到高):无直接耦合 < 数据耦合 < 标记耦合 < 控制耦合 < 公共耦合 < 内容耦合。
- 内聚性:模块内部元素的紧密程度。越高越好。
- 顺序(由低到高):偶然内聚 < 逻辑内聚 < 时间内聚 < 过程内聚 < 通信内聚 < 顺序内聚 < 功能内聚。
- 耦合性:模块间联系的紧密程度。越低越好。
软件测试
- 目的:发现错误,而不是证明程序正确。
- 准则:
- 尽早测试。
- 避免程序员测试自己的程序。
- 测试方法:
- 白盒测试(逻辑驱动测试):
- 关注内部逻辑结构。
- 方法:逻辑覆盖(语句覆盖、路径覆盖)、基本路径测试。
- 黑盒测试(功能测试):
- 关注输入输出功能。
- 方法:等价类划分法、边界值分析法、错误推测法。
- 白盒测试(逻辑驱动测试):
- 测试步骤:
- 单元测试:模块测试。
- 集成测试:组装测试(测试模块间接口)。
- 系统测试:软硬件结合测试。
- 验收测试:用户参与。
- 重要细节:调试是在测试发现错误后,诊断并改正错误的过程。
数据库设计基础
数据库基本概念
- 数据库(DB):长期存储在计算机内的有组织、可共享的数据集合。
- 数据库管理系统(DBMS):管理数据库的软件(如 MySQL, Access)。
- 数据库系统(DBS):DB + DBMS + 应用程序 + 用户 + 管理员。
- 数据库系统的核心:DBMS。
数据模型
- 概念模型:按用户观点建模。最著名的是实体-联系模型(E-R模型)。
- 实体:客观存在的事物。
- 属性:实体的特征。
- 联系:实体间的联系(1:1, 1:n, m:n)。
- E-R 图:矩形(实体)、椭圆(属性)、菱形(联系)、连线。
- 逻辑模型:按计算机观点建模。
- 层次模型(树形)。
- 网状模型(图)。
- 关系模型(二维表)。
关系模型详解
- 术语:
- 关系:一张二维表。
- 元组:表中的一行(记录)。
- 属性:表中的一列。
- 码/键:
- 候选码:能唯一标识元组的最小属性集。
- 主码:从候选码中选一个作为主键。
- 外码:不是本表的主码,但是另一个表的主码。
- 关系运算:
- 传统的集合运算:并(\(\cup\))、差(\(-\))、交(\(\cap\))。
- 专门的关系运算(重点):
- 选择:从关系中找出满足条件的元组(行操作)。
- 投影:从关系中选出若干属性组成新关系(列操作)。
- 连接:将两个关系拼接成一个大关系。自然连接:去掉重复属性的等值连接。
数据库设计
- 设计阶段:
- 需求分析。
- 概念设计:设计 E-R 图。
- 逻辑设计:将 E-R 图转换为关系模式。
- 物理设计。
- 实施。
- 运行维护。
- 范式(NF):规范化的程度。
- 第一范式(1NF):属性不可再分(无小表)。
- 第二范式(2NF):消除了非主属性对码的部分函数依赖。
- 第三范式(3NF):消除了非主属性对码的传递函数依赖。
进程
基本状态(五状态模型)
- 创建:进程正在被创建,分配资源,尚未进入就绪队列。
- 就绪:进程已获得所需资源(除 CPU 外),等待被调度执行。
- 运行:进程正在 CPU 上执行指令。
- 阻塞(等待):进程因等待某事件(如 I/O 完成)而暂停,即使分配 CPU 也无法运行。
- 终止:进程执行完毕或被强制结束,正在释放资源。
扩展状态(七状态模型,引入挂起)
- 就绪挂起:进程在外存(交换区)中,但具备运行条件,调入内存即可转为就绪。
- 阻塞挂起:进程在外存中,等待的事件尚未发生,调入内存后仍为阻塞。
状态转换
- 创建 → 就绪:初始化完成。
- 就绪 → 运行:调度程序分配CPU。
- 运行 → 就绪:时间片用完或被抢占。
- 运行 → 阻塞:请求某事件(如I/O)未满足。
- 阻塞 → 就绪:事件完成。
- 运行 → 终止:执行结束或异常。
- 就绪/阻塞 ↔ 就绪挂起/阻塞挂起:内存不足或进程交换。
连续存储管理技术
单一连续分配
- 原理:内存分为系统区和用户区,用户区由一道作业独占。
- 特点:简单,无地址转换,但并发度低,资源利用率低。
- 适用:单用户、单任务操作系统(如MS-DOS)。
固定分区分配
- 原理:内存划分为若干个大小固定(可相等或不等的分区),每个分区装入一道作业。
- 特点:支持多道程序,但分区大小需预先设定,易产生内部碎片(分区内未用空间)。
- 管理:维护分区使用表,记录分区状态、大小和起始地址。
动态分区分配
- 原理:根据作业实际需要动态划分内存分区,分区大小和数目可变。
- 特点:无内部碎片,但易产生外部碎片(内存中许多小的空闲块无法使用)。
- 分配策略:
- 首次适应:从低地址开始找第一个足够大的空闲分区。
- 最佳适应:找大小最接近需求的空闲分区(避免大材小用,但易产生小碎片)。
- 最坏适应:找最大的空闲分区(减少小碎片,但可能很快耗尽大块空间)。
- 邻近适应:从上一次分配位置开始查找,性能较均衡。
- 回收与拼接:作业释放时需检查相邻空闲区并合并,以缓解外部碎片。
整数储存
分类
- 无符号整数:所有位均表示数值,范围 \(0 \sim 2^n - 1\)(\(n\) 为位数)。
- 有符号整数:最高位为符号位(0 正 1 负),常用补码表示。
补码规则
- 正数:补码与原码相同。
- 负数:原码取反(符号位不变)再加1。
- 范围:\(-2^{n-1} \sim 2^{n-1} - 1\)。

浙公网安备 33010602011771号