1 数据结构基本概念
1.1 掌握数据、数据元素、数据项之间的关系
数据(Data) 数据是对客观事物的符号表示,是计算机中能输入、输出并进行操作的信息的载体。数据可以是数字、文字、图形等形式。
数据元素(Data Element) 数据元素是数据的最小单位,在计算机中通常是一个数据项。一个数据元素可以由一个或多个数据项组成。
数据项(Data Item) 数据项是构成数据元素的基本单位,它是数据的不可分割的最小单位。数据项可以是一个单一的值,也可以是多个值的组合
yaml
数据
|
_______|______
| |
数据元素 数据元素
| | | | |
数据项 数据项 数据项 数据项
1.2 掌握数据结构的定义
是指相互之间存在一种或多种特定关系的数据元素的集合,以及定义在这个集合上的一组操作。
1.3 掌握数据结构的三要素
数据结构的三要素是指数据的逻辑结构、数据的存储结构和对数据的操作。下面详细解释这三要素:
数据的逻辑结构 : 描述数据元素之间的逻辑关系,包括线性结构、树形结构、图形结构等。++逻辑结构关注的是数据元素之间的相对位置关系,而不考虑在计算机内部的实际存储情况++。
数据的存储结构 : 描述++数据元素在计算机内部的存储方式++ ,包括顺序存储结构和链式存储结构等。存储结构关注的是数据元素在计算机内部的++物理存储组织形式++。
对数据的操作 : 描述在++数据上能够进行的操作++,包括插入、删除、查找等。这些操作定义了对数据进行的一系列操作集合,也称为数据的运算。
1.4 掌握数据类型、抽象数据类型和数据结构之间的关系
-
数据类型(Data Type) : 数据类型是++一组值的集合和定义在这组值上的一组操作++。它定义了数据的性质以及对该类数据进行的操作。数据类型可以是原始数据类型(如整数、浮点数、字符等),也可以是用户自定义的数据类型。
-
抽象数据类型(Abstract Data Type,ADT) : 抽象数据类型是++指一个数学模型以及定义在该模型上的一组操作++ 。它关注的是数据的逻辑结构和操作,而++不关心具体的实现方式++。ADT 提供了一种抽象的视角,使用户可以通过接口而非实现的方式来使用数据。
-
数据结构(Data Structure) : 数据结构是指在++计算机中组织和存储数据的方式++,包括数据的逻辑结构和存储结构。数据结构实际上是对数据在计算机内存中的组织形式进行了物理上的定义和描述。
关系如下:
数据类型和数据结构: 数据结构是在数据类型的基础上进行的,++数据结构定义了数据在计算机内部的存储方式,可以看作是数据类型的实现++。
抽象数据类型和数据结构: 抽象数据类型提供了对数据的抽象描述,++而数据结构则是在这种抽象基础上进行具体的实现++。ADT 主要关注逻辑结构和操作,而数据结构关注存储结构。
总体来说,数据类型是一种抽象概念,抽象数据类型提供了对数据的抽象描述,而数据结构是在这些抽象的基础上进行实际的物理存储和操作的具体实现。在程序设计中,数据类型和抽象数据类型的选择会影响到程序的设计和实现,而数据结构则负责具体的数据组织和操作实现。
2 算法分析
23-24学年我校数据结构与算法Ⅲ的期末试卷考察了算法分析的含义,且在设计题里需要利用数学归纳法证明大O表示法。
2.1 了解衡量算法在资源上的两个方面
在算法分析中,我们通常关注算法在资源上的两个主要方面:时间复杂度和空间复杂度。这两个方面用于衡量算法在执行过程中对计算机资源的利用情况。
-
时间复杂度(Time Complexity): 时间复杂度是衡量算法运行时间长短的度量,它表示算法执行所需的时间与问题规模之间的关系。通常以大 O 记法(O(n))表示,其中 n 代表输入数据的规模。时间复杂度描述的是算法运行时间的增长趋势,即随着输入规模的增大,算法运行时间如何增长。
常见的时间复杂度包括:
- O(1): 常数时间复杂度,表示算法的执行时间是固定的,不随输入规模变化。
- O(log n): 对数时间复杂度,通常出现在++分治算法或二分查找等对问题规模进行对半缩小的情况。++
- O(n): 线性时间复杂度,算法的执行时间与输入规模成线性关系。
- O(n^2): 平方时间复杂度,通常出现在++嵌套循环++的算法中。
-
空间复杂度(Space Complexity): 空间复杂度是衡量算法在执行过程中对计算机内存空间的利用情况。它表示算法所需的额外空间与输入规模之间的关系。同样以大 O 记法表示。
常见的空间复杂度包括:
- O(1): 常数空间复杂度,表示算法的额外空间占用是固定的,不随输入规模变化。
- O(n): 线性空间复杂度,额外空间占用与输入规模成线性关系。
- O(n^2): 平方空间复杂度,额外空间占用与输入规模的平方成正比。
在实际分析中,我们++通常关注最坏情况下的时间复杂度和空间复杂度++,因为它们能够给出算法执行所需资源的上限。理论上,时间和空间复杂度越低,算法越高效。然而,在实际应用中,有时需要权衡时间和空间,选择适当的算法来满足特定的需求。
2.2 掌握O标记法,理解大O标记法的意义
大 O 标记法是一种用于描述算法时间复杂度的表示方法,它表示算法执行时间随着输入规模的增大而变化的上限。具体而言,大 O 标记法描述的是算法的渐近复杂度(asymptotic complexity)。
在大 O 标记法中,我们用 O(f(n)) 来表示一个算法的时间复杂度,其中 f(n) 是关于输入规模 n 的一个函数。O(f(n)) 表示的是算法执行时间的上限,即最坏情况下的时间复杂度。大 O 表示法主要关注随着输入规模 n 的增长,算法执行时间的增长趋势。
一些常见的大 O 复杂度:
- O(1): 常数时间复杂度,表示算法的执行时间是常数,与输入规模无关。
- O(log n): 对数时间复杂度,通常出现在分治算法或二分查找等对问题规模进行对半缩小的情况。
- O(n): 线性时间复杂度,算法的执行时间与输入规模成线性关系。
- O(n^2): 平方时间复杂度,通常出现在嵌套循环的算法中。
2.3 掌握Ω标记法,理解大Ω标记法的意义
大Ω标记法(Omega Notation)是一种用于描述算法的渐近下界的符号表示方法。与大O标记法类似,大Ω标记法描述的是算法执行时间的增长趋势,但它关注的是最低界限,即算法在最好情况下的执行时间。
具体而言,如果一个算法在输入规模为n时,在最好情况下的执行时间以Ω(f(n))形式表示,其中f(n)是一个函数,那么这表示在足够大的n时,算法的执行时间至少以f(n)的速度增长。
大Ω标记法的意义在于提供了一个对算法在最好情况下性能的一种衡量方式。通过使用大Ω标记法,我们可以了解算法在最好情况下的性能表现,并更好地理解算法在不同输入情况下的行为。
举个例子,如果一个算法在最好情况下的执行时间是Ω(n),那么这表示在最理想的情况下,算法的执行时间至少以线性的速度增长。在实际应用中,我们不仅关注算法在最坏情况下的性能,还关注在最好情况下的性能,因为这有助于更全面地评估算法的优劣。
需要注意的是,大Ω标记法并不总是提供和大O标记法相同的简便性。在实际使用中,我们通常更关注大O标记法,因为它提供了算法的上界,而对于最好情况下的性能,我们可能更关注实际的执行情况。
2.4 掌握Θ标记法,理解大Θ标记法的意义
大Θ标记法(Theta Notation)是一种用于描述算法的紧确界限的符号表示方法。与大O标记法和大Ω标记法不同,大Θ标记法同时表示算法的上界和下界,它给出了算法运行时间的确切增长情况。
具体而言,如果一个算法在输入规模为n时,在最坏情况下的执行时间以Θ(f(n))形式表示,其中f(n)是一个函数,那么这表示在足够大的n时,算法的执行时间以f(n)的速度增长,并且存在正常数c₁和c₂,使得对于足够大的n,c₁ * f(n) <= T(n) <= c₂ * f(n)。
简而言之,大Θ标记法提供了对算法运行时间增长的紧确界限,即算法的运行时间在上界和下界之间。
举个例子,如果一个算法在最坏情况下的执行时间是Θ(n),那么这表示在足够大的n时,算法的执行时间以线性的速度增长,同时存在常数c₁和c₂,使得 c₁ * n <= T(n) <= c₂ * n。
大Θ标记法对于表示算法的平均性能是很有用的,因为它同时提供了上界和下界,给出了算法执行时间的紧确范围。然而,在实际使用中,大O标记法更为常见,因为它通常足够描述算法的性能特征,而且更容易计算。
2.5 了解时空权衡原则
时空权衡原则是在算法和数据结构设计中经常遇到的一个原则,它强调了在时间复杂度和空间复杂度之间需要做出权衡的概念。该原则指出,在提高算法执行速度的同时,可能会增加空间使用,反之亦然。通常来说,为了达到更好的性能,我们需要在时间和空间之间做出合理的权衡。
一些常见的时空权衡的例子包括:
-
缓存(Caching): 使用缓存可以显著提高某些操作的执行速度。但是,缓存需要占用额外的内存空间,因此需要权衡是否使用更多的内存以换取更快的执行速度。
-
索引结构(Indexing Structures): 在数据库或搜索引擎中,使用索引结构可以加速数据的检索操作。然而,建立索引会占用额外的存储空间,而且维护索引也可能增加更新操作的时间复杂度。
-
压缩算法(Compression Algorithms): 压缩算法可以减小数据的存储空间,但在访问数据时可能需要更多的时间来解压缩。这是一种时空权衡,需要根据具体的应用场景来选择合适的压缩算法。
-
动态规划中的表格存储: 在动态规划算法中,为了避免重复计算,我们通常使用表格来存储已经计算过的中间结果。这会占用额外的空间,但可以在一定程度上提高算法的执行速度。
在设计算法和数据结构时,根据实际需求和问题特性,选择合适的时空权衡策略是非常重要的。在某些情况下,更注重时间性能可能更为关键,而在其他情况下,节省空间可能更为重要。因此,时空权衡原则提醒我们要在时间和空间之间找到一个平衡,以满足实际应用的需求。