一、数据结构的基本概念
(1)数据:人们利用文字符号、数字符号以及其他规定的符号,对现实世界的事物及其活动所做的抽象描述。
(2)数据元素:数据的基本单位,即数据集合中的一个个体。
(3)数据项:一个数据元素可由若干数据项组成,具有独立含义的最小单位。
元素之间的关系称为结构。数据结构,简单地说,就是 数据元素的集合加上数据元素之间的相互关系的集合,可形式化描述为一个二元组:Data Structure = ( D, S),其中,D:数据元素的集合,S:D上关系(结构)的集合。
数据结构 = 数据的逻辑结构 + 数据的存储结构 + 数据的运算
(4)抽象数据元素:没有实际含义的数据元素
(5)抽象数据元素类型:没有确切定义的数据类型
(6)数据的逻辑结构:数据元素之间的相互联系方式
(7)数据的存储结构:数据元素在计算机中的存储方式
(8)数据的操作:对一种数据类型的数据进行的某种处理
(9)数据的操作集合:对一种数据类型的数据进行的所有操作
数据的逻辑结构:
1、线性结构:除第一个和最后一个数据元素外,每个数据元素只有一个前驱和一个后继数据元素
2、树结构:除根节点外,每个数据元素只有一个前驱数据元素,可由0个或若干个后继数据元素
3、图结构:每个数据元素可有0个或若干个前驱数据元素和0个或若干个后继数据元素
数据的存储结构:
1、顺序存储结构:把数据元素存储在一块连续地址空间的内存中,其特点是逻辑上相邻的数据元素在物理上也相邻,数据间的逻辑关系表现在数据存储位置关系上
2、链式存储结构:使用指针把相互直接关联的结点(即直接前驱结点或直接后继节点)链接起来,其特点是逻辑上相邻的数据元素在物理上不一定相邻,数据间的逻辑关系表现在结点的链接关系上
(指针:是指向物理存储单元地址的变量。由数据元素域和指针域组成的一个结构体称为结点)
逻辑结构与存储结构的区别:
1.逻辑结构定义了数据元素之间的逻辑关系
2.存储结构是逻辑结构在计算机中实现
3.一种逻辑结构可以采用不同的存储方式(顺序,链式)存放在计算机中,但都必须反映出要求的逻辑关系
一个具体问题的软件设计通常包含三个步骤:
1、分析和确定问题的逻辑结构和逻辑操作
2、设计该问题的具体存储结构
3、设计该问题在具体存储结构下的操作实现算法
二、抽象数据类型和软件构造的方法
类型是一组值得集合
数据类型是指一个类型和定义在这个类型上的操作的集合
抽象数据类型(ADT)是指一个逻辑概念上的类型和这个类型上的操作的集合
ADT定义包含三部分
1、数据元素
2、数据元素之间的相互关系(结构)
3、定义在数据结构上的一组逻辑操作
三、算法及其时间复杂度
算法是描述求解问题方法的操作步骤集合
算法的设计
1、结构化程序设计方法:“自顶向下,逐步以模块的形式细化”原则
2、面向对象程序设计方法
描述算法的语言形式:
1、文字形式
2、伪代码形式
3、程序设计语言形式
算法分析:
评价算法好坏的标准,除算法应该是正确的外,还应考虑:
1.该算法是易读、易编码、可调试
2.该算法能有效利用计算机资源,归结为cpu执行指令数和占用内存存储单元数
评价方法:
1.实验方法(运行程序)
2.算法的渐进分析,简称算法分析
(1)分析算法消耗时间资源——时间复杂度
(2)分析算法使用的空间资源——空间复杂度
问题的规模
例如, “求1到100的所有素数之和“ 与 “求1到1000的所有素数之和” 是同一类型的问题,但问题的规模不同。
设n表示问题的规模(或算法的输入量),则该类问题可抽象地表示为:
“求1到n的所有素数之和”。
解决同样类型的问题有多种算法,我们需要一种方法来对不同的算法来进行比较
算法满足以下性质:
输入性、输出性、有限性、确定性、可执行性
算法设计满足以下目标:
正确性、可读性、健壮性、高时间效率、高空间效率
算法的时间复杂度还与初始输入集有关
平均时间复杂度是指所有可能的输入数据集均以等概率出现的情况下,算法的平均运行时间。
最坏输入数据集情况下的时间复杂度称最坏时间复杂度。一般若无特定说明,讨论的时间复杂度均指的是最坏情况下的运行时间。
空间复杂度
数据结构所需空间和算法在处理过程中所需额外空间的总和
它同样是问题规模n的函数,也可以实行类似的渐进分析方法。
大多数静态数据结构(即存储空间在执行过程中不发生变化),空间开销与问题的规模成正比(为线性增长),或者不随问题规模而增大(为常数)。
最后算法应具有可读性,主要体现在算法的符号命名和书写规范上