Skip to content

2.1 数据结构基本概念

计算机程序设计 · 数据结构 · 2.1 数据结构基本概念

数据结构基本概念

🎯 一句话秒杀:数据结构 = 数据 + 结构——研究数据怎么存(逻辑结构+物理结构)和数据怎么操作(算法)。


一、基本概念与术语

数据结构的层次

数据(Data)— 客观事物的符号表示
  └── 数据对象(Data Object)— 性质相同的数据元素的集合
       └── 数据元素(Data Element)— 数据的基本单位
            └── 数据项(Data Item)— 不可分割的最小单位
c
// 例如:学生信息表
// 数据对象:全体学生的信息
// 数据元素:单个学生的记录
// 数据项:学号、姓名、成绩——每个都是不可再分的数据项

struct Student {       // 数据元素
    int id;            // 数据项
    char name[20];     // 数据项
    float score;       // 数据项
};

核心术语对比

术语定义例子
数据客观事物的符号表示数字、文字、图像
数据元素数据的基本单位一个学生记录
数据项不可分割的最小单位学号、姓名
数据对象同性质数据元素的集合全体学生

二、逻辑结构(数据间的关系)

四种基本逻辑结构

逻辑结构
├── 集合结构           — 同属一个集合,除此之外没有其他关系
├── 线性结构           — 一对一(如线性表、栈、队列)
├── 树形结构           — 一对多(如树、二叉树)
└── 图状结构/网状结构  — 多对多(如图)

四种基本逻辑结构示意图(集合/线性/树形/图形)

🔑 秒杀秘籍

结构关系实例
线性1:1排队买票
树形1:N家族族谱
图形N:N地铁线路图

三、存储结构(物理结构)

四种存储方式

存储方式特点优点缺点
顺序存储用一组连续的内存单元随机访问快 O(1)插入删除需要移动元素
链式存储用一组任意的内存单元+指针插入删除快只能顺序访问,有额外指针开销
索引存储建立索引表查找快需要额外索引空间
散列存储用哈希函数计算位置查找极快 O(1)有冲突问题

顺序存储 vs 链式存储

比较顺序存储链式存储
逻辑相邻→物理位置也相邻不一定相邻
访问方式随机存取(直接算位置)顺序存取(要遍历)
存储密度=1(只有数据)<1(有指针开销)
插入删除O(n)—要移动元素O(1)—改指针就行
空间需预分配随用随分配

四、数据类型与抽象数据类型

数据类型(Data Type)

一组性质相同的值的集合 + 定义在此集合上的操作

  • 原子类型:不可再分(int, char, float)
  • 结构类型:由多个成分组成(struct, union, 数组)

抽象数据类型 ADT(Abstract Data Type)

用数学方式定义数据类型——不关心具体实现,只关心"能做什么"

ADT 抽象数据类型名 {
    数据对象:<数据对象的定义>
    数据关系:<数据关系的定义>
    基本操作:<操作的定义>
} ADT 抽象数据类型名

🚨 红牌警告

数据类型 ≠ 抽象数据类型 数据类型是具体实现(C语言中的int怎么存、怎么算) 抽象数据类型是逻辑描述(不关心底层实现)

五、算法的基本概念

算法的特性(五个)

特性含义反例
有穷性有限步后结束死循环
确定性每一步含义确定"把数变大"——歧义
可行性能通过有限操作实现计算精确π到1亿位(不现实)
输入0个或多个输入
输出至少1个输出无输出的程序没用

算法 vs 程序

对比算法程序
有穷性必须满足可以无限(如操作系统)
语言描述自然语言/流程图/伪代码编程语言
执行者计算机

六、算法分析——时间复杂度

大O表示法

T(n) = O(f(n)) — 当n→∞时,T(n) ≤ c·f(n)

常见时间复杂度

名称例子效率
O(1)常数阶取数组元素 a[i]⭐⭐⭐⭐⭐
O(log n)对数阶二分查找⭐⭐⭐⭐
O(n)线性阶遍历数组找最大值⭐⭐⭐
O(n log n)线性对数阶快速排序(平均)⭐⭐⭐
O(n²)平方阶冒泡排序⭐⭐
O(2ⁿ)指数阶递归斐波那契

复杂度计算技巧

c
// O(1) — 不管n多大都执行固定次数
int a = arr[0];

// O(n) — 循环执行n次
for (int i = 0; i < n; i++)
    sum += arr[i];

// O(n²) — 两层嵌套循环
for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
        printf("%d", arr[i][j]);

// O(log n) — 每次规模减半
while (n > 0) {
    printf("%d", n);
    n /= 2;
}

🔑 秒杀秘籍

时间复杂度只看最高阶,忽略常数和低阶 O(2n+1) → O(n) ✅ O(n²+n) → O(n²) ✅ O(100) → O(1) ✅

时间复杂度推导口诀: 一重循环O(n),两重嵌套O(n²),每次减半O(log n)


📝 闭卷真题挑战

(点击下方空白查看答案)

1. 数据的逻辑结构分为哪四种?

2. 顺序存储和链式存储的主要区别?

3. 算法必须满足的五个特性是?

4. 以下算法的时间复杂度是?
   for(i=0; i<n; i++)
       for(j=0; j<n; j++)
           a[i][j] = 0;

5. 算法和程序的区别?
👆 点击展开答案
  1. 集合、线性(1:1)、树形(1:N)、图形(N:N)
  2. 顺序存储逻辑相邻→物理相邻,随机存取;链式存储逻辑相邻→物理不一定相邻,顺序存取
  3. 有穷性、确定性、可行性、输入、输出
  4. O(n²)(双层嵌套循环)
  5. 算法不要求有穷性(?不对——算法必须有穷,程序可以无限运行);算法是逻辑描述,程序是具体实现

📖 教材习题对照

教材习题知识点难度
习题1.1数据结构的定义
习题1.2逻辑结构与物理结构⭐⭐
习题1.3~1.4算法特性、时间复杂度⭐⭐
习题1.5算法分析⭐⭐⭐

对应教材:严蔚敏《数据结构》C语言版 第2版 → 第1章 绪论 对应考试大纲:考点12 — 数据结构基本概念考点20 — 算法基本概念考点21 — 算法分析初步

📺 配套视频

复习到本考点 → 先看视频补讲,再刷上面「闭卷挑战」。

仅供个人学习 · 考生回忆版 · 非考试院原卷