2019-2020-1学期20192429《网络空间安全专业导论》第四周学习总结
# 第八章 抽象数据类型与子程序 #
8.1 抽象数据类型
- 抽象数据类型(Abstract Data Type,ADT):属性(数据和操作)明确地与特定实现分离的容器
- 目标:通过抽象减小复杂度。
Q:如何通过抽象减小复杂度 - 计算机领域,可以通过从应用层,逻辑三个方面观察数据层和实现层
- 应用(或用户)层:特定问题中的数据的视图
- 逻辑(或抽象)层:数据值(域)和处理它们操作的抽象视图
- 实现层:明确表示出了存放数据项的结构,并用程序设计语言对数据的操作进行编码
- 数据结构:一种抽象数据类型中的复合数据域的实现
- 容器:存放和操作其他对象的对象
Q:对象是什么?
8.2 栈——同队列语言为抽象复合结构 - LIFO(Last In First Out)
- 另一种描述栈的访问行为的说法是删除的项总是在栈中时间最短的项目
- 插入操作:Push(推进)
- 删除操作:Pop(弹出)
WHILE(more data) Read value Puch(myStack value) WHILE(NOT Is Empty(myStack)) Pop(myStack value) Write value
8.3 队列——一种抽象结构
- FIFO(First In First Out):插入操作在队列的rear(尾部)进行,删除操作在队列的front(头部)进行
- 另一种描述队列的访问行为的说法是删除的总是在队列中时间最长的项目。插入操作没有任何约束;整个FIFO都体现在删除操作上。
- 插入操作:Equeue Enque Enq Enter Inster
- 删除操作:Dqueue Deque Deq Delete Remove
WHILE(more data) Read value Enque(myQueue value) WHILE(NOT Is Empty(myQueue)) Deque(myQueue value) Write value
Q:为什么队列不是复合结构
8.4 列表 - 列表三个属性特性:项目是同构的,项目是线性,列表是变长的。
- 线性:每个项目除了第一个都有一个独特的组成部分在它之前,除了最后一个也都有一个独特的组成部分在它之后
- 链式结构(Linked structuer):一个将数据项和找到下一项位置的信息保存到同一容器的实现方法
8.5 树
8.5.1 二叉树——抽象结构
- 子女:每个节点可以有两个后继节点
- 叶节点(leaf node):没有子女的树节点
- 根(root):树中唯一的开始节点
- 二叉树(binary tree):具有唯一起始节点(根节点)的抽象复合结构,其中每个节点可以有两个子女节点,根节点和每个节点之间都有且只有一条路径
8.5.2 二叉检索树
Q:如何解释子树是空的那段概念,没看懂
- 左子树子节点需小于根节点才可继续检索,但它需大于初始节点。即子节点只需大于其上的根节点,右子树反之。
8.6 图——数据结构 - 图(graph):由一组节点和一组把节点互相连接起来的边构成的数据结构
- 顶点(vertex):图中的节点
- 边(弧)(edge(are)):表示图中两个节点的连接的顶点对
- 图中的顶点表示对象,边则描述了顶点之间的关系
- 无向图(undirected graph):其中的边没有方向的图
- 有向图(directed graph(digraph))另一个顶点:其中的边是从一个顶点指向(或同一个顶点)的图
- 邻顶点(adjacent vertice):通过边连接起来的两个顶点
- 路径(path):连接图中两个顶点的一系列顶点
8.6.1 创建图
创建一个表格需要以下操作:
- 在表格中添加一个顶点
- 在表格中添加一条边
- 在表格中添加一个权值
8.6.2 图算法
三种经典的图搜索算法: - 我能否搭乘喜爱的航线从城市X前往城市Y?
- 我怎样能用最少的停顿从城市X前往城市Y?
- 从城市X到城市Y最短的航程(公里数)是什么?
深度优先搜索
对于问题(1),给定一个起点和一个终点,我们来构造一种从起点(start vertex)到终点(end vertex)的路径的算法。
- 栈是一种存储顶点的合适的数据结构
- 一旦把一个顶点的所有相邻顶点都放入栈内,就标记这个顶点被访问过;由于它可能无法终止,所有我们不能多次处理同一个顶点。
广度优先搜索
对于问题(2),尝试从距此顶点最近的路径开始,也就是那些在栈顶的路径,按照相反顺序来保存元素,即最晚的路径在顶部。
单元最短路搜索
Q:没有看懂单元最短路搜索
8.7 子程序
8.7.1 参数传递 - 参数列表(parameter list):抽象中两部分之间的通信机制
- 形参(parameter):列在子程序名后的括号中的标识符
- 实参(argument):子程序调用中列在括号中的标识符
- 当动作执行时,实参将逐个替代形参
- 调用子程序时传递的实参个数必须与子程序定义中的形参个数相同,由于实参和形参是根据位置匹配的,所以它们的名字不必一致。
- 位置形参:当需要多次调用一个子程序而每次调用的实参又不同,根据位置调用。
8.7.2 值参与引用参数
传递参数的基本方式:
- 值传递
- 引用(或地址)传递
- 值参(value parameter):由调用单元传入实参的副本(写在留言上)的形参
- 引用参数(reference parameter):由调用单元传入实参的地址(写在留言板上)的形参
# 第九章 面向对象设计与高级程序设计语言 #
9.1 面向对象方法
Polya的问题求解策略将应用于数据,而不是任务
9.1.1 面向对象
- 对象(object):在问题背景中相关的事物或实体
- 对象类(object class)或类(class):一组具有相似的属性和行为的对象的描述
- 域(field):类中的特定项,可以是数据或子程序
- 方法(method):定义了类的行为的一种行为的特定算法
9.1.2 设计方法
分解过程的四个阶段:
- 集体讨论
- 过滤
- 场景
- 封装(encapsulation):把数据和动作集中在一起,使数据和动作的逻辑属性与它们的实现细节分离
- 责任算法
9.2 翻译过程
9.2.1 编译器(所以它到底是什么???)
- 编译器(complier):把高级语言编写的程序翻译成机器码的程序
- 要编译一个程序,就必须具有这个编译器在特定机器上的机器码版本;想要在多种类型的机器上使用一种高级语言,就要具备这种语言的多个编译器
9.2.2 解释器 - 解释器(interpreter):输入用高级语言编写的程序,指导计算机执行每个语句指定的动作的程序
- 字节码(bytecode):编译Java源代码使用的标准机器语言
9.3 程序设计语言的范型
9.3.1 命令式范型
- 面向过程的范型
- 面向过程编程是一种命令式模型,在这里语句被分组为子程序
- 伪代码示例描述了这种模型
- 每一层执行整个问题求解的一个必要的特定的任务
- 面向对象的范型
- 面向对象视角是与对象交互的一种方式
Q:什么是对象和操作对象的代码绑定在一起
9.3.2 声明式范型
- 函数式模型
- 该模型基于函数的数学概念
Q:没有看懂p132的函数示例
- 逻辑编程
- 该编程基于象征逻辑的原则
Q:什么是象征逻辑
9.4 高级程序设计语言的功能性
选择和循环是命令是命令式语言的标志
9.4.1 布尔表达式 - 布尔表达式(Boolean expression):一个标识符序列,标识符之间由相容的运算符分隔,求得的值是true或false
9.4.2 数据归类 - 强类型化(strong typing):每个变量都有一个类型,只有这种类型的值才能存储到该变量中
- 数据类型(data type):一组值以及能够应用于这种类型的值的基本操作集合的说明
计算机能够执行一条指令,是因为这条指令的地址被载入了程序计数器,而指令被载入了指令寄存器
- 整数:一个整数值的范围,这个范围由表示整数值的字节数决定
- 模运算符:返回整数除法的余数的运算符
- 实数:特定精度的数的范围,这个范围由表示实数值的字节数决定
- 字节
- 布尔型
- 字符串:一种具有复合数据类型的特征的数据类型,但通常被看作简单数据类型;是一个字符序列,在某种语言中这个序列通常被看作一个数据值
- 声明(declaration):把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序猿可以通过名字引用这些项目
- 保留字(reserved word):一种语言中具有特殊语言的字,不能用它作为标识符
- 区分大小写(case sensitive):大写字母和小写字母被看作是不同的;两个拼写方法相同但大小写形式不同的标识符被看作是两个不同的标识符
9.4.3 输入/输出结构 - 高级语言把输入的文本数据看作一个分为多行的字符流。字符的含义则由存放值的内存单元的数据类型决定
- 所有输入语句都由三部分组成:
- 要存放数据的变量的说明
- 输入语句
- 要读入的变量名以及数据流自身
9.4.4 控制结构(control structure)
- 定义:确定程序中的其他指令的执行顺序的指令
- 程序中的每个逻辑单元都只能有一个入口和一个出口,程序不应随意地跳入或跳出这些逻辑模块
- 嵌套逻辑
选择控制结构被嵌入循环控制结构;控制结构中有控制结构……理论上,控制结构的嵌套有多深是没有限制的!(纳尼) - 异步处理
也叫作事件驱动处理 - 异步(asynchronous):不与计算机中的其他操作同时发生;换句话说,与计算机的动作不同步
9.5 面向对象语言的功能性
9.5.1 封装 - 封装(encapsulation):实施信息隐藏的语言特性
- 对象类或类(问题求解阶段)(object class or class(problem-solving phrase)):属性和行为相似的一组对象的说明
- 对象(问题求解阶段)(object (problem-solving phrase)):与问题背景相关的事物或实体
- 对象(实现阶段)(object(implementation phrase)):类的一个示例
- 类(实现阶段):对象的模式
9.5.2 类 - 实例化(instantiate):创建类的对象
9.5.3 继承 - (inheritance):类获取其他类的属性(数据域和方法)的机制
9.5.4 多态 - (polymorphism):一种语言的继承体系结构中具有两个同名方法且能够根据对象应用合适的方法的能力
9.6 过程设计与面向对象设计的区别 - 在面向对象的设计中,列表数据结构和子程序需要在类中绑定在一起
- 在面向过程的版本中,列表被呈现为传递给子程序的记录
- 在面向对象的版本中,类对象的实现通过封装实现对用户的隐藏