开头声明: 王卓老师 YYDS
什么是函数?
函数是为了解决大量同类型问题所设计的, 函数是一个工具
程序 = 数据结构 + 算法
操作对象 与 操作对象之间的关系 叫做数据结构
研究的主要是计算方法
数据与数据成一对多的关系,是一种典型的非线性关系结构------树形结构
描述非数值计算问题的数学模型不是数学方程,而是诸如表,树和图之类的具有逻辑关系的数据
数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科
什么是数据?
数据就是能输入计算机且能被计算机处理的各种符号的集合 .
且数据分为两类:
一: 数值型数据: 整数,实数等
二: 非数值型数据: 文字,图像,图形,声音等
什么是数据的基本单位?
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
也简称为元素,或称为记录,结点或顶点
一个数据元素可由若干个数据项组成
数据项: 是构成数据元素的不可分割的最小单位\
什么是数据对象?
是性质相同的数据元素的集合,是数据的一个子集.
数据元素和数据对象有什么关系呢?
数据元素 组成数据的基本单位 与数据的关系: 是数据的个体 数据对象 性质相同的数据元素的集合 与数据的关系: 是集合的子集
什么是数据结构?
数据元素相互之间的关系称为结构
是指相互之间存在一种或多种特定关系的数据元素集合
或者说,数据结构是带结构的数据元素的集合
数据结构包括三方面的内容:
一: 数据元素之间的逻辑关系,也成为逻辑结构
二: 数据元素及其关系在计算机内存中的表示(又称为映像), 称为数据的物理结构或数据的存储结构
三: 数据的运算和实现,及对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现
什么是映像?
数据元素及其关系在计算机内存中的表示(又称为映像)
数据结构分几个层次?分别是那几个?以及互相之间的关系是什么?
1)数据结构分两个层次.
2)分为逻辑结构和物理结构(也可以称为存储结构)
其中逻辑结构: 一:是描述数据元素之间的逻辑关系
二:与数据的存储无关,独立于计算机
三:是从具体问题抽象出来的数学模型
其中物理结构(也就是存储结构): 一: 数据元素及其关系在计算机存储器中的结构(存储方式)
二: 是数据结构在计算机中的表示
3)逻辑结构与存储结构的关系:
存储结构是逻辑关系的映像与元素本身的映像
逻辑结构是数据结构的抽象,存储结构是数据结构的实现
二者综合起来建立了数据元素之间的结构关系
逻辑结构有那些种类?
划分方法一:
分为线性结构和非线性结构
1) 线性结构
有且仅有一个开始和一个终端结点,并且所有的结点都最多只有一个直接前趋和一个直接后继
比如: 线性表, 栈, 队列 ,串 (小卓的理解就是 元素也就是结点之间是不是 一对一的关系)
2)非线性结构
一个结点可能有多个直接前趋和直接后继
比如: 树 和 图 (小卓的理解就是 元素也就是结点之间 是不是 一对N的关系)
划分方法二:
分为四种基本逻辑结构: 集合结构 线性结构 树形结构 图状结构(或者称为网状结构)
1) 集合结构: 结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系
2) 线性结构: 结构中的数据元素之间存在着 一对一 的线性关系
3) 树形结构: 结构中的数据元素之间存在着 一对多 的层次关系
4) 图状结构或网状结构: 结构中的数据元素之间存在着 多对多 的任意关系
存储结构分为那些种类?
四种基本的存储结构:
1) 顺序存储结构
2) 链式存储结构
3)索引存储结构
4)散列存储结构
什么是顺序存储结构?
用一组连续的存储单元,依次存储数据元素,数据元素之间的逻辑关系(一对一或者一对多等等)由元素的存储位置来表示
C语言中用数组来是实现顺序存储结构
什么是链式存储结构?
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
C语言中用指针(也叫做地址)来实现链式存储结构
什么是索引存储结构? (index 叫索引 也叫 目录)
在存储结点信息的同时,还建立附加的索引表
就这个东东 里面的 例如:首字母排序的这个 就是索引表哈
索引表中的每一项称为 一个索引项
索引项的一般形式是: 关键字和地址
关键字是能唯一标识一个结点的那些数据项
若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引(即 Dense Index).若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引(Sparse Index)
什么是散列存储结构?
根据结点的关键字直接计算出 该结点的存储地址.
一些常用的数据结构,如栈,队列,树,图等,不能直接用数据类型来表示
定义数据类型有什么作用?
注:。高级语言是参照数学语言而设计的近似于日常会话的语言, 高级语言并不是特指的某一种具体的语言,而是包括很多编程语言,如流行的java,c,c++ 等等
高级语言中的数据类型 明显的 或者 隐含的 规定了在程序执行期间变量和表达的所有可能的取值范围,以及在这些数据范围上所允许进行的操作
数据类型的作用:
1) 约束变量或者 常量的取值范围
2) 约束变量或者 常量的操作
什么是数据类型?
定义: 数据类型是一组性质相同的值的集合以及定义域这个值集合上的一组操作的总称
数据类型 = 值的集合 + 值集合上的一组操作
什么是抽象数据类型(Abstract Date Tyoe 简称为 ADT)?
抽象数据类型 指的是 从具体问题当中抽象出来的一个数学模型 以及 对这个数学模型的一组操作
由用户定义,从问题抽象出数据模型(逻辑结构)
还包括定义在数据模型上的一组抽象运算(相关操作)
抽象数据类型不考虑计算机内的具体存储结构与运算的具体实现算法
什么叫做形式定义?
简介且严谨的文字描述 称之为 形式定义
什么是伪代码? (引用自 百度)
伪代码:是用介于自然语言和计算机语言之间的文字和符号(包括数学符号)来描述算法
伪代码只是像流程图一样用在程序设计的初期,帮助写出程序流程。
什么是抽象数据类型的形式定义?
抽象数据类型可用(D, S, P) 三元组 表示, 其中: D是数据对象 S是D上的关系集 P是对D的基本操作集
一个抽象数据类型定义格式如下:
ADT 抽象数据类型名 {
数据对象: <数据对象的定义>
数据关系: <数据关系的定义>
基本操作: <基本操作的定义>
} ADT 抽象数据类型名
其中数据对象,数据关系的定义用伪代码描述
基本操作的定义格式为:
基本操作名(参数表)
初始条件: <初始条件描述>
操作结果: <操作结果描述>
基本操作定义格式的说明(即表示):
参数表: 赋值参数 只为操作提供输入值. 引用参数 以 &打头, 除可提供输入值外,还将返回操作结果
初始条件: 描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败.并返回相应出错信息.若初始条件为空, 则省略之
操作结果: 说明操作正常完成之后, 数据结构的变化状况和返回的结果
在C语言实现抽象数据类型 :
用已有数据类型定义描述它的存储结构
用函数定义描述它的操作
然后才 可以在程序中使用
抽象数据类型应该如何实现?
抽象数据类型可以通过固有的数据类型(如整型,实型,字符型等)来表示和实现
即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作
类C语言相较于C语言确实语法细节
什么是算法(或者说算法是如何定义的?)
算法的定义: 对特定问题求解方法和步骤的一种描述,它是指令的有限序列, 其中每个指令表示一个或多个操作
简而言之: 算法就是解决问题的方法和步骤
算法与程序的关系是什么?
算法是解决问题的一种方法或一个过程,考虑如何讲输入转换成输出,一个问题可以有多种算法
程序是用某种程序设计语言对算法的具体实现
程序 = 数据结构 + 算法
数据结构通过算法实现操作
算法根据数据结构设计程序
算法需要具有什么特性?
有穷性: 1. 有穷步 2.有穷时间
确定性: 1.指令的明确性 2.相同的输入只能得到相同的输出
可行性: 1.可执行的 2.算法描述的操作可以通过已经实现的基本操作执行有限次来实现
输入: 一个算法有零个或多个输入
输出: 一个算法有一个或多个输出
算法设计的要求是什么?
1) 正确性(Correctness)
2) 可读性(Readabilty)
3) 健壮性(Robustness)---说白了就是不会莫名出现错误
4) 高效性(Efficiency)---要求花费尽量少的时间和尽量低的存储需求
1) 什么是正确性?
程序 1.不含语法错误 2.对几组数据能够得出满足要求的结果 3. 程序对精心选择的,典型的,苛刻且带有刁难性的几组输入数据能够得出满足要求的结果 4.一切合法的输入数据都能得出满足要求的结果
通常以第三层意义上的为正确性作为衡量一个算法是否合格的标准
如何判断算法的优劣?
一个好的算法 前提 要具备正确性 健壮性 可读性 在几个满足的情况下:
主要考虑算法的效率, 通过算法的效率高低 来评判不同算法的优劣程度
算法效率一般从什么方面来考虑?分别是什么?
1. 时间效率: 指的是算法所耗费的时间
2. 时间效率: 指的是算法执行过程中所耗费的存储空间
时间效率和空间效率有时候是矛盾的
应该如何度量算法的时间效率?有几种方法?分别是什么?
1) 算法的时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量
2) 有两种方法
3) 一:事后统计
将算法实现,测算起时间和空间的开销
缺点: 编写程序实现算法将花费较多的时间和精力, 所得实验结果依赖于 计算机的软硬件等环境因素,掩盖算法本身的优劣
二:事前分析
对算法所消耗资源的一种估算方法
事前分析方法具体指的是什么?
一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等与计算机执行一种简单的操作(如赋值,比较,移动等) 所需的时间与算法中进行简单操作次数乘积
算法运行时间 = 一个简单操作所需的时间 x 简单操作次数
每条语句的执行次数 又可以称为 语句频度
也即算法中每条语句的执行时间之和
算法运行时间 = Σ (每条语句频度 x 该语句执行一次所需的时间)
解释: 每条语句频度乘于执行该语句所需要的时间 然后所有语句求类加和
每条语句执行一次所需的时间是受什么影响的?
每条语句执行一次所需的时间,一般是随机器而异的.取决于机器的指令性能,速度以及编译的代码的质量.是由机器本身软硬件环境决定的 它与算法无关
所以当我们从算法角度 可以假设执行每条语句所需的时间均为单位时间. 此时对算法的运行时间的讨论就可以转化为讨论该算法中所有语句的执行次数, 即频率之和
这就可以独立于不同机器的软硬环境来分析算法的时间性能了
我们比较不同算法的时间效率,我们仅比较它们的数量级就可以了
次方越大 则 越不好
比如: 10 * n的平方(即二次方) 与 5 * n的三次方
order: 是数量级的意思
什么是时间复杂度?
若有某个辅助函数 T(n) , 使得当 n趋近于无穷大时, T(n)/f(n) 的极限值为 不等于0的常数, 则称f(n) 说 T(n)的同数量级函数. 记作 T(n) = O(f(n)), 称O(f(n))为算法的渐进时间复杂度(O是数量级的符号), 简称时间复杂度
算法中基本语句重复执行的次数 是 问题规模n 的某个函数 f(n), 算法的时间量度记作:
T(n) = O(f(n))
它表示随着n的增大, 算法执行时间的增长率和f(n)的增长率相同, 称渐进时间复杂度
什么是基本语句?
1.算法中重复执行次数和算法的之心那个时间成正比的语句
2.对算法运行时间贡献最大
3.执行次数最多
什么是问题的规模?
问题规模n越大算法的执行时间越长
来描述我们要处理的数据量的一个变量
比如: 排序: n为记录数
矩阵: n为矩阵的阶数
多项式: n为多项式的项数
集合: n为元素个数
树: n为树的结点个数
图: n为图的顶点数或边数
一般情况下,不必计算所有操作的执行次数, 而只考虑算法中基本操作执行的次数, 它是问题规模n的某个函数, 用T(n)表示
因为小卓自己操作不当 后面的笔记 直接消失了 !!! 我心态崩了 好气啊---- 2022-3-1
将后面的过一遍,第二遍时候 再回来补充!!!