数据结构的基本概念和术语
数据、数据元素、数据项和数据对象
- 数据(Data) 是客观事物的符号表示,是所有能输入计算机中并被计算机程序处理的符号的总称。
- 数据元素(Data Element) 是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也成为元素、记录等。
- 数据项(Data Item) 是组成数据元素的、有独立含义的、不可分割的最小单位。
- 数据对象(Data Object) 是性质相同的数据元素的集合,是数据的一个子集。
数据结构
数据结构(Data Structure) 是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构包括逻辑结构和存储结构两个层次。
- 逻辑结构
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
数据的逻辑结构有两个要素:- 数据元素
- 关系——是指数据元素间的逻辑关系。
数据的逻辑结构通常有4类基本逻辑结构。
- 集合结构
数据元素之间除了“属于同一结合”的关系外,别无其它关系。 - 线性结构
数据元素之间存在一对一的关系。 - 树结构
数据元素之间存在一对多的关系。 - 图结构或网状结构
数据元素之间存在多对多的关系。
其中集合结构、树结构和图结构都属于非线性结构
线性结构包括线性表、栈、队列、字符串、数组、广义表。
- 存储结构
数据对象在计算机中的存储表示称为数据的存储结构,也成为物理结构。
数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构。-
顺序存储结构
顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系的,通常借助程序设计语言的数组类型来描述。
-
链式存储结构
顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无须占用一整块存储空间。但是为了表示节点之间的关系,需要给每个节点附加指针字段,用于存放后继元素的存储地址。所以链式存储结构通常借助程序设计语言的指针类型来描述。
-
数据类型和抽象数据类型
- 数据类型
数据类型(Data Type)是一个值的集合和定义在这个值集上的一组操作的总称。 - 抽象数据类型
抽象数据类型(Abstract Data Type,ADT)一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。具体包括3个部分:数据对象、数据对象上关系的结合以及对数据对象的基本操作的集合。
抽象数据类型的定义格式如下:
算法和算法分析
算法的定义及特性
算法(Algorithm)是为了解决某类问题而规定的一个有限长的操作序列。
一个算法必须满足以下5个重要特性。
- 有穷性。一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
- 确定性。对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,算法的执行者或阅读者都能明确其含义及如何执行。
- 可行性。算法中的所有操作都可以通过将已经实现的基本操作运算执行有限次来实现。
- 输入。一个算法有0个或多个输入。
- 输出。一个算法有一个或多个输出。
评价算法优劣的基本标准
一个算法的优劣应该从以下几个方面来评价。
- 正确性。在合理的数据输入下,好的算法能够在有限的运行时间内得到正确的结果。
- 可读性。一个好的算法,首先应便于人们理解和相互交流,其次才是机器可执行性。
- 健壮性。当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
- 高效性。包括时间和空间两个方面。
算法的时间复杂度
衡量算法效率的方法主要有两类:
- 事后统计法
- 事前分析估算法
我们通常采用事前分析估算法,通过计算算法的渐近复杂度来衡量算法的效率。
-
问题规模和语句频度
- 不考虑计算机的软硬件等环境因素,影响算法时间代价的最主要因素是问题规模。一般用整数n表示。
- 一条语句的重复执行次数称作语句频度(Frequency Count)。
-
算法的时间复杂度定义
一般情况下,算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n) = O(f(n))
它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度(Time Complexity)。
- 算法的时间复杂度分析举例
-
常量阶示例
-
线性阶示例
-
平方阶示例
-
立方阶示例
-
对数阶示例
-
常见的时间复杂度按数量级递增排序依次为:
常量阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n²)、······、k次方阶、指数阶O(2^n)
- 最好、最坏和平均时间复杂度
- 算法在最好情况下的时间复杂度为最好时间复杂度,是指算法计算量可能达到的最小值。
- 算法在最坏情况下的时间复杂度为最坏时间复杂度,是指算法计算量可能达到的最大值。
- 算法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。
算法的空间复杂度
关于算法的存储空间需求,我们采用渐近空间复杂度(Space Complexity)作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数,记作:
S(n) = O(f(n))
小结