----此内容基于课堂笔记
数据结构(C语言版) Data Structure
什么是程序、软件?
N.沃思(Niklaus Wirth)教授提出:程序=算法 + 数据结构
以上公式说明了两个问题:
(1)算法建立在数据结构的基础上。(2)选择合理的数据结构可有效地改进算法的效率。
电子计算机的主要用途:
早期:
主要用于数值计算。
后来:
处理逐渐扩大到非数值计算领域(能处理多种复杂的具有一定结构关系的数据)。
主要用于数值计算。
后来:
处理逐渐扩大到非数值计算领域(能处理多种复杂的具有一定结构关系的数据)。
用计算机解决一个具体问题的一般步骤:
(1)从具体问题抽象出适当的数学模型。
(2)设计求解数学模型的算法。
(3)编制程序、运行并调试程序,直到解决实际问题。
(2)设计求解数学模型的算法。
(3)编制程序、运行并调试程序,直到解决实际问题。
数值计算:
关键是如何得出数学模型(方程)。因此,程序
设计人员比较关注程序设计的技巧。
设计人员比较关注程序设计的技巧。
非数值计算:
在非数值计算的问题中,数据往往不具有值的概
念,数据元素之间的相互关系一般无法用数学方程加
以描述。
念,数据元素之间的相互关系一般无法用数学方程加
以描述。
求解非数值计算的问题:
主要考虑的是设计出合适的数据结构及相应的算
法。即:首先要考虑对相关的各种信息如何表示、组织、存储?
法。即:首先要考虑对相关的各种信息如何表示、组织、存储?
因此,可以认为:数据结构是一门研究非数值计算
程序设计问题中计算机的操作对象以及它们之间的关系
和操作的学科。
程序设计问题中计算机的操作对象以及它们之间的关系
和操作的学科。
什么是数据结构
几个概念
数据(Data):
是对信息的一种符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素(Data Element):
是数据的基本单位,通常作为整体进行考虑和处理。数据元素也称结点(node)或记录(record)。
数据项(data item):
独立含义的数据的不可分割的最小单位。 数据项也称域
(field)。
数据对象( Data Object ) :
数据类型:
在一种程序设计语言中,变量所具有的数据种类
例如: C语言中数据类型:基本类型和构造类型
基本类型:整型int 、浮点型float 、字符型char 、枚举型;
构造类型: 数组、结构、联合、指针、空(void)类型等。
可用typedef自定义数据类型。
基本类型:整型int 、浮点型float 、字符型char 、枚举型;
构造类型: 数组、结构、联合、指针、空(void)类型等。
可用typedef自定义数据类型。
抽象数据类型 (Abstract Data Type):
数据的抽象:
计算机中使用的是二进制数,汇编语言中则可给出各种
数据的十进制表示,如98.65、 9.6E3等,它们是二进制数据
的抽象;使用者在编程时可以直接使用, 不必考虑实现细节。
在高级语言中,则给出更高一级的数据抽象,出现了数
据类型, 如整型、 实型、字符型等。
到抽象数据类型出现,可以进一步定义更高级的数据抽
象,如各种表、队、栈、树、图、窗口、管理器等,这种数
据抽象的层次为设计者提供了更有利的手段,使得设计者可
以从抽象的概念出发,从整体考虑,然后自顶向下、逐步展
开,最后得到所需结果。
抽象数据类型:
抽象数据类型(简称ADT)是指基于一类逻辑关系的数据类型以及定义在这个类型之上的一组操作。
抽象数据类型两个重要特征:
数据抽象
用ADT描述程序处理的实体时,强调的是其本质的特征、
其所能完成的功能以及它和外部用户的接口(即外界使用它
的方法)。
用户隐藏其内部实现细节。
其所能完成的功能以及它和外部用户的接口(即外界使用它
的方法)。
数据封装:
将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。
抽象数据类型可用(D,S,P)三元组表示。
其中:
D是数据对象。
S是D上的关系集。
P是对D的基本操作集。
ADT 抽象数据类型名{
数据对象: <数据对象的定义>
数据关系: <结构关系的定义>
基本操作: <基本操作的定义>
}ADT 抽象数据类型名
其中, 数据对象、数据关系用伪码描述;
其中:
D是数据对象。
S是D上的关系集。
P是对D的基本操作集。
ADT 抽象数据类型名{
数据对象: <数据对象的定义>
数据关系: <结构关系的定义>
基本操作: <基本操作的定义>
}ADT 抽象数据类型名
其中, 数据对象、数据关系用伪码描述;
数据结构三个方面的含义:
逻辑结构:
数据元素间抽象化的相互关系(简称为数据的结构)。与
数据的存储无关,独立于计算机,它是从具体问题抽象出来的
数学模型。
存储结构(物理结构):
数据元素及其关系在计算机存储器中的存储方式。是逻辑
结构用计算机语言的实现,它依赖于计算机语言
结构用计算机语言的实现,它依赖于计算机语言
算法(运算)
是对数据加工过程的描述。
数据的逻辑结构
逻辑结构分类
根据数据元素之间关系的不同特性,可分为 4 类基本结构集合
结构中的数据元素除了同属于一种类型外,别无其它关系
线性结构:
结构中的数据元素之间存在一对一的关系
树型结构
结构中的数据元素之间存在一对多的关系
图状结构或网状结构
结构中的数据元素之间存在多对多的关系
数据的存储结构
存储结构分类
顺序存储(顺序结构)
链接存储(链式存储结构)
链接存储包含两方面:
数据域:数据元素自身值的表示。
链域:该结点与其它结点之间关系的表示。
数据域:数据元素自身值的表示。
链域:该结点与其它结点之间关系的表示。
索引存储
散列存储
算法和算法分析
算法(Algorithm):
是描述计算机解决指定问题的操作过程及解题方法和步骤,是由若干条指令组成的有穷序列。
算法的特性:
有穷性:
执行了有限条指令后一定要终止。
确定性:
算法的每一步操作都必须有确切定义,不得有
任何歧义性。
可行性:
算法的每一步操作都必须是可行的,即每步操
作均能在有限时间内完成。
执行了有限条指令后一定要终止。
确定性:
算法的每一步操作都必须有确切定义,不得有
任何歧义性。
可行性:
算法的每一步操作都必须是可行的,即每步操
作均能在有限时间内完成。
算法与程序区别
一个算法必须在有穷步之后结束;一个程序不一定满足有穷性。
例如:操作系统,只要整个系统不遭破坏,将永远不
会停止,即使没有作业需要处理,它仍处于动态等待中。
因此,操作系统不是一个算法。
程序中的指令必须是机器可执行的,而算法中的指令则无此限制。
算法代表了对问题的求解过程,而程序则是算法在计算机上的实现。算法用特定的程序设计语言来描述,就成了程序。
算法与数据结构相辅相成。
例如:操作系统,只要整个系统不遭破坏,将永远不
会停止,即使没有作业需要处理,它仍处于动态等待中。
因此,操作系统不是一个算法。
程序中的指令必须是机器可执行的,而算法中的指令则无此限制。
算法代表了对问题的求解过程,而程序则是算法在计算机上的实现。算法用特定的程序设计语言来描述,就成了程序。
算法与数据结构相辅相成。
算法的描述和实现
描述:
可采用自然语言、数学语言或约定的符号语言。
实现:
必须借助程序设计语言提供的数据类型及其运算。
可采用自然语言、数学语言或约定的符号语言。
实现:
必须借助程序设计语言提供的数据类型及其运算。
一个好算法应达到的目标
正确性:算法应能满足设定的功能和要求 。
可读性:思路清晰、层次分明、易读易懂 。
健壮性:输入非法数据应能作适当的反应和处理。
高效性:执行同一问题时时间越短,算法的效率就越高。 低存储量:完成同一功能,占用存储空间应尽可能少 。
可读性:思路清晰、层次分明、易读易懂 。
健壮性:输入非法数据应能作适当的反应和处理。
高效性:执行同一问题时时间越短,算法的效率就越高。 低存储量:完成同一功能,占用存储空间应尽可能少 。
算法效率评价
用时间复杂度和空间复杂度评价算法的效率。
时间复杂度(Time Complexity)
算法中包含简单操作次数的多少叫做算法的时间复杂度。
当算法比较复杂时,其时间复杂度的计算会变得相当困难。
实际上,没有必要精确地计算出算法的时间复杂度,只要大致计算出相应的数量级(Order)即可。
时间复杂度表示方法:
用 f(n) 表示算法中基本操作重复执行的次数,它是规模 n 的某个函数。
算法时间复杂度 T(n) 可记作:
T(n)=O( f(n) )
其中:
O( f(n) )表示取函数 f(n) 的数量级。
O表示T(n) 与f(n)只相差一个常数倍。
它表示随着问题规模 n 的增大,算法执行时间的增
长率和f(n)的增长率属于同一数量级。
即算法执行时间随 f(n)的增长而增长。
数据结构中常用的数量级有 7 个:
O(1) 常数阶O(n) 线性阶
O(n2) 平方阶
O(n3) 立方阶
O(2n) 指数阶
O(log2n) 对数阶
O(nlog2n) 二维阶
O(1)< O(log2n)< O(n)< O(nlog2n)< O(n2)< (n3) …… <O(2n)
一般情况下,随着 n 的增大,T(n)增长较慢的算法为最优的算法。
应尽量选择使用多项式阶 O(nk)的算法, 而避免使用指数阶的算法。
应尽量选择使用多项式阶 O(nk)的算法, 而避免使用指数阶的算法。
空间复杂度(Space Complexity)
空间复杂度是指程序运行从开始到结束所需要的存储空间。
类似于算法的时间复杂度,把算法所需存储空间的度量记作:
S(n)=O( f(n) ) (其中 n 为问题的规模)
一个程序上机执行时,除了需要存储空间来存放本身所用的指令、常数、变量和输入数据以外,还需要一些对数据进行操作的工作单元和实现算法所必需的辅助空间。在进行时间复杂度分析时,如果所占空间量依赖于特定的输入,一般都按最坏情况来分析。
占空间。
类似于算法的时间复杂度,把算法所需存储空间的度量记作:
S(n)=O( f(n) ) (其中 n 为问题的规模)
一个程序上机执行时,除了需要存储空间来存放本身所用的指令、常数、变量和输入数据以外,还需要一些对数据进行操作的工作单元和实现算法所必需的辅助空间。在进行时间复杂度分析时,如果所占空间量依赖于特定的输入,一般都按最坏情况来分析。
存储空间的固定部分:
程序指令代码的空间,常数、简单变量、定长成分(如数组元素、结构成分、对象的数据成员等) 变量所占空间。
存储空间的可变部分:
尺寸与实例特性有关的成分变量所占空间、引用变量所占空间、 递归栈所用空间、 通过new和delete命令
动态使用空间。
总结
(1)数据结构就是研究数据的逻辑结构、存储结构和运算方法的学科。
(2)数据的逻辑结构包括:集合、线性结构、树形结构、图形结构四种类型。
(3)集合中不存在数据之间的关系;线性结构元素之间存在一对一的关系;树形结构元素之间存在一对多的关系;图形结构元素之间存在多对多的关系。具有一对多和多对多关系的结构又称为非线性结构。
(4)数据的存储结构包括:顺序存储、链式存储、索引存储、散列存储四种。
(5)顺序存储可以采用一维数组来存储;链式存储可以采用链表结构来存储;索引存储则在原有存储数据结构的基础上,附加建立一个索引表来实现,主要作用是为了提高数据的检索速度;而散列存储则是通过构造散列函数来确定数据存储地址或查找地址的。
(6)算法是对特定问题求解步骤的一种描述,是指令的有限序列。算法具有:有穷性、确定性、正确性、输入、输出等特性。
(7)一个好的算法应该达到:正确性、可读性、健壮性、高效性和低存储量等目标。
(2)数据的逻辑结构包括:集合、线性结构、树形结构、图形结构四种类型。
(3)集合中不存在数据之间的关系;线性结构元素之间存在一对一的关系;树形结构元素之间存在一对多的关系;图形结构元素之间存在多对多的关系。具有一对多和多对多关系的结构又称为非线性结构。
(4)数据的存储结构包括:顺序存储、链式存储、索引存储、散列存储四种。
(5)顺序存储可以采用一维数组来存储;链式存储可以采用链表结构来存储;索引存储则在原有存储数据结构的基础上,附加建立一个索引表来实现,主要作用是为了提高数据的检索速度;而散列存储则是通过构造散列函数来确定数据存储地址或查找地址的。
(6)算法是对特定问题求解步骤的一种描述,是指令的有限序列。算法具有:有穷性、确定性、正确性、输入、输出等特性。
(7)一个好的算法应该达到:正确性、可读性、健壮性、高效性和低存储量等目标。