数据结构第一课

目录

  1. 数据结构中的基本概念
  2. 数据结构的三要素
  3. 逻辑结构的4种类型
  4. 二元组表示法:怎么描述一个数据结构?
  5. 存储结构的4种类型
  6. 数据类型 vs 抽象数据类型(ADT)
  7. 本章小结 & 常见考点

  • 数据结构中的基本概念

1.1 什么是数据?

数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。

简单说:只要能输入计算机、能被程序处理的东西,都是数据。

  • Word文档是数据
  • 图片、视频是数据
  • 我们平时写的代码也是数据

注意:数据结构中主要讨论的是结构化数据(比如表格、数组这种有规律的数据)。

1.2 三个核心概念:数据 > 数据元素 > 数据项

这三个概念是层层包含的关系,一定要分清楚:

概念 定义 举例(学生成绩表)

数据 信息的载体,所有能被计算机处理的符号集合 整个学生成绩表

数据元素 数据的基本单位,通常作为一个整体考虑和处理 每一行(一个学生的所有成绩)

数据项 构成数据元素的不可分割的最小单位 姓名、学号、语文成绩、数学成绩...

一句话记住:

数据 > 数据元素 > 数据项

班级成绩表 > 个人成绩记录 > 姓名、学号、成绩...

1.3 什么是数据对象?

数据对象是具有相同性质的数据元素的集合,是数据的一个子集。

举个例子:

  • 海底捞所有门店的排队顾客信息 = 数据
  • A门店的排队顾客信息 = 一个数据对象
  • B门店的排队顾客信息 = 另一个数据对象

同一个数据对象里的数据元素,都具有相同的性质。

1.4 什么是数据结构?

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

简单理解:

  • 一堆数据放在一起,光有元素还不够
  • 元素和元素之间有关系,这个关系就是"结构"

比如排队:你前面是谁、后面是谁,这就是关系,就是结构。

  • 数据结构的三要素

讨论一种数据结构,必须从三个方面入手:

2.数据结构三要素

├── 逻辑结构:数据元素之间的逻辑关系(面向用户)

├── 物理结构(存储结构):数据在计算机存储器中的存储方式(面向程序员)

└── 数据的运算:施加在数据上的操作(增删改查等)

三要素 含义 面向谁

逻辑结构 数据元素之间的逻辑关系是什么样的 用户

存储结构 这些数据在内存里怎么存 程序员

数据运算 对这些数据能做什么操作 程序员

  • 3.逻辑结构的4种类型

逻辑结构是从用户的角度看数据元素之间的关系,一共分4种:

3.1 集合

元素之间关系:无

特点:数据元素之间除了"属于同一个集合"的关系外,别无其他逻辑关系。

就像火锅里的食材,都在一个锅里,但彼此之间没什么顺序关系。

● ● ● ● ● ●

3.2 线性结构 (结构体数组不等于线性结构)

元素之间关系:一对一

特点:开始元素和终端元素都是唯一的,除此之外,其余元素都有且仅有一个前驱元素和一个后继元素。

就像排队买奶茶,一个接一个,每个人前面只有一个人,后面也只有一个人。

● → ● → ● → ● → ●

常见的线性结构:线性表、栈、队列、字符串...

3.3 树形结构

元素之间关系:一对多

特点:开始元素唯一,终端元素不唯一。除终端元素以外,每个元素有一个或多个后继元素;除开始元素外,每个元素有且仅有一个前驱元素。

就像家族族谱,一个爸爸可以有多个孩子,但每个孩子只有一个爸爸。

/ |

● ● ●

/ \ /

● ● ● ●

常见的树形结构:二叉树、B树、堆...

3.4 图形结构(图结构)

元素之间关系:多对多

特点:所有元素都可能有多个前驱元素和多个后继元素。

就像微信好友关系,你有很多好友,每个好友又有其他好友,关系错综复杂。

● --- ●

/ \ /

● --- ● --- ●

\ / \ /

● --- ●

常见的图形结构:有向图、无向图、网...

四种逻辑结构对比表

类型 元素关系 特点 举例

集合 无关系 同属一个集合即可 火锅食材拼盘

线性结构 一对一 一个前驱,一个后继 排队、链表

树形结构 一对多 一个前驱,多个后继 族谱、文件夹

图形结构 多对多 多个前驱,多个后继 微信好友、地图

  • 二元组表示法:怎么描述一个数据结构?

  • 4.1 什么是二元组?
    二元组是一种通用的逻辑结构表示方法。
    一个二元组表示为:
    B = (D, R)

其中:

  • B:数据结构
  • D:数据元素的集合(元素有限集)
  • R:D上关系的有限集

4.2 序偶:怎么表示关系?

每个关系用若干个序偶来表示:

<x, y> (x, y ∈ D)

含义:

  • x 是第一元素,y 是第二元素
  • x 是 y 的直接前驱元素
  • y 是 x 的直接后继元素

注意:

  • 序偶 <x, y> 表示 x、y 是有向的(有箭头方向)
  • 序偶 (x, y) 表示 x、y 是无向的(双向箭头)

4.3 开始元素 vs 终端元素

  • 开始元素:没有前驱元素的元素
  • 终端元素:没有后继元素的元素
    4.4 举个例子

假设有学生表:

学号 姓名 性别 班号

1 张斌 男 9901

8 刘丽 女 9902

34 李英 女 9901

20 陈华 男 9902

12 王奇 男 9901

26 董强 男 9902

5 王萍 女 9901

用二元组表示:

B = (D, R)

D = {1, 8, 34, 20, 12, 26, 5}

R = {<1,8>, <8,34>, <34,20>, <20,12>, <12,26>, <26,5>}

画成图就是:

1 → 8 → 34 → 20 → 12 → 26 → 5

很明显,这是一个线性结构!

  1. 存储结构的4种类型

存储结构(物理结构)是数据在计算机内存中的存储方式。

逻辑结构是面向用户的,存储结构是面向程序员的。

同一种逻辑结构,可以用不同的存储结构来实现。

5.1 顺序存储(在内存存储时地址必须相邻,连续存储空间。)(补充一下:数组是找连续空间。)

把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。

就像电影院的座位,按编号一排一排紧挨着坐。

特点:

  • 所有元素占用一整块内存空间
  • 逻辑上相邻的元素,物理上也相邻
  • 通过存储单元的邻接关系来体现元素间的关系

C语言实现举例:

c 复制代码
struct {
    int no; // 学号
    char name[8]; // 姓名
    char sex[2]; // 性别
    char class[4]; // 班号
} Stud[7] = {
    {1, "张斌", "男", "9901"},
    {8, "刘丽", "女", "9902"},
    // ...
};

5.2 链式存储 (在内存存储时地址可以不相邻)

逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。

就像找朋友,不用住在隔壁,靠微信保持联系就行。

特点:

  • 一个逻辑元素用一个结点存储,每个结点单独分配
  • 所有结点的地址不一定是连续的
  • 用指针来表示逻辑关系

C语言实现举例:

c 复制代码
typedef struct studnode {
    int no; // 学号
    char name[8]; // 姓名
    char sex[2]; // 性别
    char class[4]; // 班号
    struct studnode *next; // 指向结点的指针
} StudType;

5.3 索引存储

在存储元素信息的同时,还建立附加的索引表。

就像书后面的索引目录,告诉你某个关键词在第几页。

索引项的一般形式: (关键字,地址)

特点:

  • 查找速度快
  • 但需要额外的索引表空间

5.4 散列存储(哈希存储)

根据元素的关键字直接计算出该元素的存储地址,又称 Hash 存储。

就像你有一个公式,输入学号,直接算出这个人存在内存的哪个位置。

特点:

  • 查找速度极快(O(1))
  • 但可能会有冲突(不同关键字算出同一个地址)

四种存储结构对比

存储方式 特点 优点 缺点

顺序存储 连续存储 随机存取,存储密度高 插入删除慢,需要连续空间

链式存储 指针连接 插入删除方便,不要求连续 存储密度低,只能顺序存取

索引存储 加索引表 查找速度快 额外索引表开销

散列存储 Hash计算地址 查找极快 可能有冲突

  1. 数据类型 vs 抽象数据类型(ADT)

6.1 什么是数据类型?

数据类型是一个值的集合和定义在此集合上的一组操作的总称。

就像int类型:

  • 值的集合:-2147483648 ~ 2147483647
  • 可进行的操作:加、减、乘、除、模运算...

数据类型分两种:

1)原子类型

其值不可再分 的数据类型。

比如:bool、int、char、float...

c 复制代码
bool 类型:值范围 true / false
可操作:与、或、非

int 类型:值范围 -2147483648 ~ 2147483647
可操作:加、减、乘、除、模运算...
 

2)结构类型

其值可以再分解 为若干成分(分量)的数据类型。

比如:结构体 struct

c 复制代码
struct Customer {
    int num; // 号数
    int people; // 人数
    // ...
};

6.2 什么是抽象数据类型(ADT)?

抽象数据类型(ADT)指的是从求解问题的数学模型中抽象出来的数据逻辑结构和运算(抽象运算),而不考虑计算机的具体实现。

一句话总结:

抽象数据类型 = 逻辑结构 + 抽象运算

ADT只关心"做什么",不关心"怎么做"。

举个例子:复数 Complex

ADT Complex {

数据对象: D = {e1, e2 | e1, e2均为实数}

数据关系: R = {<e1, e2> | e1是复数的实部,e2是复数的虚部}

基本操作: 加法、减法、乘法...

}

我们只需要知道复数能做加减乘除,不用关心它在计算机里具体怎么存、怎么算。

  1. 本章小结 & 常见考点

核心知识点回顾

  1. 数据结构的定义:相互之间存在特定关系的数据元素的集合
  2. 三要素:逻辑结构 + 存储结构 + 数据运算
  3. 逻辑结构4种:集合、线性、树形、图形
  4. 存储结构4种:顺序、链式、索引、散列
  5. ADT:逻辑结构 + 抽象运算

常见考试题型

填空题:

  1. 数据的基本单位是______。(答案:数据元素)
  2. ______是构成数据元素的最小单位。(答案:数据项)
  3. ______是具有相同性质的数据元素的集合。(答案:数据对象)
  4. 数据结构的三要素:、、______。(答案:逻辑结构、物理结构/存储结构、数据的运算)

多选题:

逻辑结构类型包括?ABCD

  • A. 树形
  • B. 图
  • C. 集合
  • D. 线性
  • E. 非线性(这是按关系复杂程度分的大类,不是具体类型)

1.单选题

在数据结构中,从逻辑上可以把数据结构分成C

A 动态结构和静态结构

B 紧凑结构和非紧凑结构

C 线性结构和非线性结构

D 内部结构和外部结构

2.用图形表示下列数据结构,并指出它们是属于线性结构还是非线性结构。A

S=(D,R)

D={ a,b,c,d,e,f }

R={(a,e), (b,c), (c,a), (e,f), (f,d)}

A 线性结构

B 树形结构

C 图形结构

D 集合

解析:上述表达式可用图形表示为:b→c→a→e→f→d

3.B

S=(D,R)

D={di | 1≤i≤5}

R={(di , dj ), i<j}

A 线性结构

B 图形结构

C 集合

D 树形结构

4.线性结构

有下列几种用二元组表示的数据结构,画出它们分别对应的图形表示,并指出它们分别属于何种结构

A=(K,R),其中:

K={a,b,c,d,e,f,g,h}

R={r}

r={<a,b>,<b,c>,<c,d>,<d,e>,<e,f>,<f,g>,<g,h>}

解:a→b →c →d →e →f →g →h

5.树形结构

B=(K,R),其中:

K={a,b,c,d,e,f,g,h}

R={r}

r={<d,b>,<d,g>,<d,a>,<b,c>,<g,e>,<g,h>,<e,f>}

6.图形结构

C=(K,R)

K={1,2,3,4,5,6}

R={r}

r={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}

跟我一步步学,慢慢走。

未完待续。。。。

相关推荐
张小姐的猫1 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
孫治AllenSun1 小时前
【LangChain4J-09】开发学习知识点
spring boot·后端·学习
Thomas21432 小时前
mysql 索引面试复习
数据库·mysql·面试
Elastic 中国社区官方博客2 小时前
Elasticsearch Python DSL 客户端开发
大数据·数据库·python·elasticsearch·搜索引擎·全文检索
风哥2号2 小时前
数据库教程FGMT03‑生产环境Linux+Oracle19c+ASM安装配置与项目实战
linux·数据库
边境悍匪2 小时前
蜗牛学苑 Java 智能体学习 Day38|Spring AI Alibaba2 思维导图复盘
java·学习·spring
龙亘川2 小时前
旅游强国建设|一网统管智慧旅游服务模块,赋能节假日文旅数字化治理
大数据·数据库·人工智能·科技·智慧城市·旅游
唐青枫2 小时前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
c#·.net