数据结构与算法

第一节

学习数据结构之前或许你会有这样的疑问:

这门课我们学什么?
这门课好学吗?
这门课怎么才能学好?

接下来我们就一一解答这些问题

Q1:这门课我们学什么?

凭借一句话获得图灵奖的Pascal语言之父——Nicklaus Wirth,让他获得图灵奖的这句话就是他提出的著名公式:

程序=数据结构+算法

这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的E=mc^2
——这个公式展示了程序的本质

算法其实就是用于解决某一类问题的公式与思想。(给出问题的数学模型)而数据结构就是数据的组织、管理和存储格式,其使用目的是为了高效的访问和修改数据。至于程序就是计算机处理问题的一系列指令。

程序设计的实质是对确定的问题选择一种好的数据结构,并设计一种好的算法。

课程内容
在这里插入图片描述

数据结构研究的内容

起初计算机被人们视作数值计算的工具

通常用计算精机解决一个问题的步骤:

一、具体问题抽象成数学模型:

  1. 分析问题;
  2. 提取操作对象;
  3. 找出操作对象之间的关系;
  4. 用数学语言描述

==>数据结构;【建立相应方程】<一般建立方程容易数据元素之间的关系简单但运算量大,人们就利用计算机来快速的完成复杂的计算>

二、设计算法

三、编程调试运行

随着计算机应用领域的扩展,计算机被越来越多地用于非数值计算,比如信息的处理
来了一位新同学把他的信息加入到系统中; 有同学转学或出国了要把他的信息删除道; 想查看某位同学的信息; 修改某位同学改名字了在系统中也应相应的修改
操作对象:每位学生的信息(姓名、学号、性别、籍贯、专业)
操作算法:查询、插入、修改、删除等
操作对象之间的关系:线性关系
数据结构:线性
数据结构:线性表
计算机之所以能和人对弈是因为已经将对弈的策略在计算机中存储好。由千对弈的过程是在一定规则下随机进行的,所以,为使计算机能灵活对弈,就必须把对弈过程中所有可能发生的清况及相应的对策都加以考虑
操作对象:各种棋盘格局
计算机的算法:根据当前的格局,从提供的派生格局中选择一种。也就是下一步棋,则构成一个新的棋盘格局。
操作对象之间的关系:非线性关系(树)

例子2.2:磁盘根目录下有很多子目录及文件,每个子目录里又可以包含多个子目录及文件但每一个子目录只有一个父目录
在这里插入图片描述

例3:最短路径问题。从城市A到城市B有多条线路,但每条线路的交通费不同,那么,如何选择一条线路,使得从城市A到城市B的交通费用最少呢?
在这里插入图片描述

综上所述:这些问题的共性是:都无法用数学的公式或方程来描述,是一些“非数值计算”的程序设计问题,描述非数值计算问题的数学模型不是数学方程,而是诸如表,树和图之类的具有逻辑关系的数据

数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科

Q2.这门课程好学吗?

比较难学。抽象概念性强、需要一些数学逻辑思维不然后面的学习就吃力一些了。

Q3.这门课怎么才能学好?

不要中途放弃,要迎难而上;做好笔记(“最淡的墨水也胜过最强的记忆”即使你不去复习你的笔记也没有什么,其实写字的过程中大脑也在学习,写字放慢了你的速度,从而让你更好的去消化学习的内容)主动学习;必须真真切切的可以写出代码去实现算法并且可以详细的说出每一步是做什么的;多上机敲代码。如果学的不是C语言也没有关系这可以让你了解你掌握的编程语言与C语言的差异。甚至将课本给出的代码用你掌握的语言去改造本身也是很好的学习方法。

第二节

基本概念和术语

1.数据(Data):客观事物的符号表示,所有能输入到计算机中并被计算机程序处理的符号的集合。
数据是信息的载体,是对客观事物的符号化表示,可以被计算机识别、存储和加工。
数据不仅仅包含整型、实型等数值类型,还包含图形、图像、声音、视频及动画等非数值类型
对于整型、实型等数值类型,可以进行数值计算;
对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。

2.数据元素(DataElement)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、记录、节点、顶点等。如前一节示例中的一名学生记录,树中棋盘的一个格局(状态),以及图中的一个顶点等。

3.数据项(DataItem)是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。【数据项是“数据的最小单位。但真正讨论问题时,数据元素才是数据结构中建立数据模型的着眼点。就像我们讨论一部电影时,是讨论这部电影角色这样的数据元素”,而不是针对这个角色的姓名或者年龄这样的“数据项”去研究分析。

4.数据对象(DataObject)是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0, ±1,±2,…}, 字母字符数据对象是集合C={‘A’,‘B’, …‘Z’,‘a’,‘b’, …, ‘z’}, 学生基本信息表也可以是一个数据对象。由此可以看出,不论数据元素集合是无限集(如整数集),或是有限集(如字母字符集),还是由多个数据项组成的复合数据元素(如学生表)的集合,只要集合内元素的性质均相同,都可称之为一个数据对象。

说了数据结构中的数据那数据结构中的结构又是什么呢?

数据结构

结构,简单的理解就是关系,比如分子结构,就是说组成分子的原子之间的排列方式。严格点说,结构是指各个组成部分相互搭配和排列的方式。在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构。那数据结构是什么?

数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带”结构"的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构和物理结构

逻辑结构

数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。数据的逻辑结构有两个要素:一是数据元素;二是关系。

物理结构/存储结构
物理结构:数据的逻辑结构在计算机中(内存)的存储形式。分为顺序存储结构、链式存储结构、索引存储结构、散列存储结构。
1.顺序存储结构
顺序存储结构是把数据元素存放在连续的存储单元里,数据元素之间的逻辑关系是通过数据元素的位置。(在前面的数据元素就存在前面;在后面的数据元素就存在后面)C语言用数组来实现顺序存储结构

例:(bat,cat,eat_mat)

2.链式存储结构
用一组任意的存储单元存储数据元素(可能连续也可能不连续),数据元素之间的逻辑关系用指针来表示(用指针存放后继元素的存储地址)
C语言中用指针来实现链式存储结构
存放(bat,cat,eat_mat)

现在如银行、医院等地方,设置了排队系统,也就是每个人去了,先领一个号,等着叫号,叫到时去办理业务或看病。在等待的时候,你爱在哪在哪,可以坐着、站着或者走动,甚至出去逛一圈,只要及时回来就行。你关注的是前一个号有没有被叫到,叫到了,下一个就轮到了。3.索引存储结构

在存储节点信息的同时,还建立附加索引
索引表中的每一项称为一个索引项,
索引项的一般形式是:(关键字,地址)
关键字是能唯一标识一个结点的那些数据项。
若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引(Dense Index)。若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引(Sparse Index)。
4.散列存储结构

数据类型

说到数据类型其实我们并不陌生,在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式、C语言中函数的参数、返回值,明确说明它们所属的数据类型。
C语言中:提供int,char,float,double等基本数据类型;数组、结构、共用体、枚举等构造数据类型;还有指针、空(void)类型,用户也可用typedef自己定义数据类型。而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。
在C语言中,数据类型可以分为两类:

原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等
结构类型:由若干个类型组合而成,是可以再分解的。例如,整型姿型数据组成的数组。

当年那些设计计算机语言的人,为什么会考虑到数据类型呢?
比如,大家都需要住房子,也都希望房子越大越好。但显然,没有钱,考虑房子是没啥意义的。于是商品房就出现了各种各样的房型,有别墅的,有错层的,有单间的;有一百多平米的,也有几十平米的,甚至在北京还出现了胶囊公寓——只有两平米的房间……这样就满足了不同人的需要。

类型明显或隐含地规定了程序执行期间变量或表达式的取值范围、存储方式以及允许进行的运算。
例如,C语言中定义变量i为int类型,就表示是[min,max]范围的整数,[-32768~32767,16位计算机上]

在这个整数集上可以进行+、-、*、/、%的操作,而不能进行其他数据类型比如字符串的一些操作,而实型变量也有自己的取值范围和相应运算,比如取模运算是不能用于实型变量的。
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象

抽象-百度百科

你在这幅图中看到了什么?相信大多数人会说看到的圆,其实这就是抽象。我们看到了他的本质,而去掉了一些非本质的东西,比如大小颜色,线条的粗细,空心还是实心。
那什么是圆呢?
圆是到某个点距离相等的点的集合这个定点就是圆心,距离就是半径,我们就可以描述这个圆的一些相关信息了
运算:构造圆、求面积、求周长

抽象数据类型

抽象数据类型(Abstract Data Type, ADT)一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。
由用户定义,从问题抽象出数据模型(逻辑结构)
还包括定义在数据模型上的一组抽象运算(相关操作)
不考虑计算机内的具体存储结构与运算的具体实现算法

抽象数据类型的形式定义

抽象数据类型可用(D,S,P)三元组表示【离散数学上的概念】其中:
D是数据对象;
S是D上的关系集;数据对象之间的关系构成的集合,(数据对象与数据对象之间可能有多种关系构成了这个集合)
P是对D的基本操作集。

说明

参数表:赋值参数,只为操作提供输入值
比如求圆的面积的操作area(操作的名字)®(操作的参数)
对图形进行一个缩放n倍scale(G(被操作的图形),n)对图形进行缩放,它当然也会返回一个图形 G’=scale(G,n)返回值要赋值给G 写成scale(&G,n)
引用参数以"&"打头,除可提供输入值外,还将返回操作结果。
”初始条件”描述了操作执行之前数据结构和参数应满足的条件,若初始条件为空,则省略。”
操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。

Summary

要想达到解决问题的目的,就要把抽象的,在计算机上用已有的数据类型进行实现
抽象数据类型——复数

抽象数据类型的概念与面向对象方法的思想是一致的。抽象数据类型独立于具体实现,将数据和操作封装在一起,使得用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,从而实现了信息隐藏。在C++中,我们可以用类的声明表示抽象数据类型,用类的实现来实现抽象数据类型。因此,C++中实现的类相当于数据的存储结构及其在存储结构上实现的对数据的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值