文章目录
- 一. 定义
- 1. 数据结构背景
- 2. 数据结构与算法的理解
- 二. 数据结构的地位
- 1. 数据结构是软件中最核心的课程
- 2. 什么是程序设计
- 三. 数据结构的基本概念和术语
- 1. 数据(data)
- 2. 数据元素(data element)
- 3. 数据项
- 3. 数据对象(data object)
- 4. 数据结构(data structure)
- (1). 概念
- (2). 数据结构的形式定义为
- 5. 数据结构三要素
- (1). 数据的逻辑结构
- 1. 定义
- 2. 分类(根据数据元素之间关系的不同特性分类)
- (2). 数据的存储结构(物理结构)
- 1. 定义
- 2. 存储内容包括
- 3. 数据存储结构分类
- 4. 如何描述存储结构
- (3). 数据的运算
- 四. 抽象数据类型的表示和实现
- 1. 数据类型
- (1). 定义
- (2). 分类
- 1. 原子类型(值不可再分)
- 2. 结构类型(可分解)
- 2. 抽象数据类型(Abstract Data Type)(ADT)
- (1). 表示: (D, S, P)
- (2). 意义
- 3. 举例:抽象数据类型三元组Triplet的表示和实现
- 4. 引用数据类型举例:
- 5. 第一个例子:抽象数据类型的表示和实现
- 五. 算法
- 1. 定义
- 2. 算法的特性
- 3. 设计一个"好"的算法应该考虑达到的目标
- 4. 衡量算法的标准
- (1). 时间复杂度
- (2). 空间复杂度
- (3). 难易程度
- (4). 健壮性
一. 定义
简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科
1. 数据结构背景
随着计算机的发展,计算机不再局限于科学计算,而更多用于控制、管理、数据处理等非数值计算的处理工作
- 计算机加工处理的对象有纯粹的数值发展到字符、表格、图像等各种具有一定结构的数据,因此诞生了数据结构
那什么是数据结构呢?
一般来说,计算机解决一个具体问题时的步骤:
- 从具体问题抽象出一个适当的数学模型(分析问题)
- 设计一个解此数学模型算法
- 最后编写出程序
- 测试、调整直至出现最终答案
例如:
2. 数据结构与算法的理解
我们如何把现实中大量而复杂的问题以特定的数据类型(个体)和特定的存储结构(个体的关系)保存到主存储器(内存)中,<以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应操作也叫算法>。
数据结构 = 个体 + 个体的关系(两者的存储问题)
算法 = 对存储数据的操作
简单来说:数据结构就是研究数据的存储问题;算法就是研究数据的操作问题
二. 数据结构的地位
1. 数据结构是软件中最核心的课程
- 数据结构是介于:数学、计算机硬件、计算机软件三者之间的一门核心课程
- 是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础
- 堆内存和栈内存的理解
- 数据库和数据结构
2. 什么是程序设计
程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言
或者说
程序设计 = 数据结构 + 算法
三. 数据结构的基本概念和术语
1. 数据(data)
- 是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号总称
- 数据是信息的载体
2. 数据元素(data element)
- 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
- 有时,一个数据元素可由若干个数据项组成
3. 数据项
- 是构成数据元素的不可分割的最小单位
3. 数据对象(data object)
- 是性质相同的数据元素的集合,是数据的一个子集
4. 数据结构(data structure)
(1). 概念
- 是相互之间存在一种或多种特定关系的数据元素的集合
- 任何问题中,数据元素都不是孤立存在的,它们之间存在某种关系,这种数据元素相互之间的关系称为结构
数据结构包括三方面的内容:逻辑结构、存储结构、数据的运算
(2). 数据结构的形式定义为
数据结构是一个二元组:Data_Structure = (D, S)
5. 数据结构三要素
(1). 数据的逻辑结构
1. 定义
- 逻辑结构:结构定义的关系用来描述数据元素之间的逻辑关系
- 从逻辑上描述数据,与数据的存储无关,独立于计算机(数学模型)
2. 分类(根据数据元素之间关系的不同特性分类)
数据的逻辑结构分为线性结构和非线性结构
- 集合:结构中的数据元素除了属于同一个集合之外,没有其他关系
- 线性结构:结构中的数据元素之间只存在一对一的关系
- 树形结构:结构中的数据元素之间存在一对多(包括一对一)的关系
- 图状结构或网状结构:结构中的数据元素之间存在多对多的关系
(2). 数据的存储结构(物理结构)
1. 定义
物理结构(存储结构):数据逻辑结构在计算机中的存储形式(映像)(包括数据元素的表示和关系的表示)
- 数据的存储结构是用计算机语言实现的逻辑结构,它依赖于计算机语言
- 实际上就是如何把数据元素存储到计算机的内存中
2. 存储内容包括
- 数据元素的表示
- 关系的表示
3. 数据存储结构分类
- 数据元素之间的关系在计算机中有两种表示方法:顺序映像和非顺序映像
进而得到以下不同存储结构:
- 顺序存储结构
- 链式存储结构
- 索引存储结构
- 散列存储结构
4. 如何描述存储结构
虽然存储结构涉及数据元素及其关系在存储器中物理位置,但我们可以借助高级语言中提供的数据类型来描述。
(3). 数据的运算
- 施加在数据上的运算包括运算的定义和实现
- 运算的定义是针对逻辑结构的,指出运算的功能
- 运算的实现是针对存储结构的,指出运算的具体操作步骤
四. 抽象数据类型的表示和实现
抽象数据类型可通过固有的数据类型来表示和实现,即利用处理器中已经存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。
1. 数据类型
(1). 定义
是一个值的集合和定义在这个值集上的一组操作的总称
来源:为了尽可能充分利用内存进行运算,对数据进行分类,分出多种数据类型。
例如:
(2). 分类
1. 原子类型(值不可再分)
2. 结构类型(可分解)
2. 抽象数据类型(Abstract Data Type)(ADT)
- 定义:指一个数学模型以及定义在模型上的一组操作,仅取决于它的一组逻辑特性,与在计算机内部如何表示和实现无关
对于编程者在设计软件程序时定义的数据类型,例如整型,不管定义在什么机器上,他们的作用都是相同的,都是进行整数间的运算,进而把这个数据类型抽象出来。
(1). 表示: (D, S, P)
- D:是数据对象
- S:是D上的关系集
- P:是对D的基本操作集
(2). 意义
3. 举例:抽象数据类型三元组Triplet的表示和实现
注:Triplet &T 说明参数是一个指向指针的引用。形参中的&表示该形参是一个引用类型
C语言里面没有引用的说法,是C++特有的。C++里引用就是给变量定义一个别名,操作这个别名就是操作原变量。
比如,我们定义一个引用:
- 变量主要是在参数传递的时候非常有用,当你的函数参数是一个值参数的时候,我们一般的做法是传递一个指针进去,这样就导致我们在函数里操作的都是指针,这样其实很不方便,如果使用引用的话就可以非常方便。
比如定义一个参数是引用的函数
4. 引用数据类型举例:
5. 第一个例子:抽象数据类型的表示和实现
五. 算法
1. 定义
解题的方法和步骤的描述
- 是指令的有限序列,其中每条指令表示一个或多个操作
2. 算法的特性
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
3. 设计一个"好"的算法应该考虑达到的目标
- 正确性
- 可读性
- 健壮性
- 效率与低存储需求
4. 衡量算法的标准
(1). 时间复杂度
大概程序要执行的次数,而非执行的时间
- 一个语句的频度:指的是该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),他是该算法问题规模的n的函数。
- 时间复杂度主要分析T(n)的数量级
- 而我们算法中基本运算(最深层循环内的语句)的频度与T(n)同数量级,因此通常采用算法中基本运算的频度f(n)来分析算法时间复杂度。记为:T(n) = O(f(n)){O的含义是T(n)的数量级}
表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同
渐进时间复杂度增长率排序:
- O(1) < O(log_2 n) < O(n) < O(nlog_2 n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
时间复杂性的规则:
- 加法规则:T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n), g(n))
- 乘法规则:T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O((f(n)*g(n))
一般我们讨论的都是在算法最坏的情况下的时间复杂度,以保证算法的运行时间不会比它更长
- 最坏时间复杂度:在最坏的情况下,算法的时间复杂度
- 平均时间复杂度:所有可能输入实例在等概率出现的情况下,算法的期望运行时间
- 最好时间复杂度:最好的情况下,算法时间复杂度
举例:
(2). 空间复杂度
算法执行过程中大概所占用的最大内存
- 空间复杂度S(n)定义为该算法所耗费的存储空间,它是问题规模n的函数。记做:S(n) = O(f(n))
随着问题规模n的增大,算法的所需存储空间的增长率和f(n)所占存储空间的函数增长率相同 - 一个程序在执行时除需要存储空间来存放本身的指令、常数、变量和输入的数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算机所需信息的辅助空间
- 算法原地工作指的是:算法所需的辅助空间为常量,即O(1)
(3). 难易程度
要让别人容易理解
(4). 健壮性
不易崩溃和对于异常有很好的处理