数据结构--绪论
1.1数据结构的研究内容
数据结构主要研究非数值计算问题,非数值计算问题无法用到数学方程建立数学模型
1.2 基本概念和术语
1.21 数据、数据元素、数据项和数据对象
- 数据:数据是客观事物的符号表示,是所有能够输入到计算机并被计算机程序处理的符号的总称。
- 数据元素: 数据元素是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也被称为元素、记录等数据元素用于完整地描述一个对象,比如一名学号记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。
- 数据项:组成数据元素的、有独立含义的、不可分割的最小单位。比如,学生基本信息表中的学号,姓名,性别等都是数据项。
- 数据对象:**性质相同的数据元素的集合,是数据的子集。**比如,正数数据对象是集合N={0,±1,±2,±3…},也可以看成一个表的一列,比如学生表中学号的所有集合。
1.2.2 数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。分为逻辑结构和存储结构两个层次。
1逻辑结构
数据的逻辑结构是从逻辑关系上描述数据,它和数据的存储无关,是独立于计算机的。因此,数据的逻辑结构可以看做从具体问题丑偶像出来的数学模型。
数据的逻辑结构分为两个要素:一是数据元素,二是关系。根据数据元素之间的关系不同特征,通常有四类基本结构:
- 集合结构 :数据元素之间除了“属于同一集合”的关系外,别无其他关系。
- 线性结构:数据元素之间存在一对一的关系。
- 树结构:数据元素之间存在一对多的关系。
- 图结构或网状结构:数据元素之间存在多对多的关系。
逻辑结构主要分为:线性结构和非线性结构
2.存储结构
- 顺序存储结构:顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。
- 链式存储结构:顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。但是为了表示结点之间关系,需要给每个结点附加指针字段,用于存储后继元素的存储地址。通常借助程序设计语言的指针类型来描述。
数据类型和抽象数据类型
1数据类型
数据类型是高级程序设计语言中的一个概念,数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
2.抽象数据类型
抽象数据类型一般是指用户自定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。
抽象数据类型定义格式:
ADT 抽象数据类型名{
数据对象:<数据对象的集合>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中,数据对象和数据的定义采用数学符号和自然语言描述,基本操作的定义如下:
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以“&”打头。除可提供输入值外,还将返回操作结果。“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若初始条件为空,则省略。“操作结果”说明了操作正常完成以后,数据结构的变化状况和应返回的结果。
1.3 抽象数据类型的表示和实现
1.4算法和算法分析
1.4.1 算法的定义及特性
算法 (Algorithm) 是为了解决某类问题而规定的一个有限长的操作序列。
一个算法必须满足以下五个重要特性。
(1)有穷性。一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
(2) 确定性。对千每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
(3) 可行性。算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
(4) 输入。一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
(5) 输出。一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。
(自认为算法就是一个解决想要实现功能的函数)
1.4.2评价算法优劣的基本标准
(1)正确性。在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
(2) 可读性。一个好的算法,首先应便千人们理解和相互交流 , 其次才是机器可执行性。可读性强的算法有助于人们对算法的理解,而难懂的算法易千隐藏错误,且难千调试和修改。
(3) 健壮性。当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
(4) 高效性。高效性包括时间和空间两个方面。时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度是衡量算法的两个主要指标。
1.4.3 算法的时间复杂度
衡亮算法效率的方法主要有两类:事后统计一法和事前分析估算法。我们通常采用事前分析估算法,通过计算算法的渐近复杂度来衡量算法的效率。
1. 问题规模和语句频度
问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。
一个算法的执行时间大致上等千其所有语句执行时间的总和, 而语句的执行时间则为该条语句的重复执行次数 和执行一次所需时间的乘积。
一条语句的重复执行次数称作语句频度(FrequencyCount)。
2. 算法的时间复杂度定义
一般情况下, 算法中基本语句重复执行的次数是问题规模n的某个函数f(n), 算法的时间量度 记作
T(n) = O(f(n))
它 表示随问题规模n的增大, 算法执行时间的增长率 和 f(n)的增长率相同, 称做算法的渐近时间复杂度, 简称时间复杂度(TimeComplexity)。
数学符号"O" 的严格定义为:
若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n) = O(f(n)) 表示存在正的常数C和n0,使得当n>=n0。时都满足O<=T(n)<=Cf(n)。该定义说明了函数T(n)和j(n)具有相同的增长趋势,并且T(n)的增长至多趋向于函数f(n)的增长。符号"O"用来描述增长率的上限,它表示当问题规模n>n。时,算法的执行时间不会超过f(n),其直观的含义如图1.6所示。
3. 算法的时间复杂度分析举例
当时间复杂度结算为指数的时候,复杂度就看最高次幂O(n^k),其他计算时间复杂度要根据实际情况,计算语句频度
4. 最好、最坏和平均时间复杂度
称算法在最好情况下的时间复杂度为最好时间复杂度,指的是算法计算量可能达到的最小值;
称算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值;
算法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。
1.4.4 算法的空间复杂度
关千算法的存储空间需求,类似千算法的时间复杂度,我们采用渐近空间复杂度(SpaceComplexity)作为算法所需存储空间的扯度,简称空间复杂度,它也是问题规模n的函数,
记作:
S(n) = O(f (n))
一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、 常数、 变量和输入数据外,还需要一些对数据进行操作的辅助存储空间。
比较空间复杂度时,主要比较辅助空间的大小,比如:有一个算法中间使用了一个变量,另一个空间使用了一个为n个的数组,则空间复杂度分别是s(1)和s(n).