2020-2021-1 学期 20202419《网络空间安全专业导论》第四周学习总结

抽象数据类型(ADT)

属性(数据和操作)明确地与特定实现分离的容器

数据结构:一种抽象数据类型中地复合数据域地实现

容器:存放和操作其他对象地对象

栈是一种抽象复合结构,只能从一端访问栈中的元素。称为LIFO,意思是后进先出。另一种说法是删除的项总是在栈中时间最短的项目。插入操作叫做Push(推进),删除操作叫做Pop(弹出)。

队列

队列也是一种抽象结构,但是:队列中的项目只能从一端入,从另一端出,这种行为称为FIFO,意思是先进先出。(类比一下超市排队)删除的总是在队列中时间最长的项目。插入操作没有任何约束,整个FIFO行为就体现在删除操作上。插入操作和删除操作没有标准的相关术语!插入操作在队列的尾部进行,删除操作在队列的头部进行。

列表

列表有三个属性特征:项目是同构的、项目是线性的、列表是变长的
列表通常提供插入一个项目的操作、删除项目的操作、检索一个项目是否存在以及报告列表中项目数量,还有机制允许用户查看序列中的每一项。因为项目可以被删除和检索,所以列表中的项目必须能够相互比较。

操作
插入 Insert
删除 Delete
检索 IsThere
报告数量 GetLength
查看每一项 Reset、GetNext、Moreltems

不要把列表误认为是数组!!!!! 数组是内嵌结构,而列表时抽象结构。但是列表应用于数组之中。
列表也可以被形象化为链式结构,链式结构以节点的概念为基础,一个节点由两部分构成:用户的数据和指向列表的下一个节点的链接或指针。列表的最后一个节点的指针变量存放的是表示列表结束的符号,通常是null,用“/表示。

链式结构:一个将数据项和找到下一项位置的信息保存到同一容器的实现方法。

无序列表的顺序并不重要,项目只是随意被放入其中。有序列表中,项目之间具有语义关系。除了第一个项目之外所有项目都存在某种排序关系。除了最后一个项目所有项目都有着相同的关系。

分类一般发生在高层,随着不断向下的移动,标签会变得更加具体。这种分层结构叫做树。

二叉树

二叉树:具有唯一起始节点(根节点)的抽象符合结构,其中每个节点可以由两个子女节点,根节点和每个节点之间有且只有一条路径。

根:树中唯一的开始节点。

叶节点:没有子女的树节点

二叉检索树

二叉检索数具有二叉树的形状属性。

  1. 在二叉检索树中搜索
  2. 构造二叉检索树
  3. 输出二叉检索树中的数据

其他操作

树有一种约束,也就是一个节点至多只有一个指向它的节点(父母),如果去掉这种约束,就得到了另外一种数据结构——。图由一组节点和连接节点的线段构成。

:由一组节点和一组把节点相互连接起来的边构成的数据结构。
顶点:图中的节点。
边(弧):表示图中两个节点的连接的顶点对。

图中的顶点表示对象,那么边则描述了定点之间的关系。这种图分为两种:

无向图:其中的边没有方向的图。
有向图:其中的边是从一个顶点指向另一个顶点(或同一个顶点)的图。

如果两个顶点有一条边相连,则把他们称为邻顶点,两个顶点通过一条有顺序的路径相连。

创建图

列表、栈、队列和树都是可容纳元素的容器。用户根据特定的问题选择最合适的容器,不被纳入检索过程的算法是没有固定语义的:栈返回的元素是在其中停留时间最少的元素。队列返回的是在其中停留时间最长的元素。队列和树返回的信息都是被请求的。然而不同的是,在图中定义的算法可以解决实际的问题

图算法

深度优先搜索

这种搜索叫做深度优先搜索,因为我们走向最深的分支。但你必须回溯时,选择离你无法走通位置的最近的分支继续搜索。相比于更早时候可选的其他分支,你会选择一条尽可能可以走远的路。

广度优先搜索

因为栈是按照元素出现的相反顺序来保存元素,而现在我们想回溯到尽可能远,以找到从最初的顶点出发的路径。那么我们就不再适合用栈了,在这次我们只要把栈替换成队列,就可以成功。

深度优先搜索算法从起点出发尽可能地往更远的路径检查,而不是优先选择检查与起点相邻的第二个顶点。相反,广度优先搜索会优先检查所有与起点相邻的顶点,而不是检查与这些顶点相连的其他顶点。

单源最短路搜索

所以这个时候我们就需要单源最短路搜索了。我们需要辅助的数据结构存储此后处理的城市,最后广度优先搜索算法可以找到最小换成次数的航线。但是这并不代表最短的总距离。最短路遍历必须说明在搜索过程中城市间的距离,而不是像深度优先搜索和广度优先搜索一样。我们想要检索当前顶点最近的顶点,也就是与此顶点相连的边权值最小的顶点。我们称这种抽象容器为优先队列,被检索的元素是在队列中拥有最高优先度的元素,比如这里,我们就让距离数最为优先,则可以弹出一系列包括两个顶点和两个顶点间距离的元素。

子程序

许多子程序都是高级语言或语言附带库的一部分。如果一个子程序需要传递信息,调调用单元将会把值发送给子程序来使用。

参数传递

参数列表是子程序要使用标识符或值的列表,它放置在子程序名后的括号中。由于子程序是在被调用之前定义的,所依它不知道调用单元会传递什么样的变量。为了解决这个问题,在子程序后面的括号中声明了一个变量名的列表。这些标识符称为形参。当子程序被调用时,调用单元将列出子程序名,并在其后的括号中列出一系列标识符。这些标识符叫做实参。实参表示的是调用单元中的真实变量。

参数列表:程序中两部分之间的通信机制。
形参:列在子程序名后的括号中的标识符。
实参:子程序调用中列在括号中的标识符。

可以把形参看成是子程序中使用的临时标识符。当子程序被调用时,调用单元会把真正的标识符的名字发送给子程序。子程序中的动作则是用形参定义的。当动作执行时,实参将逐个替代形参。

当子程序被调用时候,它将得到一个实参列表。实参将告诉子程序在哪里可以找到它要用的值。当子程序用到第一个形参时,子程序会通过形参在留言板上的相对位置访问实参。调用子程序时传递的实参个数必须与子程序定义中的形参个数相同。但是形参和实参是通过位置匹配的,所以名字不必一致。以这种方式传递的形参通常叫做位置形参

值参与引用参数

传递参数的基本方式有两种,即通过值传递和通过引用传递。如果一个形参是值参,调用单元将把实参的一个副本传递给子程序。如果一个形参是引用参数,调用单元将把实参的地址传递给子程序。所以子程序不能改变实参内容(因为接受的只是一个副本),相反,子程序可以改变调用单元传递给引用参数的任何实参,因为子程序操作的是实际变量,而不是副本。

值参:由调用单元传入实参的副本的形参。
引用参数:由调用单元传入实参的地址的形参。

有的子程序是有返回值的,在这种情况下,子程序被调用的方式是用它的名字和参数的表达式;子程序也可能是没有返回值的,在这种情况下,调用程序用子程序的名字作为声明。

面向对象设计与高级程序设计语言

面向对象方法

面向对象的设计方法是用叫做对象的独立实体生成解决方案的问题求解方法,对象由数据和处理数据的操作方法构成。面向对象设计的重点是对象以及它们在问题中的交互。

面向对象

在面向对象的思想中,数据和处理数据的算法绑定在一起,因此每个对象负责自己的处理(行为)。面向对象设计(OOD)的底层概念是类和对象。

对象:在问题背景中相关的事物或实体。
对象类/类:一组具有相似的属性和行为的对象的描述。
字段:表示类的属性。
方法:定义了类的一种行为的特定算法。

设计方法

头脑风暴

在面向对象的问题求解背景中,头脑风暴是一种集体行为,为的是生成解决某个特定问题要用到的候选类的列表。

过滤
场景

这个阶段的目标是给每个类分配责任。责任的类型由两种,即自身必须知道什么(知识)和类必须知道什么(行为)。

封装:把数据和动作几种在一起,是数据和动作的逻辑属性与它们的实现细节分离。

责任算法
总结

示例

翻译过程

编译器

编译器:把用高级语言编写的程序翻译成机器码的程序。

解释器

解释器:输入用高级语言编写的程序,指导计算机执行每个语句指定的动作的程序。、
字节码:编译Java源代码使用的标准机器语言。

解释器在翻译过语句之后会立即执行这个语句。
第二代高级语言可以分为两种,一种是要编译的,一种是要解释的。

程序设计语言范型

范型:“一种模式或事物的实例”

命令式范型

冯诺伊曼顺序顺序指令模型在内存中操作数值,这给了编程语言所用的绝大多数常用模型巨大的影响:命令式模型。

面向过程的范型

面向过程编程是一种命令式模型。

面向对象的范型

面向对象视角是与对象交互的一种方式。每个对象负责执行它自己的动作。
在面向过程的范型中,数据被认为是被动并且被程序所操控的。
在面向对象的范型中,数据对象是活跃的。

声明式范型

声明式范型是一个描述结果的模型,但是完成结果的过程则不被描述。

函数式模型

函数式模型基于函数的数学概念。计算通过对函数求值来实现,而问题求解通过函数调用来实现。因此基本的原理是函数的求值,而不是变量和赋值语句。

逻辑编程

逻辑编程基于数理逻辑的原则。这个模型包含了一系列关于对象的事实和一系列关于对象关系的规则。一个程序包括了向这些对象和关系询问可以通过事实和规则推演的问题。

高级程序设计语言的功能性

布尔表达式

布尔表达式是一个标识符序列,标识符之间由相容的运算符分隔,求得的值是true或false。

数据归类

只能在变量中存储合适的类型的要求叫做强类型化

数据类型是描述一组数值和一组可以应用在这种类型的数值上的基本操作。
大多数高级语言都有四种数据类型:整数、实数、字符和布尔型
声明是把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目。
保留字是一种语言中具有特殊意义的字,不能用它作为标识符。
注意C++、Java、Python和VB.NET是区分大小写的,这意味着大小写不同的同一标识符会被认为是不同的词。

输入/输出结构

高级语言把输入的文本数据看作一个分为多行的字符流。字符的含义由存放值的内存单元的数据类型决定输出与基础所有输入语句都由三部分构成:要存放数据的变量的声明、输入语句和要读入的变量名以及数据流自身。
在非强类型语言中,输入的格式决定了类型。 输出语句创建字符流。在强类型语言中不管输入输出语句的语法或输入输出流在哪,处理的关键在于数据类型。数据类型确定字符是如何被转换为位模式以及如何被转换为字符。

控制结构

重复、选择和子程序,这种结构叫做控制结构,因为他们决定了其他指令在程序中被执行的顺序。
1、嵌套逻辑
2、异步处理
异步:不与计算机这种的其他操作同时发生。

面向对象语言的功能性

封装

封装:实施信息隐蔽的语言特性
对象(问题求解阶段):与问题背景相关的事物或实体
类(实现阶段):对象的模式
对象类或类(问题求解阶段):属性和行为相似的一组对象的说明
对象(实现阶段):类的一个实例

如果用标识符来代表一个类,那么必须在使用前显式地询问即将被创建的类。也就是需要实例化这个类,以获取符合这种模式的对象。

实例化:创建类的对象

继承

继承:类获取其他类的属性(数据字段和方法)的机制

多态

多态是语言在运行时确定给定调用将执行哪些可能的方法的能力。

过程设计与面向对象设计的区别

在面向过程的版本中,列表被呈现为传递给子程序的记录,以便子程序可以对其操作。操作它的数据结构和子程序时用户程序的一部分。在面向对象的版本中,类对象的实现通过封装实现对用户的隐藏。

导图:

posted @ 2020-11-05 12:23  20202419罗骜  阅读(89)  评论(0编辑  收藏  举报