1.开场
首先我们学习一门知识都会有几个疑问?
- 为什么要学数据结构
- 数据结构重要吗
- 数据结构好学吗
- 怎么才能学好呢
- 数据结构学什么
接下来本博主一一作答
为什么要学?
答: Pascal语言之父N.Wirth教授说:程序=数据结构+算法,这个公式对于计算机科学的影响程度足以类似物理学爱因斯坦的“E=MC^2”
数据结构重要吗?
答:数据结构在我们的学科体系中有着承上启下的作用。下面看一张图
俗话说:练武不练功,到头一场空。数据结构就是我们的地基。同时,若你是考研党的话。数据结构也是一门必考科目。甚至在前几年有不少的985、211院校的专业课是只靠数据结构的。它的重要性不言而喻了吧
数据好学吗?
答:说实话,数据结构是一定的难度的。难在它的概念多。并且逻辑性很强,算法灵活不容易掌握。但那都不是事儿,紧跟脚步
怎么才能学好呢?
答:我们在看完一章的同时,要勤于思考,多做练习。这门课的事件性很强,所以我们要善于多多上机练习。善于寻求帮助,不要死磕。不怕困难,不放弃。
数据结构学什么?
答:首先我们要了解什么是数据结构,数据结构的一些相关概念。接下来铺出两种基本的数据结构,线性和非线性。最好再介绍一些基本的数据处理技术。这样总结感觉数据结构好像很简单是不是。enenen向下自己感受吧
2.数据结构的研究内容
在早期,计算机的出现主要是用于数值计算
如:求一个梁架结构的应力
数学模型 KU=M线性方程组
具体分析:首先分析问题,提取操作对象KUM,找出操作对象之间的关系(这里都是数值没有特定的关系)加以语言描述,建立相应的数学方程(图中方程组)。最好求解数学方程
由于早期的计算机只是对数值进行计算(像上面的方程组的数学计算)。数据结构在那个时期好像没有什么很大的作用。但随着信息时代的到来。使得越来越多的非数值计算问题出现
再举一个简单的例子学校的学生学籍管理系统:
学号 | 姓名 | 性别 | 籍贯 | 专业 |
---|---|---|---|---|
1 | 张安 | 男 | 河北 | 计算机 |
2 | 李素 | 女 | 天津 | 计算机 |
3 | 赵武 | 男 | 上海 | 计算机 |
4 | 孙倩 | 女 | 浙江 | 计算机 |
这个要操作就不是简单的数值而是所有学生的信息
分析
操作对象:每一个学生的信息(学号,姓名等)
操作:增删改查等
操作对象之间的关系:线性
数据结构:线性表
是不是在疑惑它的数学模型是啥呢?
哈哈,向下慢慢看
再如人机对弈问题:
游戏规则和五子棋类似,即为先连成三颗的胜利。如上图(图丑见谅了)第二行该黑子落字。有剩余5个位置可有落。故派生了五种可能。上图少画了一种。接下来该红字落。还有四个空,故又派生出4种可能。依次往下。这便是程序的基本思想。
这里的操作对象:各种棋局的状态(棋子落下的位置不同,往下的情形也是不同)
操作对象之间的关系:树形结构
数据结构:树
最后一个例子导航系统
现在我们的生活中,导航系统已经是不可缺少的呢。那你有没有想过它的设计原理呢。
如我们站在五四路和华林路的交口,想去温泉公园。但我们把起始和终止地址输入到计算机中时。计算机便会将地图的个个地点抽象成一个个小圆点。条条路抽象成一根根线。如此便把图上的地图就抽象成了一个网状结构。接下来就运用了图的知识,求最多路径为我们选择道路了
总结
像上述问题的共性都是无法用数学的公式或方程来描述的,是一些非数值计算的程序设计问题
描述非数值计算问题的数学模型不是数学方程,而是诸如表、树、图之类的具有逻辑关系的数据
数据结构是一门研究非数值计算的程序设计中,计算机的操作对象以及操作对象之间关系和它们要进行的操作的学科
3.基本概念
数据
- 是能够输入到计算机并且能被计算机处理的各种符号的集合
- 是信息的载体
- 能够被计算机识别、存储、加工等
包括:
- 数值型:整数、实数等
- 非数值:文字、图像、声音等、
数据元素
- 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
学号 | 姓名 | 性别 | 专业 |
---|---|---|---|
01 | 张安 | 男 | 软工 |
像这样一条学生信息记录,它通常是当做一个整体出现的
数据项:
像上表中的数据,如学号是01、姓名是张安等等这都是一个个数据项。
三者的关系:
数据>数据元素>数据项
例如:学生表>个人记录>学号、姓名
数据对象
- 是性质相同的数据元素的结合,是数据的一个子集。像上面的学生表。是多个学生记录组合而成
数据对象与数据元素的区别:
- 数据元素是组成数据的基本单位
- 数据对象是相同数据类型的集合
- 它们与数据的关系,前者是集合的个体后者是集合的子集。
数据结构
- 数据元素不是孤立存在的,它们之间存在着某种关系,数据元素之间的相互关系称为结构
- 是指相互之间存在一种或多种特定关系的数据的集合
- 又或者说,数据结构是带着结构的数据元素的集合
数据结构包括以下三个方面
- 数据之间的逻辑关系,也称为逻辑结构
- 数据元素及其关系在计算机内存中的表示(又称映像)。称为数据的物理结构或数据的存储结构
- 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现
数据结构的俩个层次
- 逻辑结构
- 描述数据元素之间的逻辑关系
- 与数据的存储无关,独立于计算机
- 是从具体问题抽象出来的数学模型
- 物理结构
- 数据元素及其关系在计算机存储器中的结构(存储方式)
- 是数据结构在计算机中的表示
- 两者的关系
- 存储结构是逻辑关系的映像与元素本身的映像
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
逻辑结构的分类
方法一:
- 线性结构 1:1型:
有且仅有一个开始和一个终结结点,并且所有结点都最多只有一个直接前驱和一个直接后继
如:线性表、栈、队列
- 非线性结构 1:n,m:n型
一个结点可能有多个直接前驱和多个直接后继
如:树、图
方法二:
集合,线性,树,图。
在我的数据结构分类中的逻辑与物理结构中有详细说明
存储结构的种类
- 顺序存储结构(重点)
- 链式存储结构(重点)
- 索引存储结构(了解)
- 散列存储结构(了解)
顺序存储结构
- 用一组连续的存储单元依次的存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示
- 在C语言中。通常使用数组来实现顺序储存结构
链式存储结构
- 用一组任意的存储单元存储数据,数据元素之间的逻辑关系用指针来表示
- C语言中用指针来实现链式存储结构
剩下的两种存储结构自己了解了解就可以了。
数据类型和抽象数据类型
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
抽象数据类型(ADT):是指一个数学模型及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
基本操作定义格式说明:
参数表:
-
赋值参数:只为操作提供输入值
-
引用参数:以&开头,除了可以提供输入值的同时,还可以返回操作结果。如同C语言中函数的返回值一样
-
初始条件:描述执行之前数据结构和参数应该满足的条件,若不满足,则操作失败,并返回相应的出错信息。若初始条件为空,则省略。
-
操作结果:说明操作正常完成之后,数据结构的变化状况和相应的返回结果
抽象数据对象定义举例:
ADT 抽象数据类型名{
DATA
数据对象的定义
数据元素之间的逻辑关系 定义
Operation
操作1
初始条件
操作结果描述
操作2
...
} ADT 抽象数据类型名
实例
ADT Circle{
数据对象:D={r,x,y|r,x,y均为实数}
数据关系:R={<r,x,y>|r是半径<x,y>是圆心坐标}
基本操作
Circle(&C,r,x,y)
操作结果:构造一个圆
double Area(C)
初始条件:圆已经存在。
操作结果:计算面积
} ADT 抽象数据类型名