目录
程序设计=数据结构+算法
一、数据结构绪论
1.1 基本概念和术语
1.11 数据
数据(data):
是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。数据可以是连续的值,比如声音、图像,称为模拟数据;也可以是离散的,如符号、文字,称为数字数据。在计算机系统中,数据以二进制信息单元0、1的形式表示。
也就是说,这里所说的数据其实就是符号,且这些符号有两个前提:
·可以输入到计算机中
·能被计算机处理
1.12 数据元素
数据元素(Data Element):
是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、记录等。数据元素用于完整地描述一个对象,如前一节示例中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。
1.13 数据项
数据项(Data Item):
是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。
1.14 数据对象
数据对象(Data Object):
是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0,±1,+2,…},字母字符数据对象是集合C={'A','B',…,Z' ,'a', 'b',…,'z'},学生基本信息表也可以是一个数据对象。由此可以看出,不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表)的集合,只要集合内的性质均相同,都可称之为一个数据对象。
1.15 数据结构
不同的数据元素之间不是独立的,而是存在特定的关系,我们将这种关系称为结构。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
那具体什么关系?往下看
1.2 逻辑结构和物理结构
1.21 逻辑结构
是指数据对象中数据元素之间的互相关系。
(以下图片每一个结点就代表一个数据元素)
1.集合结构
集合结构中的数据结构除了同属于一个集合外,他们之间没有其他的关系。
他们是“平等”的。
2.线性结构
线性结构中的数据元素之间是1对1的关系。
3.树形结构
树形结构中的数据元素之间存在1对多的层次关系。
4.图形结构
图像结构的数据元素是多对多的关系
我们在用示意图表示数据的逻辑结构时,要注意两点:
·将每个数据元素看做一个结点,用圆圈表示。
·元素之间的逻辑关系用节点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示。
1.22 物理结构(存储结构)
是指数据的逻辑结构在数据在计算机中的存储形式
就是如何把数据元素存储到计算机的存储器(内存)中。
存储结构反映着数据元素之间的逻辑关系,如何存储数据元素之间的逻辑关系,是实现物理结构的重点和难点。
1.顺序存储结构
把数据元素存放到地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的
“排队占位”
数组就是这样的顺序存储结构
比如要建一个9个整形数据的数组时,计算机就在内存中找了片空地,按照一个整形所占的位置*9,开辟一段连续的空间,第一个数组放在第一个位置上,依次排放。
2. 链式存储结构
但实际上总是有人“插队、上厕
所、放弃排队”处在一种变化的队形当中
对应的有一种方法 :叫号
把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
这时存储关系不能反映其逻辑关系,因此需要“一个指针存放数据元素的地址”,这样通过地址就能找到相关联数据元素的位置。
显然,链式结构就灵活多了,数据存在哪里不重要,只要有一个指针存放了相应的地址就能找到它了。
1.3抽象数据类型
1.31数据类型
是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
数据类型是按照值的不同进行划分的。每个变量、常量和表达式都有各自的取值范围。
类型就是用来说明变量或表达式的取值范围和所能进行的操作。
在C语言中按照取值的不同,数据类型可以分为两大类:
原子类型:不可再分的基本类型。整形、实行、字符型等。
结构类型:由若干个类型组合而来,是可以再分割的。整形数组是由若干整形数据组成的。
计算机的内部硬件系统不同,可能运作方式不同。但是编程语言操作都一样(就是抽象的结果)
抽象就是指抽取出事务具有的普遍性的本质。
抽象是一种思考问题的方式,它隐藏了繁杂的细节,只保留实现目标所必需的信息。
1.32抽象数据类型
对已有的数据类型进行抽象
是指一个数学模型及定义在该模型上的一组操作。
取决于它的一组逻辑特征,而与其在计算机内如何表示和实现无关。
“整形”就是一个抽象数据类型。抽象的意义在于数据类型的数学抽象特征。 还可以是编程者在设计程序时自己定义的数据类型。ponit来表示X、Y、Z 还可以表示定义在该模型上的一组操作。“马里奥”走、跑、跳。
抽象数据类型体现了程序设计中的问题分解、抽象和信息隐藏的特性。
他将实际生活中的问题分解为多个规模小且容易处理的问题,然后建立一个计算机能处理的数据模型,并把每个功能模块的实现细节作为一个独立的单元,从而使具体实现过程隐藏起来。
抽象数据类型的标准格式:
二、算法
2.1 两种算法的比较
计算1+2+3+……+100
第一种:for循环
但是真的好吗?高效吗?
第二种:高斯求和
高斯的方法不仅可以用于1加到100,还可以加到一千、一万、一亿(需要更改数据类型为长整型,否则会溢出)。
2.2 算法的定义
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且篾条志玲表示一个或多个操作。
2.3 算法的特性
2.31 输入输出
算法具有0个或多个输入。至少有一个或多个输出。可以是打印也可以是返回一个或多个值。
2.32 有穷性
是指算法在执行有限的步骤之后,自动结束而不会出现无线循环,并且每一个步骤都在可接受的时间内完成。
2.33 确定性
算法的每一步都有具体确定的含义,不会出现二义性。
在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。每个步骤被精确定义而无歧义。
2.34 可行性
算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
可行性是算法可以转化为程序上机运行,并得到正确的结果。
2.4 算法设计的要求
2.41 正确性
是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
正确应该有4个层次
1.算法程序无语法错误
2.对于合法的输入数据能够产生满足要求的输出结果
3.对于非法的数据能够得出满足规格说明的结果
4. 对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果
算法的正确性大部分情况下都不可能用程式来证明,而用数学方法证明。一般情况下我们把层次3作为一个算法是否正确的标准
2.42 可读性
算法设计的另一目的是为了便于阅读、理解和交流。
2.43 健壮性
当输入数据不合法时,算法也能做出相关的处理,而不是产生异常或莫名其妙的结果
2.44 时间效率高和存储量低
执行时间短的效率高。
存储量需求指算法在执行过程中需要的最大存储空间,主要指算法程序运行时所占用的内存或外部硬件存储空间。
用最少的存储空间,最少的时间,办同样的事就是好算法。
2.5 函数的渐进增长
某个算法,随着n的增大,它会越来越优于另一算法或者越来越差。
2.6 算法时间复杂度
2.61算法时间复杂度定义
2.62 推导大O阶方法
2.63 常数阶
不管常数时多少都是O(1)
对于单纯分支结构(不包含在循环结构中),无论真假,执行的次数都是一定的,不会随着n的变大而变大,其时间复杂度也是O(1)
2.64 线性阶
线性阶的循环结构 需要确定某个特定语句或某个语句集运行的次数,关键要分析循环结构的运行情况。
2.65 对数阶
每次count乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。由所以这个循环的时间复杂度为
2.66 平方阶
那我们推导大O阶的方法,第一条,没有加法常数考虑;第二条,只保留最高阶项,因此保留n²/2;第三条,去除这个相乘的常数,也就是去除1/2,最终这段代码的时间复杂度为O(n²)。
2.7 常见的时间复杂度
2.8 算法空间复杂度
用空间来换取时间