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
    • 整数、实数、字符和布尔型称为简单数据类型或原子数据类型,因为每个值都是独立的,不可分割;字符串具有复合数据类型的特征的数据类型,但通常被看作简单数据类型
    • 字符串:我们用单引号圈起字符,用双引号圈起字符串。有些高级语言采用同样的符号圈起字符串和字符,因此一个字符和只包含一个字符的字符串之间没有区别。
  • 声明
    • 把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目
posted @ 2021-10-17 22:55  20212416谢晓宁  阅读(37)  评论(0)    收藏  举报