一些定义:
- 数据:是描述客观事物的数和字符的集合;所有能输入到计算机中,且能被计算机处理的符号的集合;是计算机操作对象的总称;是计算机所处理信息的某种特定的符号表现形式。
- 数据元素:数据的基本单位,也被称为元素、结点、顶点或者记录;一个数据元素由若干个数据项组成。
- 数据项:具有独立含义的数据最小单位,也称为字段或域。
- 数据对象:是性质相同的数据元素的集合,是数据的一个子集。
- 数据结构:指所有数据元素以及数据元素之间的关系,可以看作是相互之间存在着某种特定关系的数据元素的集合。
- 数据的逻辑结构:由数据元素之间的逻辑关系构成。是从数据元素的逻辑关系上描述数据的,是指数据元素之间的逻辑关系的整体,通常是从求解问题中提炼出来的。
- 数据的存储结构:数据元素及其关系在计算机存储器中的存储表示,也称为数据的物理结构。
- 数据的运算:施加在数据上的操作。
逻辑结构:
数据的逻辑结构与数据的存储无关,是独立于计算机的,因此数据的逻辑结构可以看作是从具体问题中抽象出来的数学模型。
表示方式:
- 图表表示:采用表格或者图形直接描述数据的逻辑关系
- 二元组表示:B=(D,R),B是一种数据逻辑结构,由数据元素的集合D以及D上二元关系的集合R所组成。
D={d i | 1≤i≤n,n≥0};
R={r j | 1≤j≤m,m≥0};
若D是空集,那么B也就无结构可言,有时把这种状况认为是具有任意结构。
若R是空集,那么D中的数据元素间不存在任何逻辑关系,彼此是独立的。
R中的一个关系r是序偶的集合<x,y>(x,y∈D),表示x和y之间是相邻的,
x称为该序偶的第一元素,y称为该序偶的第二元素,x为y的直接前驱元素,y为x的直接后继元素。
若某个元素没有前驱元素,那么称该元素为开始元素,若某个元素没有后继元素,那么称该元素为终端元素。
类型:
- 集合
- 线性结构 线性表
- 树形结构 二叉树
- 图形结构
图形结构和树形结构统称为非线性结构。
线性结构是树形结构的特殊情况,树形结构是图形结构的特殊情况。
存储结构:
数据的逻辑结构在计算存储器中的存储表示称为数据的存储结构,也称为映像,也就是逻辑结构在计算机中的存储实现。
类型:
- 顺序存储结构:将数据的逻辑结构直接映射到存储结构。
优点:存储效率高,元素间的逻辑结构不占据额外的存储空间;可以实现对数据的随机存取。
缺点:不便于数据修改,对元素的插入或删除操作可能需要移动一系列的元素。
数组名称作为数组的起始地址,用于唯一标识该存储结构。
- 链式存储结构:每个逻辑元素占用一个内存结点存储,每个结点是单独分配的,所有的结点地址不一定是连续的,无需占用一整块存储空间,为表示元素之间的逻辑关系,给每个结点附加指针域,用于存放相邻结点的存储地址,通过指针域将所有的结点链接起来。
优点:便于数据修改,数据的插入删除仅需要修改相应结点的指针域。
缺点:由于分配给元素的存储单元有一部分用来存储结点之间的逻辑关系,存储空间的利用率低;由于逻辑上相邻的元素在存储空间上不一定相邻,不能进行随机存取。
- 索引存储结构:在存储数据元素信息的同时建立附加的索引表,存储所有的数据元素信息的表称为主数据表,其中每个数据元素有一个关键字和对应的存储地址。
索引表中的每一项称为索引项,索引项的一般形式为“关键字,地址”,其中关键字唯一标识一个元素,地址对应的是该关键字在主数据表中的存储地址,通常,索引表中的所有索引项是按关键字有序排列。
优点:查找效率高。
缺点:需要建立索引表,增加了空间开销。
- 哈希存储结构:根据元素的关键字通过哈希函数直接计算出一个值,将该值作为该元素的存储地址。
与前三种存储方式不同的是哈希存储结构只存储元素的数据,不存储元素之间的逻辑关系。
一般适合要求对数据能够进行快速查找和插入的场合。
优点:查找速度快
数据运算:
对数据实施的操作。
类型:
- 检索
- 插入
- 删除
- 更新
- 排序
数据运算分为运算定义和运算实现两个层面。
- 运算定义是运算功能的描述,抽象的,是基于逻辑结构的。
- 运算实现是程序员完成运算的实现算法,具体的,是基于存储结构的。
数据类型:
是一组性质相同的值的集合和定义在此集合上的一组操作的总称,是某种程序设计语言已经实现的数据结构
分类:
- 原子类型:不可再分解的基本类型。
- 结构类型:由若干数据类型组合而成的,可以再分解的。 数组、结构体
抽象数据类型ADT:
指用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。
抽象数据类型中的数据对象和数据运算与数据对象的表示和数据运算的实现相互分离。
表示:
(D,S,P);D表示数据对象,S是D上的关系集,P是D中数据运算的基本运算集。
基本运算中有两种参数,值参数只为运算提供输入值,引用参数用&开头,还将返回运算结果。
特征:
- 数据抽象:用ADT 描述程序处理的实体时强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口。
- 数据封装:将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。
算法:
对特定问题求解步骤的一种描述,是指令的有限序列。一条指令表示计算机的一个或多个操作。
特性:
- 有穷性
- 确定性
- 可行性
- 有输入
- 有输出
算法设计的目标:
- 正确性
- 可使用性
- 可读性
- 健壮性
- 高效率和低存储量需求(效率和存储量与问题的规模有关)
时间复杂度:
一个算法是由控制程序(顺序、分支、循环)和原操作(指固有数据类型的操作)构成。
T(n)=O(f(n))
也称为渐进时间复杂度,它表示随问题规模的增大,算法执行时间的增长率和f(n)的增长率相同。
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
空间复杂度:
对一个算法在运行过程中临时占用的存储空间大小的度量。
S(n)=O(g(n))