-
程序设计 = 数据结构 + 算法
-
1.绪论
-
1.1基本概念和术语
-
1.1.1数据
数据:是描述客观事物的符号,是计算机中可以操作的对象,是可以被计算机识别并输入给计算机处理的符号集合。
我们这里说的数据,其实就是符号,而且这个符号必须包含以下两个前提条件:
1.可以输入到计算机中
2.可以被计算机程序处理 -
1.1.2 数据元素
数据元素:是组成数据的具有一定意义的基本单位,在计算机中通常会整体处理,也称为记录 -
1.1.3 数据项
数据元素是由若干个数据项组成,比如说人这个数据元素是由手脚眼口鼻等数据项组成,也可以由年龄,性别等数据项组成
数据项是数据不可分割的最小对象。虽然数据项是数据的最小单位,但是真正讨论问题时,数据元素才是数据结构中建立数据原型的着眼点 -
1.1.4 数据对象
数据对象:是性质相同的数据元素的集合,是数据的子集
比如说一个数据对象,它拥有姓名,年龄,性别等相同的数据元素 -
1.1.5 数据结构
结构:简单的理解就是关系。不同数据之间不是独立的,而是存在特定的关系,我们将这些关系称为结构
数据结构:相互之间存在一种或者几种关系的数据元素的集合 -
1.2逻辑结构与物理结构
-
1.2.1逻辑结构
逻辑结构:指数据对象中数据元素之间的相互关系
1.集合结构
集合结构:集合结构中的数据元素除了属于同一集合外没有其他的关系
2.线性结构
线性结构:线性结构中的数据元素之间的关系都是一对一的关系
3.树形结构
树形结构:树形结构中的数据元素之间的关系存在一对多的层级关系
4.图形结构
图形结构:图形结构之间的数据元素之间的关系是多对多的关系 -
1.2.2 物理结构
物理结构是指数据的逻辑结构在计算机中的存储形式
1.顺序存储结构
是把数据元素存放在地址连续的存储单元内,其数据间的逻辑关系与物理关系是一致的
数组就是这种,其实就是在内存中开辟一段地址空间,然后按顺序一个一个排队,不许插队,每个人占一段空间
2.链式存储结构
是把数据元素放在任意的存储单元里,这组存储单位可以是连续的,也可以是不连续的。
数据元素的存储关系并不能反映其逻辑关系,因此需要一个指针来存放数据元素的地址,通过地址来找到数据元素的位置
逻辑结构是面向问题的,物理结构是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中
-
2.算法
-
2.1算法定义
算法是解决特定问题的求解步骤的描述,在计算机中表现为指令的有限数列,并且每条指令表示一个或多个操作
算法的定义中提到了指令,指令能被人或机器等计算装置执行,他可以是计算机指令,也可以是我们平时使用的语言文字
为了解决某个或者某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作完成特定的功能,这就是算法 -
2.2算法的特性
-
2.2.1输入输出
算法具有零个或者多个输入,一般的算法都有多个输入,零个输入的算法比如说打印一个“HELLO WORLD!”
算法具有一个或者多个输出,算法一定具有输出,不然这个算法就没有了存在的意义;输出的形式可以的打印也可以是返回一个或者多个值。 -
2.2.2有穷性
指算法在执行完有限的步骤后,自动结束而不会进行无限循环,并且每个步骤在可接受的时间内完成。如果说一个算法可以完成,但是要花上数十年,这在数学上虽然是有穷的,但是这么久的算法也没有其存在的意义
-
2.2.3确定性
算法的每一个步骤都具有确定的意义,不会出现二义性
-
2.2.4可行性
算法的每一个步骤都是可行的,每一步都是可以通过执行有限次数完成的
-
2.3算法设计的要求
-
2.3.1正确性
算法的正确性是指沙发俺应该至少具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案
算法 -
2.3.2可读性
算法设计的另一目的是为了便于阅读、理解和交流
-
2.3.3健壮性
当输入的数据不合法时,算法也能进行处理,我不是产生异常或者莫名其妙的结果
-
2.3.4时间效率高和存储量低
-
2.4算法效率的度量方法
-
2.4.1事后统计方法
这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编译的程序的运行时间进行比较,从而确定算法效率的高低
这种方法有很大缺陷,不用这种方法度量 -
2.4.2事前分析估算方法
在计算机编译前,依据统计方法对算法进行估算
消耗的时间因素:
1.算法采用的策略、方法
2.编译产生的代码质量
3.问题的输入规模
4.机器执行指令的速度 -
2.5算法时间复杂度
-
2.5.1算法时间复杂度定义
-
2.5.2常见的时间复杂度
image.png
image.png -
3 线性表
-
3.1 线性表的定义
零个或多个数据元素的有限序列。
线性表首先是一个序列,也就是元素之间是有顺序的,每个元素只有一个前驱和后继,当然第一个元素没有前驱和最后一个元素没有后继
线性表中的元素是有限的,无限的数列只存在于数学模型中- 线性表元素个数n(n>=0)定义为线性表的长度,当n=0时,为空表
-
3.2 线性表的抽象数据类型
image.png -
3.3 线性表链式存储结构
对于数据Ai而言,不仅仅要存储其本身的信息外,还需要存储一个指示其直接后继的信息(即其直接后继的存储位置)。
把存储元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针。这两部分信息组成数据元素Ai的存储映像,称为结点(Node)
n个结点链结成一个链表,即为线性表的链式存储结构,因为此链表的结点只包含一个指针域,所以叫单链表。
image.png
对于线性表而言,总得有个头有个尾,链表也是一样。我们把链表中第一个结点的存储位置叫做头指针,整个链表的存取必须从头指针开始进行;相应的,链表的最后一个节点指针为空(通常用NULL来表示)。
-
有时为了更加方便地对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点。头结点的数据域可以不存储任何信息,或者可以存储如线性表的长度等附加信息,头结点的指针域存储指向第一个结点的指针
image.png -
3.4 头指针和头结点的异同
头指针:
1.头指针是指链表指向头一个结点的指针 ,若链表有头结点,则是指向头结点的指针
2.头指针具有标识作用,所以常用头指针冠以链表的名字
3.无论链表是否为空,头指针均不为空。头指针是链表的必要元素头结点:
1.头结点是为了操作的统一和方便而建立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度)
2.有了头结点,对于第一元素结点前插入结点和删除第一节点,其操作与其他结点的操作就统一了
3.头结点不一定是链表第一要素-
3.5 单链表的插入与删除
-
插入步骤
image.png -
代码实现
image.png -
删除步骤
image.png -
代码实现
image.png
-
-
3.6 单链表的整表创建
-
算法
image.png -
代码
image.png
-