文章目录
一、数据结构的基本概念
1、数据—数据元素—数据项
数据
数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。
数据(Data)是信息的载体,是可以被计算机识别,存储并加工处理的描述客观事物的信息符号的总称。数据不仅仅包括了整形,浮点数等数值类型,还包括了字符甚至声音,视频,图像等非数值的类型。
数据元素
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。
一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
数据元素(Data Element)是描述数据的基本单位,也被称为记录。一个数据元素有若干个数据项组成。如禽类,鸡鸭都属于禽类的数据元素。
数据项
数据项(Data Item)是描述数据的最小单位,是构成数据元素的不可分割的最小单位。
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
数据结构(Data Structures)主要是指数据和关系的集合,数据指的是计算机中需要处理的数据,而关系指的是这些数据相关的前后逻辑,这些逻辑与计算机储存的位置无关,其主要包含四大逻辑结构(集合、线性、树、图)。
数据对象
数据对象(Data Object)是性质相同的一类数据元素的集合,是数据的一个子集。数据对象可以是有限的,也可以是无限的。
数据三要素
数据的逻辑结构:线性(集合)、非线性(线性表、树、图)
数据的存储结构(物理结构):线性、非线性(链式、索引、散列)
数据的运算:运算的定义针对逻辑结构,指出运算的功能;运算的实现针对存储结构,表示具体的实现。
四大逻辑结构(Logic Structure)
1) 集合结构
集合结构(Set Structure)中所有数据元素除了同属于一个集合外,并无其他关系。
2) 线性结构
线性结构(Linear Structure)指的是数据元素之间是一对一的关系。
除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
3) 树形结构
树形结构(Tree Structure)指的是数据元素之间是一对多的层次关系。
如图:
4) 图形结构
图形结构(Graphic Structure,也称:网状结构)指的是数据元素之间是多对多的关系(注:此时的“多对多”中的多表示,至少有一个)
图示:
四大存储结构(Storage Structure)
存储结构又叫物理结构,即如何用计算机表示数据元素的逻辑关系?即数据在实际计算机里是如何组织存放的。
顺序存储
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
一定要实际上分配连续的存储空间(地址连续)。
链式存储
逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。
实际存储数据元素时,分配的存储空间可以是不连续的(地址不连续)。
C语言中使用指针,Java中使用对象引用。
索引存储
在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。
关键字是唯一的,能区分不同数据元素。
散列存储
根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。
不同数据元素存储时,计算存储地址可能会发生冲突(地址相同),要设计和使用优秀的散列算法。
选择存储结构注意
若采用顺序存储,则各个数据元素在物理上必须是连续的;若采用非顺序存储,则各个数据元素在物理上可以是离散的。
数据的存储结构会影响存储空间分配的方便程度。
数据的存储结构会影响对数据运算的速度。
数据的运算
施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
数据类型
数据类型(Data Type)是高级程序设计语言中的概念,是数据的取值范围和对数进行操作的总和。数据类型规定了程序中对象的特性。程序中的每一个变量,常量或者表达式都属于一种数据类型。
原子类型
其值不可再分的数据类型。比如int、bool、float
结构类型
其值可以再分为若干原子类型和结构类型。比如C语言的结构体、Java的引用数据类型(对象类型)。
抽象数据类型
王道:
抽象数据类型(ADT):是抽象数据组织和与之相关的操作,也即是用数学化的语言定义数据的逻辑结构、定义运算,与具体的实现无关,也即是不考虑存储结构。
抽象数据类型(Abstract Data Type,ADT)只是一个数学模型以及定义在模型上的一组操作。通常是对数据的抽象,定义了数据的取值范围以及对数据操作的集合。
抽象数据类型的特征是实现与操作分离,从而实现封装。类似于Java的接口,只定义,不实现。
定义一个ADT,就是定义了数据的逻辑结构、数据的运算。也就是定义了一个数据结构。
确定一种存储结构,就意味着在计算机中表示出数据的逻辑结构。存储结构不同,也会导致运算的具体实现不同。确定了存储结构,才能实现数据结构。
在探讨一种数据结构时:
1、定义逻辑结构(数据元素之间的关系)
2、定义数据的运算(针对现实需求,应该对这种逻辑结构进行什么样的运算)
3、确定某种存储结构,实现数据结构,并实现一些对数据结构的基本运算
二、算法的概念(Algorithm)
算法就是根据输入,设计可行的计算方法并用有限的可执行步骤描述出来(程序),最终得到确定的输出。
五大特性
1、有穷性:算法有穷(有穷步,有穷时间),程序无穷。
2、确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出。
3、可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
4、输入:0个或多个输入。
5、输出:1个或多个输出。至少1个输出多指C语言,此处概念性问题,有争议。
好算法的特质
1、正确性:正确解决求解问题。
2、可读性:要具有良好的可读性,能够帮助人们理解。
3、健壮性:输入非法数据时,算法要能够适当的做出反应或进行一些处理,不会输出奇怪的结果。
4、高效率和低存储量:高效率指执行速度快,时间复杂度低;低存储量指节省存储空间,空间复杂度低。
三、时间复杂度
事前预估算法时间开销T(n)与问题规模n的关系。
最坏时间复杂度:最坏情况下算法的时间复杂度。
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间。
最好时间复杂度:最好情况下算法的时间复杂度。
四、空间复杂度
普通程序
1、找到所占空间大小与问题规模相关的变量
2、分析所占空间x与问题规模n的关系x=f(n)
3、x的数量级O(x)就是算法空间复杂度S(n)
递归程序
1、找到递归调用的深度x与问题规模n的关系x=f(n)
2、x的数量级O(x)就是算法空间复杂度S(n)
注:有的算法各层函数所需存储空间不同,分析方法略有区别
时空复杂度数量级排序
计算时间复杂度
1、加法与乘法规则
2、对于代码的时间复杂度判断
1)顺序执行的代码只会影响常数项,可以忽略。
2)只需要挑选循环中的一个基本操作来分析他执行次数与n的关系即可。
3)如果有多层嵌套循环,只需关注深层循环循环了几次。
3、评价时间复杂度时一般考虑最坏时间复杂度和平均时间复杂度。
总结
程序=数据结构+算法
数据结构 操作的对象是数据元素,即他们有相同的属性(属性也取决于观察者的角度),它们之间的存在的关系会产生不同的结构,数据元素之间的关系+操作构成了数据类型,对已有的数据类型进行抽象就构成了抽象数据类型(ADT),就是封装了值和操作的模型。
算法就是根据输入,设计可行的计算方法并用有限的可执行步骤描述出来(程序),最终得到确定的输出。(从中也可以看出算法的5大特性:输入,输出,有穷性,确定性,可行性)。
我们也可以从分析问题的角度去理清数据结构和算法之间的关系。通常, 每个问题的解决都经过以下两个步骤:
1、分析问题,从问题中提取出有价值的数据,将其存储;
2、对存储的数据进行处理,最终得出问题的答案;
数据结构负责解决第一个问题,即数据的存储问题。通过前面的学习我们知道,针对数据不同的逻辑结构和物理结构,可以选出最优的数据存储结构来存储数据。
算法负责剩下的第二个问题。算法,从表面意思来理解,即解决问题的方法。我们知道,评价一个算法的好坏,取决于在解决相同问题的前提下,哪种算法的效率最高,而这里的效率指的就是处理数据、分析数据的能力。
数据结构与算法的区别
数据结构用于解决数据存储问题,而算法用于处理和分析数据,它们是完全不同的两类学科。
数据结构与算法的联系
数据结构和算法存在“互利共赢、1+1>2”的关系。在解决问题的过程中,数据结构要配合算法选择最优的存储结构来存储数据,而算法也要结合数据存储的特点,用最优的策略来分析并处理数据,由此可以最高效地解决问题。