1.1 什么是数据结构
一、基本概念
1.数据:信息的载体,指能够被计算机识别、存取、处理以及计算机程序加工和处理的“原料”。(eg:字符串、图像、声音等)
2.数据项:具有独立含义的最小标识单位。(eg:字段、域、属性等)
3.数据元素:数据的基本单位。(一个数据元素可由多个数据项组成)
4.数据对象:性质相同的数据元素的集合,是数据的一个子集。(eg: 26个字母构成的字符集合)
5.数据结构:互相之间存在一种或多种特定关系的数据元素的集合。(即数据的组织形式)
二、数据结构的内涵
1. 数据的逻辑结构
(1)根据“数据元素之间关系的不同特性”,分为以下四类逻辑结构:
- 集合:集合的逻辑结构中所有数据元素“杂乱无章”的地聚集在一起,各数据元素之间没有联系;
- 线性结构:逻辑结构中的数据元素存在“一对一”的关系,各数据元素之间有严格的先后次序;
- 树形结构:逻辑结构中的数据元素存在“一对多”的关系,各数据元素之间有严格的层次关系;
- 图状结构:逻辑结构中的数据元素存在“多对多”的关系,各数据元素之间均可能存在相互联系。
(2)根据“数据元素之间结点的前后相邻关系”,分为以下两类逻辑结构:
- 线性结构:若线性结构是非空集,则有且仅有一个开始开始结点和一个终端结点,所有结点都最多只有一个直接前驱结点和一个直接后继结点。(eg: 线性表、栈、队列、串等都是线性结构)
- 非线性结构:一个结点可能有多个直接前驱和直接后继。(eg: 树、图等都是非线性结构)
2.数据的存储结构
(1)数据的存储结构(即物理结构):指数据在计算机中的存储表示,包括数据元素的表示和关系的表示。
(2)数据的存储结构,分为以下四种基本存储方法:
- 顺序存储: 把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点间的逻辑关系由“存储单元的邻接关系”来体现。
- 链接存储:不要求逻辑上相邻的结点在物理位置上也相邻,结点之间的逻辑关系由“附加的指针字段”表示。
- 索引存储:通常在存储结点信息的同时,建立附加的索引表。(索引表由多个索引项组成。若一组结点在索引表中只对应一个索引项,该索引表称为“稀疏索引”。若每个结点在索引表中都有一个索引项,则该索引表称为“稠密索引”)
- 散列存储:根据结点的关键字直接计算出该结点的存储地址。
三、数据类型和抽象数据类型
(1) 数据类型:指一个值的集合和定义在这个值的集合上的一组操作的总称。
按“值”的不同特性,在高级程序语言中可分为两种类型:
1.原子类型:原子类型的值不可分解。(eg:C语言中的整型、字符型、枚举型、指针类型、空类型等)
2.结构类型:结构类型的值是由若干个成分(结构成分或者非结构成分)按某种结构组成的,可以分解。(eg:数组的值由若干分量组成,每个分量可能是整数或者是数组)
(2)抽象数据类型(ADT):指一个数学模型以及定义在该模型上的一组操作。
抽象数据类型的定义仅取决于它的一组逻辑特性,无论计算机内部结构如何变化,只要它的数学特性不变,都不会影响其外部的使用。
抽象数据类型可表示为一个三元组(D,R,P),其中“D”表示“数据对象”,“R”是“D”上的关系集,“P”是对“D”的基本操作集。
1.2 算法和算法分析
一、算法的描述
1.算法:为了解决某一类问题而设计的一个有限长的操作序列。
2.一个算法必须满足以下5个重要特性:
- 有穷性:算法对于任意合法的输入值,在执行有限步之后一定能结束;
- 确定性:算法中的每一个操作必须有确切的含义,无二义性,并在任何条件下,算法都只有一条执行路径。
- 可行性:算法中的所有操作都可通过已经实现的基本运算有限次地实现。
- 输入:算法具有零个或多个输入,这些输入为一组特定的数据对象集合。
- 输出:算法具有一个或多个输出,它是一组与“输入”有确定关系的量值。
二、算法设计的要求
算法设计要注意算法的四个要求:“正确性”、“可读性”、“健壮性”、“时空效率”。
三、算法分析
(1) 时间复杂度:算法中每条语句的执行时间之和。由于每条语句的执行时间是该语句重复执行的次数或频率,与该语句执行时间的乘积,而语句的执行时间又与机器性能、编译程序等诸多因素有关,难以统一和确定。
一般而言,算法中基本操作的频率是问题规模n(eg:算法所处理的矩阵的阶数、线性表的长度)的某个函数f(n),“算法的时间量度”记作“T(n)=O(f(n))”,它表示随问题规模n的增大,算法的执行时间增长率与f(n)的增长率相同。
(2)空间复杂度:算法在执行时需要占用一定的存储空间,这些空间除了包括程序、输入数据、常数、变量所占的空间之外,还包括算法对输入数据进行运算以及为实现运算所需信息的额外空间。
算法的时间复杂度,一般以“空间复杂度”作为算法所需存储空间的量度,记作“S(n)=O(f(n))”,其中n表示问题的规模或者大小。