2021-2022-1学期20212416《网络空间安全专业导论》第四周学习总结
=Chapter 8抽象数据类型和子程序=
抽象数据类型
- 属性(数据和操作)明确地与特定实现分离的容器
- 数据结构:一种抽象数据类型中的符合数据域的实现
- 容器:存放和操作其他对象的对象
栈
- 栈是一种抽象复合结构,只能从一端访问栈中的元素,OR删除的项总是在栈中时间最短的项目
- 插入Push
- 删除Pop
队列
- 概念:插入操作在队列的尾部进行,删除在队列的头部进行OR删除的总是在队列中时间最长的项目
- 术语:
- 插入:Enqueue/Enque/Enq/Enter/Insert
- 删除:Dequene/Deque/Deq/Delete/Remove
列表
- 属性:项目是同构的,项目是线性的,列表是变长的
- 操作:
- 插入Insert
- 删除Delete
- 检索是否存在IsThere
- 报告列表中的项目数GetLength
- 允许用户查看序列中的每一项Resert、GetNext、MoreItems
- 因为项目可以被删除和检索,所以列表中的项目必须能够相互比较
- 链式结构:一个将数据项和找到下一项位置的信息保存到同一容器的实现方法
- 无序列表的顺序不重要,项目只是随意地被放入其中;有序列表中,项目之间具有语义关系
树
二叉树
- 二叉树是一种抽象结构,其中每个节点可以有两个后继节点,叫做子女;树的头部是一个起始节点,叫作根;子节点在左边称为左子女,右边类比;根节点和每个节点之间都有且只有一条路径
- 叶节点:没有子女的树节点
二叉检索树
- 树类似于一个无序列表,二叉检索树就像已排序的列表
- 特点:任何节点的值都要大于它的左子树中的所有节点的值,并且要小于它的右子树中的所有节点的值
在二叉检索树中搜索
- 如果current指向一个节点,那么info(current)指的就是这个节点中的用户数据,left(current)指向的是current的左子树的根节点,right(current)指向的是current的右子树的根节点。null是一个特殊值,说明指针指向空值。
- 该算法的参数是要搜索的项目和数(子树)的根节点
- 每次比较操作,不是找到了要搜索的项目,就是把树减小了一半
- 二叉检索树的搜索效率与树的形状有直接关系,树的形状是由项目插入树的顺序决定的
构造二叉检索树
- 如果在搜索路径中没有找到要找的项目,那么最后达到的就是这个项目应该在的位置
输出二叉检索树中的数
- 要输出根的值,必须先输出它的左子树中的所有值,输出了根的值后,还必须输出它的右子树中的所有值。输出左右子树中的值也一样。
其他操作
- Length:计算树中的节点数
图
- 概念
- 图:由一组节点和一组把节点相互连接起来的边构成的数据结构
- 顶点:图中的节点
- 边(弧):表示图中的两个节点的连接的顶点对
- 无向图:其中的边没有方向的图
- 有向图:其中的边是从一个顶点指向另一个顶点(或同一个顶点的图)
- 邻顶点:通过边连接起来的两个顶点
- 路径:连接图中两个顶点的一系列顶点
创建图
- 不被纳入检索过程的算法是没有固定语义的,但在图中定义的算法可以解决实际的问题
- 创建一个表格的操作
- 在表格中添加一个顶点
- 在表格中添加一条边
- 在表格中添加一个权值
图算法
- 深度优先搜索:当我们试图在两个顶点间寻找路径时,用栈来存储访问的顶点。用深度优先搜索来检查第一个与起点相邻的顶点。如果它是终点,则搜索结束。否则,检查所有与第一个顶点相邻的顶点。 同时我们需要存储其他和起点相邻的顶点,如果不存在从 与起点相邻的第一个顶点出发的路径,那么我们回到顶点,继续尝试第二个顶点、第三个顶点……
- 一旦我们把一个顶点的所有相邻顶点都放到栈内,就标记这个点为访问过。
广度优先搜索------------恢复内容开始------------
老师,真的很抱歉,时间紧迫,我只写了这么多……
=Chapter 8抽象数据类型和子程序=
抽象数据类型
- 属性(数据和操作)明确地与特定实现分离的容器
- 数据结构:一种抽象数据类型中的符合数据域的实现
- 容器:存放和操作其他对象的对象
栈
- 栈是一种抽象复合结构,只能从一端访问栈中的元素,OR删除的项总是在栈中时间最短的项目
- 插入Push
- 删除Pop
队列
- 概念:插入操作在队列的尾部进行,删除在队列的头部进行OR删除的总是在队列中时间最长的项目
- 术语:
- 插入:Enqueue/Enque/Enq/Enter/Insert
- 删除:Dequene/Deque/Deq/Delete/Remove
列表
- 属性:项目是同构的,项目是线性的,列表是变长的
- 操作:
- 插入Insert
- 删除Delete
- 检索是否存在IsThere
- 报告列表中的项目数GetLength
- 允许用户查看序列中的每一项Resert、GetNext、MoreItems
- 因为项目可以被删除和检索,所以列表中的项目必须能够相互比较
- 链式结构:一个将数据项和找到下一项位置的信息保存到同一容器的实现方法
- 无序列表的顺序不重要,项目只是随意地被放入其中;有序列表中,项目之间具有语义关系
树
二叉树
- 二叉树是一种抽象结构,其中每个节点可以有两个后继节点,叫做子女;树的头部是一个起始节点,叫作根;子节点在左边称为左子女,右边类比;根节点和每个节点之间都有且只有一条路径
- 叶节点:没有子女的树节点
二叉检索树
- 树类似于一个无序列表,二叉检索树就像已排序的列表
- 特点:任何节点的值都要大于它的左子树中的所有节点的值,并且要小于它的右子树中的所有节点的值
在二叉检索树中搜索
- 如果current指向一个节点,那么info(current)指的就是这个节点中的用户数据,left(current)指向的是current的左子树的根节点,right(current)指向的是current的右子树的根节点。null是一个特殊值,说明指针指向空值。
- 该算法的参数是要搜索的项目和数(子树)的根节点
- 每次比较操作,不是找到了要搜索的项目,就是把树减小了一半
- 二叉检索树的搜索效率与树的形状有直接关系,树的形状是由项目插入树的顺序决定的
构造二叉检索树
- 如果在搜索路径中没有找到要找的项目,那么最后达到的就是这个项目应该在的位置
输出二叉检索树中的数
- 要输出根的值,必须先输出它的左子树中的所有值,输出了根的值后,还必须输出它的右子树中的所有值。输出左右子树中的值也一样。
其他操作
- Length:计算树中的节点数
图
- 概念
- 图:由一组节点和一组把节点相互连接起来的边构成的数据结构
- 顶点:图中的节点
- 边(弧):表示图中的两个节点的连接的顶点对
- 无向图:其中的边没有方向的图
- 有向图:其中的边是从一个顶点指向另一个顶点(或同一个顶点的图)
- 邻顶点:通过边连接起来的两个顶点
- 路径:连接图中两个顶点的一系列顶点
创建图
- 不被纳入检索过程的算法是没有固定语义的,但在图中定义的算法可以解决实际的问题
- 创建一个表格的操作
- 在表格中添加一个顶点
- 在表格中添加一条边
- 在表格中添加一个权值
图算法
- 深度优先搜索(寻找最喜爱的路线):
- 当我们试图在两个顶点间寻找路径时,用栈来存储访问的顶点
- 每经过一个顶点,就在其相邻的点中挑选最喜欢的作为下一个想要访问的
- 一旦我们把一个顶点的所有相邻顶点都放到栈内,就标记这个点为访问过。
- 广度优先搜索(寻找停留次数最少路线):
- 采用队列来保存元素顺序
- 不断地把每个经过的顶点周围可直达的城市(除了已访问过的)压入队列,直到目的终点被压入队列
- 单源最短路搜索
子程序
- 许多子程序都是高级语言或语言附带库的一部分
- 调用子程序:查询子程序的名字
参数传递
- 概念
- 参数列表:程序中两部分之间的通信机制
- 形参:列在子程序名后的括号中的标识符
- 实参:子程序调用中列在括号中的标识符
- 子程序中的动作用形参定义,当动作执行时,实参将逐个代替形参,最常见的是根据位置进行替代。
- 调用子程序时传递的实参个数必须与子程序定义中的形参个数相同。
值参与引用参数
- 概念
- 值参:由调用单元传入实参的副本(写在留言板上)的形参,
通过值 - 引用参数:由调用单元传入实参的地址(写在留言板上)的形参,
通过引用(地址)
- 值参:由调用单元传入实参的副本(写在留言板上)的形参,
- 有返回值的子程序: RETURN IsThere子程序
- 无返回值的子程序:Delete Insert子程序
- 不返回特定的值,但它们确实通过参数返回了改变的列表
Chapter9 面向对象设计与高级程序设计语言
面向对象方法
- 自顶向下设计的重点就是任务,而面向对象设计的重点是对象以及它们在问题中的交互
面向对象
- 概念
- 对象:在问题中相关的事物或实体
- 对象类或类:一组具有相似的属性和行为的对象的描述
- 字段:表示类的属性
- 方法:定义了类的一种行为的特定算法
设计方法
- 头脑风暴:一种集体问题求解的方法,包括集体中每个成员的自由发言
- 过滤:根据头脑风暴生成的暂时的类列表,确定问题中的核心类,把重复、多余的筛掉。
- 场景:给每个类分配责任,最终,责任会被实现为子程序
- 重点在于“任务是什么”而非“如何执行它”
- 封装:把数据和动作集中在一起,使动作和数据的逻辑属性和实现细节分离。封装是抽象的关键。
- 责任的命名规则通常是get加数据名,GetName
- 行为的责任与自顶向下的区别:对象只得到消息因为其知道自己的数据
对象作为参数传递
- 责任算法:
- 一般算法都相当短
- 自顶向下设计算法的方法通常也适用于设计动作责任算法
- 总结:Grady Booch:"如果要编写程序性的代码,就用下划线标出动词,如果要编写面向对象的程序,请标出名词。”
示例
- 问题
- 头脑风暴和过滤
- 利用问题陈述中的动词,可以顺利地设计出责任
- 以一个类创建CRC卡:
- 要注明它大部分是用类库中的类实现的
- 按照惯例,当一个类达到CRC的阶段,类名以大写字母开头
- 责任算法
- 调用子程序的方法:对象名加点号再加要调用的方法
-面向对象设计所创建的一些类可适用于其他背景,因为每个类都是自我约束的, 可复用性是面向对象设计的一大优点。
- 调用子程序的方法:对象名加点号再加要调用的方法
翻译过程
编译器
- 概念:把用高级语言写成的程序翻译成机器码的程序
- 编译器是一种程序,要编译一个程序,就必须具有这个编译器在特定机器上的机器码版本
解释器
- 翻译并立即运行
- Java
- 可移植性是最重要的特性
- 字节码:编译Java源代码使用的标准机器语言
- Java编译器输出的程序将被解释,而不是直接被执行
- Java程序总是被翻译成字节码,还有一些语言的编译器是把语言翻译成字节码而不是机器码,如Ada编译器
程序设计语言范型
命令式范型
- 包括FORTRAN/BASIC/C/Pascal/C++
- 面向过程的范型:一个程序是子程序分层次构成的,每一层执行整个问题求解的一个必要的特定任务
- 面向对象的范型:数据对象是活跃的,对象和操作对象的代码绑定在一起,使得每个对象负责控制自己的操作 如SIMULA/Smalltalk、Java/C++
声明式范型
- 是一个描述结果的模型,但完成结果的过程则不被描述
- 函数式模型
- 计算通过对函数求值来实现,而问题求解通过函数调用来实现
- 基本原理是函数的求值,而不是变量和赋值语句
- 没有循环结构,重复通过递归函数来表示
- 解释型语言,结果在声明后立即显示,用#;>作为提示来输入表达式,没有提示符的行是系统返回的
- 逻辑编程
- 包括一系列关于对象的事实和一系列关于对象间关系的规则
- PROLOG程序包含了三种语句:一种声明了对象及对象的事实和一系列关于对象间关系的事实;一种定义了对象及对象之间关系的规则;第三种询问对象及对象之间关系的问题
- 在PROLOG系统中,常量以小写字母开头,变量以大写字母开头。事实上,我们以一个常量代替一个变量来询问事实真相
高级程序设计语言的功能性
- 两种伪代码结构——选择和重复是命令式语言的标志;在高级语言中,选择和迭代操作非常简单,但子程序和参数传递则较为复杂
布尔表达式
- 程序设计语言提问的方式:写出语句(断言或条件),然后测试它们是true还是false。
- 布尔表达式:一个标识符序列,标识符之间由相容的运算符分隔,求得的值是true或false
- 布尔变量是内存中的一个地址,由存放true或false的标识符引用
数据归类
- 强类型化:每个变量都有一个类型,只有这种类型的值才能存储到该变量中
- 数据类型:一组值以及能够应用于这种类型的值的基本操作集合的说明
- 整数:
- 整数数据类型表示的是一个整数值的敢为,这个范围是由表示整数值的字符串决定的
- 不同语言的整数除法返回的结果不同,有的返回一个实数,有的返回整数值
- 实数:
- 实数数据类型表示的是特定精度的数的范围
- 实数通常不精确
- 字符:
- 对字符进行算术运算是毫无意义的,许多强类型化的语言都不允许进行这种运算。但比较字符却是有意义的,所以可以对字符进行关系运算
- 布尔型:true和false
- 整数、实数、字符和布尔型称为简单数据类型或原子数据类型,因为每个值都是独立的,不可分割;字符串具有复合数据类型的特征的数据类型,但通常被看作简单数据类型
- 字符串:我们用单引号圈起字符,用双引号圈起字符串。有些高级语言采用同样的符号圈起字符串和字符,因此一个字符和只包含一个字符的字符串之间没有区别。
- 整数:
- 声明
- 把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目
浙公网安备 33010602011771号