算法是处理问题的策略,数据结构是描述问题信息的数据模型,程序则是计算机按照处理问题的策略处理问题信息的一组指令集
——《算法+数据结构=程序》Niklaus Wirth
数据结构(Data Structure) 是相互之间存在一种或多种特定关系的数据元素的集合。它可以用形式化的二元组表示为:
Data-Structure=(D,S)
其中:
D 是数据元素的有限集
S 是 D 上关系的有限集
简单来说,数据结构不仅要存储数据元素本身,还要存储数据元素之间的逻辑关系。它是计算机存储、组织数据的方式,直接影响算法的效率。
2. 数据结构的三个要素
2.1 数据的逻辑结构
逻辑结构是指数据元素之间的逻辑关系,从逻辑关系上描述数据,独立于计算机存储方式。
逻辑结构的四大分类:
表格
线性结构的数学定义: R={⟨a1,a2⟩,⟨a2,a3⟩,…,⟨an−1,an⟩}
其中 ⟨x,y⟩ 表示 x 是 y 的直接前驱,y 是 x 的直接后继。
2.2 数据的存储结构(物理结构)
存储结构是数据结构在计算机中的表示(映像),解决逻辑结构如何在内存中物理实现的问题 。
四种基本存储方式:
① 顺序存储
原理:逻辑上相邻的元素存储在物理位置也相邻的存储单元中
优点:支持随机存取,存储密度高(无额外开销)
缺点:插入删除需移动大量元素,可能产生外部碎片
实现:数组
② 链式存储
原理:逻辑相邻的元素物理位置可不相邻,通过指针表示逻辑关系
优点:充分利用存储单元,无外部碎片,插入删除高效
缺点:额外存储指针空间,只能顺序存取
实现:链表(单链表、双向链表、循环链表)
③ 索引存储
原理:存储元素信息的同时,建立附加的索引表(关键字+地址)
优点:检索速度快
缺点:占用额外空间,增删数据需修改索引表
④ 散列存储(哈希存储)
原理:根据元素的关键字通过散列函数直接计算存储地址
优点:增删查操作平均时间复杂度 O(1)
缺点:哈希函数设计不好会产生冲突,解决冲突会增加时空开销
关键理解:同一种逻辑结构可以采用不同的存储结构实现。例如线性表既可以用顺序表(数组)实现,也可以用链表(指针)实现,它们的操作效率截然不同。
2.3 数据的运算
运算包括运算的定义和运算的实现两个层面:
运算的定义:针对逻辑结构,指出运算的功能(做什么)
运算的实现:针对存储结构,指出运算的具体操作步骤(怎么做)
基本运算类型:
示例:对于线性表的基本运算
InitList(&L):初始化空表ListInsert(&L, i, e):在第 i 个位置插入元素 eListDelete(&L, i, &e):删除第 i 个元素,值存入 eLocateElem(L, e):按值查找GetElem(L, i):按位查找
3. 抽象数据类型(ADT)
3.1 数据类型
数据类型是一个值的集合和定义在该值集上的一组操作的总称。
原子类型:值不可再分(如
int,bool,float)结构类型:值可分解为若干成分(如
struct,数组)
3.2 抽象数据类型(ADT)详解
抽象数据类型(Abstract Data Type, ADT) 是抽象数据组织及与之相关的操作,用数学化的语言定义数据的逻辑结构和运算,与具体实现无关
ADT的核心思想:"接口与实现分离"
只定义"数据结构要做什么",不关心"具体怎么做"
同一种ADT可以有多种物理实现(如线性表可用顺序表或链表实现)
使用者无需关注底层细节
ADT的形式化定义(三元组): ADT=(D,S,P)
D :数据对象(数据元素的集合)
S :D 上的关系集(逻辑结构)
P :对 D 的基本操作集
线性表ADT示例:plai
ADT List {
数据对象:D = {a_i | a_i ∈ ElemSet, i=1,2,...,n, n≥0}
数据关系:R = {<a_{i-1}, a_i> | a_{i-1}, a_i ∈ D, i=2,...,n}
基本操作:
InitList(&L) // 构造空线性表L
DestroyList(&L) // 销毁线性表L
ListInsert(&L, i, e) // 在L中第i个位置之前插入元素e
ListDelete(&L, i, &e) // 删除L中第i个数据元素,用e返回其值
LocateElem(L, e) // 在L中查找与e相等的元素
GetElem(L, i, &e) // 用e返回L中第i个数据元素的值
} ADT List4. 算法基础
4.1 算法的定义
算法(Algorithm) 是对特定问题求解步骤的一种描述,是指令的有限序列。它取一个或一组值为输入,并产生出一个或一组值作为输出。
4.2 算法的五个重要特征
表格
4.3 算法效率的度量
评价算法优劣的标准:
正确性:算法应满足具体问题的需求
可读性:算法应易于理解和维护
健壮性:输入非法数据时,算法能适当处理而不会产生异常
效率:时间效率和空间效率
时间复杂度和空间复杂度是衡量算法效率的两个核心指标。
5. 数据结构、数据类型与ADT的关系pl
数据类型(Data Type)
├── 原子类型(int, float, char...)
└── 结构类型(struct, array...)
└── 数据结构(Data Structure)
├── 逻辑结构(线性、树、图)
├── 存储结构(顺序、链式、索引、散列)
└── 运算(增删改查...)
└── 抽象数据类型 ADT(数学模型+操作)
└── 具体实现(代码)关键区别:
数据结构:强调数据元素之间的关系及存储方式
数据类型:强调值的集合和允许的操作
ADT:强调逻辑特性,隐藏实现细节,是数据结构的抽象描述
6. 学习数据结构的意义
程序 = 数据结构 + 算法(Niklaus Wirth)
选择合适的数据结构可以:
提高程序执行效率(降低时间复杂度)
减少内存占用(降低空间复杂度)
使代码更易维护和扩展
是操作系统、数据库、编译原理等高级课程的基础
7. 小结
表格
数据结构绪论
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法