计算机二级公共基础知识

数据结构与算法

这是最核心、分值最高的模块,涉及大量的计算和概念辨析。

算法基础

  • 算法定义:解题方案的准确而完整的描述。
  • 算法的基本特征
    1. 可行性:每一步都必须能执行。
    2. 确定性:每一步都有确切的含义,无歧义。
    3. 有穷性:必须在有限时间内执行完毕。
    4. 拥有足够的情报:输入可以是零个或多个,输出必须有一个或多个。
  • 算法复杂度(考点):
    • 时间复杂度:衡量算法执行时间随问题规模增长的趋势。不是具体的执行时间,而是执行次数的数量级。例如:\(O(n)\)\(O(n^2)\)\(O(\log_2 n)\)。循环变量从 1 到 n,时间复杂度为 \(O(n)\);嵌套循环通常为 \(O(n^2)\);二分查找为 \(O(\log_2 n)\)
    • 空间复杂度:衡量算法执行过程中所需存储空间的大小。如果算法所需的辅助空间不随问题规模 n 变化,则空间复杂度为 \(O(1)\)(常数阶)。

数据结构的基本概念

  • 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
  • 逻辑结构:数据元素之间的逻辑关系,与计算机存储无关。
    1. 线性结构:一对一(如:线性表、栈、队列)。
    2. 非线性结构:一对多或多对多(如:树、图)。
  • 存储结构(物理结构):数据在计算机中的表示。
    1. 顺序存储:逻辑上相邻的节点物理上也相邻,占用连续空间(如数组)。
    2. 链式存储:逻辑上相邻的节点物理上不一定相邻,通过指针链接(如链表)。
    3. 索引存储:建立索引表。
    4. 散列存储:根据关键字直接计算地址。

线性表

  • 定义: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 的节点。
    • 深度:树中节点的最大层次。
  • 二叉树性质(必背):
    1. \(i\) 层上最多有 \(2^{i-1}\) 个节点。
    2. 深度为 \(k\) 的二叉树最多有 \(2^k - 1\) 个节点。
    3. 叶子节点数(\(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 语句。

  • 基本结构:三种结构构成的程序称为结构化程序,且只有一个入口和一个出口。

    1. 顺序结构:按顺序执行。
    2. 选择结构:if-else。
    3. 循环结构:while, for。

面向对象程序设计(OOP)

  • 对象:系统中用来描述客观事物的一个实体,是属性和方法的封装体。
  • :具有相同属性和方法的一组对象的集合,是对象的抽象。
  • 属性:对象的状态/数据。
  • 方法:对象的行为/操作。
  • 面向对象的三大特征
    1. 封装:隐藏对象的内部细节,只提供公共访问接口。
    2. 继承:子类共享父类的属性和方法,实现代码复用。
    3. 多态:同一操作作用于不同对象产生不同的行为。实现方式:方法重载、方法重写。
  • 消息:对象之间通信的载体。

软件工程基础

软件工程基本概念

  • 软件定义:程序、数据、文档。
  • 软件危机:开发成本高、进度慢、质量低、维护困难。
  • 软件生命周期(三个时期,四个阶段):
    1. 定义期
      • 问题定义:确定系统要解决的问题。
      • 可行性研究:技术、经济、操作可行性。
      • 需求分析:确定系统做什么(产出:需求规格说明书 SRS,工具:数据流程图 DFD)。
    2. 开发期
      • 概要设计:确定系统总体架构、模块划分(产出:概要设计说明书)。
      • 详细设计:确定模块内部算法、数据结构(产出:详细设计说明书、模块实现的算法设计)。
      • 编码:写代码。
      • 测试:发现错误。
    3. 维护期
      • 运行与维护:改正性、适应性、完善性、预防性维护。(成本最高的阶段)

结构化分析方法(SA)

  • 核心思想:自顶向下、逐层分解。
  • 工具
    • 数据流图(DFD):图形化描述数据流动过程。如:加工(圆圈)、数据流(箭头)、存储文件(双横线)、源/宿(方框)。
    • 数据字典(DD):定义数据流图中出现的所有数据元素。
    • 判定表/判定树:描述复杂逻辑判断。

结构化设计方法(SD)

  • 基本原理
    • 抽象
    • 模块化:降低复杂度。
    • 信息隐蔽:模块内部细节对外不可见。
    • 模块独立性:高内聚、低耦合。
  • 衡量模块独立性
    • 耦合性:模块间联系的紧密程度。越低越好。
      • 顺序(由低到高):无直接耦合 < 数据耦合 < 标记耦合 < 控制耦合 < 公共耦合 < 内容耦合。
    • 内聚性:模块内部元素的紧密程度。越高越好。
      • 顺序(由低到高):偶然内聚 < 逻辑内聚 < 时间内聚 < 过程内聚 < 通信内聚 < 顺序内聚 < 功能内聚。

软件测试

  • 目的:发现错误,而不是证明程序正确。
  • 准则
    • 尽早测试。
    • 避免程序员测试自己的程序。
  • 测试方法
    1. 白盒测试逻辑驱动测试):
      • 关注内部逻辑结构。
      • 方法:逻辑覆盖(语句覆盖、路径覆盖)、基本路径测试。
    2. 黑盒测试功能测试):
      • 关注输入输出功能。
      • 方法:等价类划分法、边界值分析法、错误推测法。
  • 测试步骤
    1. 单元测试:模块测试。
    2. 集成测试:组装测试(测试模块间接口)。
    3. 系统测试:软硬件结合测试。
    4. 验收测试:用户参与。
  • 重要细节调试是在测试发现错误后,诊断并改正错误的过程。

数据库设计基础

数据库基本概念

  • 数据库(DB):长期存储在计算机内的有组织、可共享的数据集合。
  • 数据库管理系统(DBMS):管理数据库的软件(如 MySQL, Access)。
  • 数据库系统(DBS):DB + DBMS + 应用程序 + 用户 + 管理员。
  • 数据库系统的核心:DBMS。

数据模型

  • 概念模型:按用户观点建模。最著名的是实体-联系模型(E-R模型)
    • 实体:客观存在的事物。
    • 属性:实体的特征。
    • 联系:实体间的联系(1:1, 1:n, m:n)。
    • E-R 图:矩形(实体)、椭圆(属性)、菱形(联系)、连线。
  • 逻辑模型:按计算机观点建模。
    • 层次模型(树形)。
    • 网状模型(图)。
    • 关系模型(二维表)。

关系模型详解

  • 术语
    • 关系:一张二维表。
    • 元组:表中的一行(记录)。
    • 属性:表中的一列。
    • 码/键
      • 候选码:能唯一标识元组的最小属性集。
      • 主码:从候选码中选一个作为主键。
      • 外码:不是本表的主码,但是另一个表的主码。
  • 关系运算
    1. 传统的集合运算:并(\(\cup\))、差(\(-\))、交(\(\cap\))。
    2. 专门的关系运算(重点):
      • 选择:从关系中找出满足条件的元组(行操作)。
      • 投影:从关系中选出若干属性组成新关系(列操作)。
      • 连接:将两个关系拼接成一个大关系。自然连接:去掉重复属性的等值连接。

数据库设计

  • 设计阶段
    1. 需求分析。
    2. 概念设计:设计 E-R 图。
    3. 逻辑设计:将 E-R 图转换为关系模式。
    4. 物理设计。
    5. 实施。
    6. 运行维护。
  • 范式(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\)
posted @ 2026-03-28 17:19  AFewMoon  阅读(7)  评论(0)    收藏  举报