第一章绪论
1.1 什么是数据结构
数据结构是一门研究非数值计算的程序设计问题中,计算机的操作对象以及他们之间的关系和操作的学科。
面向过程程序=数据结构+算法
数据结构是介于数学、计算机硬件、计算机软件三者之间的一门核心课程。
数据结构是程序设计、编译、数据库、操作系统的基础。
1.2 基本概念和术语
数据 data:对客观事物的符号表示,在计算机中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据对象 data object:性质相同的数据元素的集合,是数据的一个子集。
数据元素 data element:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
一个数据元素可以由若干个数据项(data item)组成,数据项是不可分割的最小单位。
数据结构 data structure:相互之间存在一种或多种特定关系的数据元素的集合。
数据元素相互之间的关系称为结构(structure)。
集合
线性结构 一对一
树形结构 一对多
图状结构/网状结构 多对多
数据结构的形式定义(逻辑结构):
数据结构是一个二元组
其中:D是数据元素的有限集,S是D上关系的有限集。
物理结构/存储结构:数据结构在计算机中的表示(映像),包括数据元素的表示和关系的表示。
数据元素 <--> 元素(element)/结点(node)
数据项 <--> 数据域(data field)
数据元素之间的关系在计算机中有两种不同的表示方法:
顺序映像 --> 顺序存储结构 借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。
非顺序映像 --> 链式存储结构 借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。
逻辑结构 --> 算法设计
物理结构 --> 算法实现
数据类型 data type:是一个值的集合 和定义在这个值集上的一组操作的总称。
按值得类型,可将数据类型分为两类:
原子类型
结构类型
在某种意义上,数据结构可以看成是“一组具有相同结构的值”;
则结构类型可以看成由一种数据结构和定义在其上的一组操作组成。
软件系统的框架应建立在数据之上,而不是建立在操作之上。即,面向对象。
抽象数据类型 Abstract Data Type,简称ADT:是指一个数学模型以及定义在该模型上的一组操作。
|--值域:
|--原子类型 atomic data type 原子类型的变量值是不可分解的,如基本数据类型
|--固定聚合类型 fixed-aggregate data type 其值由确定数目的成分由某种结构组成,如复数
|--可变聚合类型:表、树、图 variable-aggregate data type 值的数目不确定
|--多形数据类型 ploymorphic data type 多型数据类型,就是泛型,如Triplet
|--操作
抽象数据类型可用以下三元组表示:
其中:D是数据对象,S是D上的关系集,P是对D的基本操纵。
基本操作有两种参数:
赋值参数--只为操作提供输入值;
引用参数--以&打头,为操作提供输入值,并且返回操作结果。
1.4 算法和算法分析
算法:有穷性、确定性、可行性、输入、输出
设计要求:正确性、可读性、健壮性、时间复杂度、空间复杂度
算法效率的度量:
一个特定算法的运行工作量的大小,只依赖于问题的规模n,即它是问题规模n的函数。
一个算法是由控制语句(顺序、选择、循环)和原操作(固有数据类型的操作)构成的,算法的时间取决于两者的综合效果。
最深层循环内的语句中的原操作
T(n) = O(f(n))
随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度(asymptotic time complexity),简称时间复杂度。
最坏情况下的时间复杂度。
常量阶
对数阶
线性阶
平方阶
指数阶
算法的存储空间需求:
空间复杂度(space complexity)
若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。