2020-2021学期 20202414黄若宇 《网络空间安全专业导论》第四周学习总结
第八章 抽象数据类型与子程序
8.1抽象数据类型
抽闲数据类型(ADT)是属性明确地与特定实现分离的容器。
数据结构:一种抽象数据类型中的复合数据域的实现。
容器:存放和操作其他对象的对象。
8.2 栈
栈是一种抽象复合结构,只能从一端访问栈中的元素。可以在第一个位置插入元素,也可以删除第一个元素。
这种类型的处理称为LIFO,即先进后出。
在栈中,插入操作叫作Push,删除操作叫作Pop。
8.3 队列
队列也是一种抽象结构,队列中的项目从一端输入,从另一端出。这种行为称作FIFO,即先进先出。可以用日常生活中的排队的情况来理解这种结构。
8.4 列表
列表不论是在日常生活还是编程中都很常见。
列表有三个属性特征:项目是同构的,项目是线性的,列表是变长的。
列表也可以被形象化为链式结构。
链式结构是一个将数据项和找到下一项位置的信息保存到同一容器的实现方式。
8.5 树
上述三种抽象数据结构本质上都是线性的,只模拟了一种数据关系。更复杂的关系需要更浮渣的结构来表示,而树将表示更为复杂的关系。
如图
8.5.1 二叉树
二叉树是一种常用的树,其中每个节点可以有两个后继节点,叫作子女(真形象),子女也可以有自己的子女。
树的头部是一个起始节点,也叫作根他不是任何节点的子女。
如果一个节点没有子女,那么它叫作树叶。
在二叉树中,根节点和每个节点之间有且只有一条路径。
8.5.2 二叉检索树
树类似于一个无序列表,而二叉检索树类似于一个已排序的列表。
二叉检索树具有语义属性来刻画书中节点上的值,即任何节点的值都要大于它的左子树中的所有节点的值,且小于右子树中所有的节点的值。
1. 在二叉检索树中搜索
根据上述二叉检索树的属性,我们可以用对比元素大小的方法来排除分支的方法(类似于二分检索法)来搜索出想要的元素。
用算法表示如下:
IsThere(tree item)
IF (tree is null)
RETURN FALSE
ELSE
IF(item equals info(tree))
RETURN TRUE
ELSE
IF(item<info(tree))
IsThere(left(tree),item)
ELSE
lsThere(right(tree),item)
2. 构造二叉检索树
与在二叉检索树中搜索类似,通过比较元素大小来不断确定元素插入的位置,最终可以构造出一个二叉检索树。
3. 输出二叉检索树中的数据
要输出二叉检索树的数据,我们需要用到一个递归算法:
if(tree is NOT null)
print(left(tree))
write info(tree)
print(right(tree))
8.5.3 其他操作
树的定义给出了树的Length的递归定义
if(tree is null)
RETURE
ELSE
RETURE Length(left(tree))+length(right(tree))+1
8.6 图
树的一个节点至多只有一个指向它的节点。如果去掉这种约束,就得到另一种数据结构图。
图:由一组节点和一组把节点相互连接起来的边构成的数据结构。
顶点:图中的节点。
边(弧):表示图中两个节点的连接的顶点对。
图分为两种:无向图和有向图。
无向图:其中的边没有方向的图。(其中的边类似于现实中的双向车道) 有向图:其中的边是从一个顶点指向另一个顶点(或同一个顶点)的图。(边类似于单车道)
无向图:其中的边没有方向的图。 有向图:其中的边是从一个顶点指向另一个顶点(或同一个顶点)的图。
8.6.1 创建图
列表、栈、队列和树都是可容纳元素的容器。用户根据特定的问题选择最合适的容器,不被纳入检索过程的算法是没有固定语义的:栈返回的元素是在其中停留时间最少的元素。队列返回的是在其中停留时间最长的元素。队列和树返回的信息都是被请求的。然而不同的是,在图中定义的算法可以解决实际的问题。
8.6.2 图算法
1. 深度优先搜索
假设从一个点到另一个点,将如何查找?我们会先检查与起点相邻的顶点,如果是终点,结束,否则继续搜索与第一个顶点相邻的顶点。
这种搜索叫做深度优先搜索,因为我们走向最深的分支。但你必须回溯时,选择离你无法走通位置的最近的分支继续搜索。相比于更早时候可选的其他分支,你会选择一条尽可能可以走远的路。
2. 广度优先搜索
深度优先搜索算法从起点出发尽可能地往更远的路径检查,而不是优先选择检查与起点相邻的第二个顶点。相反,广度优先搜索会优先检查所有与起点相邻的顶点,而不是检查与这些顶点相连的其他顶点。
3. 单元最短路径搜索
我们想要检索当前顶点最近的顶点,也就是与此顶点相连的边权值最小的顶点。我们称这种抽象容器为优先队列,被检索的元素是在队列中拥有最高优先度的元素,如果我们让英里数最为优先,则可以弹出一系列包括两个顶点和两个顶点间距离的元素。
8.7 子程序
许多子程序都是高级语言或语言附带库的一部分。当一个程序员需要计算其中一个这样的值时,程序员只要查询可以计算该值的子程序的名字,然后调用该子程序来进行计算即可。
8.7.1 参数传递
参数列表:程序中两部分之间的通信机制。 形参:列在子程序名后的括号中的标识符。 实参:子程序调用中列在括号中的标识符。
8.7.2 值参与引用参数
值参:由调用单元传入实参的副本的形参。 引用参数:由调用单元传入实参的地址的形参。
第九章 面向对象设计与高级程序设计语言
9.1 面向对象方法
面向对象设计的终点是对象以及它们在问题中的交互。一旦收集到了问题中的所有对象,它们就能构成问题的解决方案。
9.1.1 面对对象
在面对对象的思想中,数据和处理数据的算法绑定在一起因此,每个对象负责自己的处理。面向对象设计(OOD)的底层概念是类和对象。
对象:在问题背景中相关的食物或实体 对象类或类:一组具有相似的属性和行为的对象的描述 字段:表示类的属性 方法:定义了类的一种行为的特定算法
9.1.2 设计方法
面对对象设计共有四个阶段
1. 头脑风暴
通过头脑风暴,得到具有创新性的解决方案。
2. 过滤
在头脑风暴之后,将得到一份暂时的类列表。这个列表中,有些类会因为各种原因需要排除出去,留下来的类将到下一阶段。
3. 场景
这个阶段的目标是给每个类分配责任,最终责任将被实现为子程序。
4.责任算法
最终必须为责任编写算法。
9.2 翻译过程
第六章中介绍了汇编语言,用汇编语言写的程序要由汇编器翻译成机器码。使用高级语言,我们也需要其他软件进行翻译。
9.2.1 编译器
编译器:把用高级语言编写的程序翻译成机器码的程序。
9.2.2 解释器
解释器:输入用高级语言编写的程序,指导计算机执行每个语句指定的动作的程序。
9.3 程序设计语言范型
9.3.1 命令式范型
命令式范型具有顺序执行指令的特征,变量的使用代表了内存地址,而使用赋值语句则改变这些变量的值。
1. 面对过程的范型
面向过程编程是一种命令式模型,在这里语句被分组成子程序。一个程序是子程序分层次构成的,每一层执行整个问题求解的一个必要的特定任务。
2. 面对对象的范型
面向对象视角是与对象交互的一种方式。以对象概念为中心,一切集中在对象上、编写代码时是围绕对象组织的。
9.3.2 声明式范型
声明式范型是一个描述结果的模型。
1. 函数式模型
函数式模型基于函数的数学概念,基本原理是函数 的求值。
2. 逻辑编程
逻辑编程基于数理逻辑的原则,用逻辑的规则来推演出事实和规则的答案。
9.4 高级程序设计语言的功能性
数据类型:一组值以及能够应用于这种类型的值的基本操作集合的说明。
大多数高级语言都有四种数据类型:整数,实数,字符和布尔型。
强类型:每个变量都有一个类型,只有这种类型的值才能被存储到该变量中。
总结和反思
对于第八章中在图中搜索的过程有点难以完全理解其过程。对于第九章中面向对象设计和自顶向下的设计的过程不是很能理解,通过查阅网上资料也只能稍微对其有点理解。