2020—2021—1学期 20202408《网络空间安全导论》第四周学习总结
第8章 抽象数据类型与子程序
8.1 抽象数据类型
-
定义:ADT,属性(数据和操作)明确地与特定实现分离的容器。
-
在计算领域,可以从应用层、逻辑层和实现层这三个方面观察数据。
-
数据结构(data structure):一种抽象数据类型中的复合数据域的实现。
-
容器(container):存放和操作其他对象的对象。
8.2 栈
-
栈和队列是抽象复合结构,二者经常被同时提及。
-
栈只能从一端访问栈中的元素。 后进先出(Last In First Out)
8.3 队列
- 队列中的项目从一端入,从另一端出。 先进先出(First In First Out)
8.4 列表
-
数组是内嵌结构,列表是抽象结构。
-
链式结构(linked structure):一个将数据项和找到下一项位置的信息保存到同一容器的实现方法。
8.5 树
- 是一种分层体系结构。
8.5.1 二叉树
-
二叉树(binary tree):具有唯一起始节点(根节点)的抽象复合结构,其中每个节点可以有两个子女节点,根节点和每个节点之间都有且只有一条路径。
-
根:树中唯一的开始节点。
-
叶节点(leaf node):没有子女的树节点。
8.5.2 二叉检索树
在二叉检索树中搜索
- 二叉检索树的搜索效率与树的形状有直接关系。树的形状是由项目插入树的顺序决定的。
构造二叉检索树
输出二叉检索树中的数据
8.5.3 其他操作
-
二叉检索树其实是和列表具有相同功能的对象,区别在于操作的有效性,而行为是相同的。
-
树的节点数:1加上左子树中的节点个数和右子树中的节点个数。树的定义引出了length操作的递归定义。
8.6 图
- 图(grath):由一组节点和一组把节点相互连接起来的边构成的数据结构。
- 顶点(vertex):图中的节点。
- 边(弧)(edge(arc)):表示图中两个节点的连接的顶点对。
- 无向图(undirected grath):其中的边没有方向的图。
- 有向图(directed grath(digrath)):其中的边从一个顶点指向另一个顶点(或同一个顶点)的图。
- 邻顶点(adjacent vertice):通过边连接起来的两个顶点。
- 路径(path):连接图中两个顶点的一系列顶点。
8.6.1 创建图
- 列表、栈、队列和树都是可容纳元素的容器。
- 不被纳入检索过程的算法是没有固定语义的:栈返回的元素是在其中停留时间最少的元素;队列返回的是在其中停留时间最长的元素。队列和树返回的信息都是被请求的。
- 许多信息可以被呈现在图上:顶点、边和权值。
8.6.2 图算法
- [ ] 三种经典的图搜索算法:
- 深度优先搜索
- 广度优先搜索
- 单源最短路搜索
8.7 子程序
- 许多子程序都是高级语言或语言附带库的一部分。
- 如果其中一个子程序需要传递信息,调用单元将会把值发送给子程序来使用。
8.7.1 参数传递
- 参数列表(parameter list):程序中两部分之间的通信机制。
- 形参(parameter):列在子程序名后的括号中的标识符。
- 实参(arguement):子程序调用中列在括号中的标识符。
8.7.2 值参与引用参数
- 传递参数的基本方式有两种,即通过值传递和通过引用(或地址)传递。
- 值参(value parameter):由调用单元传入实参的副本(写在留言板上)的形参。
- 引用参数(referlence parameter):由调用单元传入实参的地址(写在留言板上)的形参。
第9章 面向对象设计与高级程序设计语言
9.1 面向对象方法
9.1.1 面向对象
-
[ ] 在面向对象的思想中,数据和处理数据的算法绑定在一起,因此每个对象负责自己的处理(行为)。面向对象设计(OOD)的底层概念是类(class)和对象(object)。
-
对象:在问题背景中相关的事物或实体。
-
对象类(object class)或类:一组具有相似的属性和行为的对象的描述。
-
域(field):类中的特定项,可以是数据或子程序。
-
方法(method):定义了类的一种行为的特定算法。
9.1.2设计方法
-
[ ] 我们提出的分解过程有四个阶段。
-
集体讨论(头脑风暴):生成一份暂时的类列表
-
过滤:根据列表确定问题解决方案中的核心类
-
场景 :给每个类分配责任
封装(encapsulation):把数据和动作集中在一起,使数据和动作的逻辑属性与它们的实现细节分离。
-
责任算法
9.1.3一个计算机实例
9.2翻译过程
9.2.1编译器
- 编译器(compiler):把用高级语言编写的程序翻译成机器码的程序。
9.2.2解释器
- 解释器(interpreter):输入用高级语言编写得到程序,指导计算机执行每个语句指定的动作的程序。
- 字节码(byecode):编译java源代码使用的标准机器语言。
9.3 程序设计语言的范型
- 范型:用作模式或模型的实体和一组假设、概念、值和实践,构成了共享它们的 聚合体 观察现实的方式,尤其适用于精神学科。
- 有两种主要的范型:命令的和声明的,在每种中都有很多子范型。
9.3.1 命令式范型
-
面向过程的范型:伪代码示例
-
面向对象的范型:Java和Python是两种新式的面向对象编程语言。
-
[ ] C++和Java是命令式的语言,但就它们的范型而言又是混合的。
9.3.2 声明式范型
声明式范型是一个描述结果的模型,但是完成结果的过程则不被描述。这种范型中有两种基本模型:函数式和逻辑式。
-
函数式模型:基于函数的数学概念。计算通过对函数求值来实现,而问题求解通过函数调用来实现。因此基本的原理是函数的求值,而不是变量和赋值语句。
Scheme是解释型语言,因此结果在声明后立即显示。
-
逻辑编程基于象征逻辑的原则。这个模型包括了一系列关于对象的事实和 一系列关于对象间关系的规则。 一个程序包括了向这些对象和关系询问可以通过事实和规则推演的问题。
9.4 高级程序设计语言的功能性
- 两种伪代码结构——选择和重复(循环)是命令式语言的标志。
9.4.1 布尔表达式
- 布尔表达式(Boolean expression):一个标识符序列,标识符之间由相容的运算符分隔,求得的值是true或false。
- 一个布尔表达式可以是:
1.一个布尔变量
2.一个算术表达式加一个关系运算符,再加一个算术表达式
3.一个布尔表达式加一个布尔运算符,再加一个布尔表达式
9.4.2 数据归类
-
强类型化(strong typing):每个变量都有一个类型,只有这种类型的值才能存储到该变量中。
-
数据类型(data type):一组值以及能够应用于这种类型的值的基本操作集合的说明。其分为以下几种:
1.整数:整数数据类型表示的是一个整数值的范围,这个范围由表示整数值的字节数决定。
2.实数:实数数据类型表示的是特定精度的数的范围,与整数数据类型一样,这个范围由表示 实数值的字节数 决定。3.字符
4.布尔型
5.字符串:字符串是一个字符序列,在某些语言中这个序列通常被看作一个数据值。
6.声明(declaration):把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目。 -
保留字(reserved word):一种语言中具有特殊意义的字,不能用它作为标识符。
-
区分大小写(case sensitive):大写字母和小写字母被看作是不同的;两个拼写方法相同但大小写形式不同的标识符被看作是两个不同的标识符。
9.4.3 输入/输出结构
- Read表达式负责从外部环境获取一个值,并将其存入程序内的变量。
- Write或Print表达式负责向人们显示消息。
- 所有输入语句都由三部分组成,即要存放数据的变量的声明、输入语句和要读入的变量名以及数据流自身。
9.4.4 控制结构
- 控制结构(control structure):确定程序中的其他指令的执行顺序的指令。
- 异步(asynchronous):不与计算机中的其他操作同时发生;换句话说,与计算机的动作不同步。
9.5 面向对象语言的功能性
- 面向对象语言中三个必要的组成部分:封装、继承和多态。
9.5.1 封装
- 封装(encapsulation):实施信息隐蔽的语言特性。
- 对象类或类(问题求解阶段)(object class or class(problem-solving phase)):属性和行为相似的一组对象的说明。
- 对象(问题求解阶段)(object(problem-solving)):与问题背景相关的事物或实体。
- 对象(实现阶段)(object(implementation phase)):类的一个实例。
- 类(实现阶段)(class (implementation phase)):对象的模式。
9.5.2 类
- 实例化(instantiate):创建类的对象。
9.5.3 继承
- 继承(inheritance):类获取其他类的属性(数据域和方法)的机制。
9.5.4 多态
- 多态(polymorphism):一种语言的继承体系结构中具有两个同名方法且能够根据对象应用合适的方法的能力。
- 继承和多态结合在一起使程序员能够构造出不同应用程序中可以重复使用的体系结构。
9.6 过程设计与面向对象设计的区别
- 在面向过程的版本中,列表被呈现为传递给子程序的记录,以便子程序可以对其操作。操作它的数据结构和子程序是用户程序的一部分。在 面向对象的版本中,类对象的实现通过封装实现对用户的隐藏。