数据结构的定义:
数据结构是指所有数据元素以及数据元素之间存在的关系,可以看作是相互之间存在某种关系的特殊集合。
数据结构通常包含几个方面:
- 数据的逻辑结构:由数据元素之间的逻辑关系构成。
- 数据的存储结构:数据元素及其关系在计算机存储器中的存储表示,也称为数据的物理结构。
- 数据的运算:施加在数据上的操作。
逻辑结构
1.逻辑结构的表示
- 图标表示:采用表格或者图形的方式直接描述数据的逻辑关系。
- 二元组表示:B=(D,R),其中B是一种数据逻辑结构,他由数据元素的集合D,以及D上二元关系集合R所组成。
2.逻辑结构的类型
- 集合:集合是指数据元素之间除了“同属一个集合”的关系以外别无其它关系。
- 线性结构:线性结构是指该结构中的数据元素之间存在一对一关系,其特点是开始元素和终端元素都是唯一的,除此之外的每个数据元素都有且仅有一个前驱节点,一个后继节点。如:线性表。
- 树形结构:树形结构是指该结构中的数据元素之间存在一对多的关系。其特点是除了开始元素以外,每个元素有且仅有一个前驱元素,除了终端元素之外,每个元素有一个或多个后继元素。如:二叉树。
存储结构
数据逻辑结构在计算存储器中的存储表示称为数据的存储结构(映像),也就是逻辑结构在计算机中的存储实现。
1.顺序存储结构
顺序存储结构是采用一组连续的存储单元存放所有的数据元素,即所有元素在存储器中占有一整块存储空间。
优点:存储效率高,原因:分配给元素的存储单元全部用来存储元素,元素之间的逻辑关系没有占用额外的存储空间,另外可实现对元素的随机存取。
缺点:不便于数据的修改,对数据的插入删除操作可能需要移动一系列的元素。
2.链式存储结构
在链式存储中,每个逻辑元素用一个内存节点存储,每个节点是单独分配的,所有的节点地址不一定连续,所以无需占用一整块存储空间。
为了表示数据之间的逻辑关系,给每个节点添加附加指针域,用于存放相邻节点的存储地址,即通过指针域将所有节点链接起来。
优点:便于数据的修改,在对数据进行插入和删除操作时仅需修改相应节点的指针域,不必移动节点。
缺点:空间利用率低,即分配给元素的存储单元有一部分被用来存储元素之间的逻辑关系,另因逻辑上相邻的元素在存储空间中不一定相邻,所以不能对元素进行随机存取。
3.索引存储结构
索引存储结构是指在存储数据元素的同时还建立附加的索引表吗,存储所有数据元素信息的表称为主数据表,其中的每一个数据元素还有一个关键字和对印的存储地址。
索引表中的每一项称为索引项,索引项的一般形式为“关键字,地址”,其中“关键字”唯一标识一个元素,“地址”对应该关键字的元素在地址表中的存储地址。通常索引表中的所有索引项都是按关键字有序排列的。
在按关键字查找时,首先在索引表中利用关键字的有序性快速查找该关键字的地址,然后通过该地址在主数据表中找到对应的元素。
优点:查找效率高。
缺点:需要建立索引表,增加了空间开销。
4.哈希(散列)存储结构
其基本思想是根据元素的关键字通过哈希函数计算出一个值,并将这个值作为该元素的存储地址。
优点:查找速度快,只要给出待查元素的关键字就可立即计算出该元素的地址。
与前三种不同的是:哈希存储方法只存储元素的数据,不存储元素之间的逻辑关系。
哈希存储一般只适合要求对数据进行快速查找和插入的场合。
数据类型和抽象数据类型
数据类型
数据类型是一组性质相同的值的集合和定义在集合上的一组操作的总称,是某种程序语言中已经实现的数据结构。
抽象数据类型
抽象数据类型(ADT)指的是用户在进行软件系统设计问题时,从问题的数据模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。
抽象数据类型中的数据对象和数据运算的声明和实现相互分离。
算法的定义
算法是对特定问题求解步骤的一种描述,他是指令的有限序列。
算法分析
算法分析就是分析算法占用计算机资源的多少,而计算机资源主要是CPU时间和内存空间,分析算法占用CPU时间多少称为时间性能分析,分析算法占用内存空间的多少称为空间性能分析。
算法时间性能分析
事后统计法:编写算法对应程序,统计其执行时间。 事前估算法:撇开与计算机,软件有关因素,仅考虑算法本身效率的高低,可以认为一个特定算法的“运行工作量大小”只依赖于问题的规模,也可以说算法的执行时间时问题规模的函数,因此主要采用事前估计法来分析算法的时间性能。
算法的时间复杂度
算法的时间复杂度表示随问题规模n的增大,算法执行时间的增长率和函数f(n)的增长率相同,可记作T(n)=O(f(n)).
递归算法的时间复杂度
递归算法是指算法中自己调用自己的成分。在递归算法分析中首先写出对应的递推式,然后求解递推式得出算法的执行时间或者空间。
算法的空间性能分析
一个算法的存储量包括输入数据所占的空间,程序本身所占的空间和临时变量所占的空间。
算法的空间复杂度
算法的空间复杂度是对一个算法在运行过程中临时占用的存储空间的大小的量度。记作S(n)=O(g(n))。
递归算法的空间复杂度分析
对于递归算法,为了实现递归过程用到一个递归栈,所以需要根据递归深度得到算法的空间复杂度。
数据结构+算法=程序
程序是通过某种程序设计语言描述的,程序设计语言具有实现数据结构和算法的机制,其中类型声明和对象定义用于实现数据结构,而语句实现算法,描述程序的行为。
算法和数据结构
求解的问题可以通过抽象数据类型来描述,他有数据的逻辑结构和抽象运算两部分构成。
一种数据的逻辑结构可以印射成多种存储结构,抽象运算在不同的存储结构上实现可以对应多种算法,在同一结构上实现也可能有多种算法,通过算法的时间复杂度和空间复杂度分析可以得到更好的算法。
数据存储结构会影响算法的好坏,主要包含两个方面:
1.存储结构的存储能力
如果存储结构的存储能力强,存储的信息多,算法则较好设计,反之,较简单的存储结构可能要设计一套比较复杂的算法。所以经常会体现时间与空间的矛盾,往往存储能力与所使用的空间大小成正比。
2.存储结构应该与所选择的算法相适应
存储结构是算法实现的基础,也会影响算法的设计,其选择要充分考虑各种操作,应与算法的相适应。