2019-2020-1学期20212407《网络空间安全专业导论》第四周学习

这周,我与预习了“抽象数据类型与子程序”和“面向对象设计与高级程序设计语言”两章内容,思维导图如下:
抽象数据类型与子程序
·在程序设计层,我们已经从机器语言到汇编语言再到伪代码来表示算法,从使用简单变量的算法到使用数组的算法
·我们一直在使用的算法设计是自顶向下的模型
8.1 抽象数据类型
·抽象数据类型(Abstract Data Type,ADT):属性(数据和操作)明确地与特定实现分离的容器
·在计算机领域,可以从应用层(或用户层,特定问题中的数据的视图)、逻辑层(或抽象层,数据值或域和处理它们的操作的抽象视图)和实现层(表示出了存放数据项的结构,并用程序设计语言对数据操作进行编码)三个方面观察数据
·这个抽象视图用明确的数据域和子程序表示对象的属性
·实现层涉及了数据结构(data structure),即一种抽象数据类型中的复杂数据域的实现
·容器(container):存放和操作其他对象的对象
8.2 栈
·首先会讨论的两种数据结构是栈和队列
·栈是一种抽象复合结构,只能从一端访问栈中的元素
·可以在第一个位置插入元素,可以删除第一个元素的处理类型称为LIFO,意思是后进先出(Last In First Out)
·另一种描述栈的访问行为的说法是删除的项总数总是在栈中时间最短的项目
·插入操作叫做Push(推进),删除操作叫做Pop(弹出)
8.3 队列
·队列也是种抽象结构,队列中的项目从一端入,从另一端出。这种行为称为 FIFO,,意思是先进先出( First In First Out)
·另一种描述队列的访问行为的说法是删除的总是在队列中时间最长的项目
·与栈一样,插人操作没有任何约束;整个FIFO行为都体现在删除操作上
·Enqueue、Enque、Enq、 Enter和 Insert 都可以表示插人操作。Dequeue, Deque,、Deq、Delete 和 emove都可以表示删除操作
8.4 列表
·列表有三个属性特征:项目是同构的,项目是线性的,列表是变长的
·线性(linear)的意思是,每个项目除了第一个都有一个独特的组成部分在它之前,除了最后一个也都有一个独特的组成部分在它之后
·而栈和队列对于删除操作都有全部的定义,列表通常提供插人一个项目的操作( Insert)、删除一个项目的操作(Delete)、检索一个项目是否存在(IThere)以及报告列表中项目数量(Get Length)
·此外,它们有一一些机制允许用户查看序列中的每一项( Reset,GetNext,Moreltems)
·因为项目可以被删除和检索,所以数组列表中的项目必须能够相互比较
·不要把列表误认为是数组,数组是内嵌结构,列表是抽象结构(列表应用于数组)
·列表也可以被形象化为链式结构(linked structure)
·链式结构以节点的概念为基础,是一个将数据项和找到下一项位置的信息保存到同一容器的实现方法
·一个节点由两部分构成:用户的数据和指向列表的下一个节点的链接或指针
·无序列表并不重要,项目只是随意被放入其中
8.5 树
·像列表、栈和队列这样的抽象结构本质上都是线性的,只模拟了一种数据关系
·分类一般发生在高层,随着不断向下的移动,标签会变得更加具体,每一个节点下方都可能会有许多的节点,这种体系叫做树
1.二叉树
·二叉树( binary tree):具有唯一起始节点(根节点)的抽象复合结构,其中每个节点可以有两个子女节点,根节点和每个节点之间都有且只有一条路径
·根(Root):树中唯一的开始节点
·叶节点(leaf node ):没有子女的树节点
·子女(children):每个节点的两个后继节点【节点左边的子节点叫做左节点(left child)】
2.二叉检索树
·二叉检索树还具有语义属性来刻画树中节点上的值,即任何点的值都要大于它的左子树中的所有节点的值、并且要小于它的右子树中的所有节点的值
1)在二叉树中搜索
·如果 current 指向一个节点,那么 info(current)指的就是这个节点中的用户数据,left(curent) 指向的是 current的左子树的根节点, right(current) 指向的是 current的右子树的根节点
·null是一个特殊殊值,说明指针指向空值
·我们从树的根节点开始,沿着根的后继子数前进,直到找到了要找的项目或者发现一个空子树为止
2)构造二叉检索树
3)输出二叉检索树中的数据
·递归算法妙处:简短精致
3.其他操作
·二叉检索树其实是和列表具有同样功能的对象,它们的区别在于操作的有效性,而行为是相同的
·length在用于实现列表时必然与树相伴
8.6 图
·图(graph ):由一组节点和一组把节点相互连接起来的边构成的数据结构
·顶点(vertex):图中的节点
·边孤(edge (arc)):表示图中两个节点的连接的顶点对
·无向图(undirected graph):其中的边没有方向的图
·有向图( directed graph ( digraph)):其中的边是从ー个顶点指向另ー个顶点(或同一个顶点)
·加权图表示边有附加值的图
·如果两个顶点有一条边相连,则把它们称为邻顶点( adjacent vertice)
·两个顶点通过一条有顺序的路径(path)相连
1.创建图
·列表、栈、队列和树都是可容纳元素的容器
·许多信息可以被呈现在图上:顶点、边和权值
·创建一个表格需要以下操作: 1’在表格中加一个顶点 2’在表格中添加一条边 3’在表格中添加一个权值
·我们在表格中通过行名和列名来寻找位置
2.图算法
·这三个问题的答案包括了深度优先搜索、广度优先搜索和单源最短路搜索
1)深度优先算法
·当我们试图在两个顶点间寻找路径时,用栈来存储访问的顶点。用深度优先搜索来检查第一个与起点(startVertex)相邻的顶点。如果是它是终点(endVertex),则搜索结束。否则,检查所有与第一个顶点相邻的顶点
·深度优先中用到栈,因为我们想要沿着一条路径尽可能深地访问各个节点,如果没有找到终点则回溯,因此栈是一种存储顶点的合适的数据结构
·相比于更早时候可选的其他分支,深度优先搜索(depth-first search)尽可能可以走远的路
2)广度优先搜索
·在广度优先搜索中,我们想要回溯尽可能远,以找到从最初的顶点出发的路径
·我们采用队列来保存元素的顺序可以按照它们出现的先后顺序
·广度优先搜索出现的相反顺序来保存元素,即最晚的路径在顶部
·深度优先搜索算法从起点出发尽可能地往更远的路径检查,而不是优先选择检查与起点相邻的第二个顶点
·广度优先搜索会优先检查所有与起点相邻的顶减,而不是检查与这些顶点相连的其他顶点
3.单源最短路搜索
·最短路径值将路径上的边的值(权值)加在一起得到的和最小
·最小行程次数的航线并不意味着是最短的总距离
·与此顶点相连的边权值最小的顶点。我们称这种抽象容器为优先队列(priority queue),被检索的元素是在队列中拥有最高优先度的元素
8.7 子程序
·在子算法里我们用非递归的上下文来审视它们并且讨论怎样能够来回在算法和子算法之间传递信息。因为在讨论实际的语言构造,因此我们更习惯称这样的结构为子程序而不是子算法
·信息交流是通过参数列表的概念实现的
1.参数传递
·参数列表(parameter list):程序中两部分之间的通信机制
·形参(parameter):列在子程序名后的括号中的标识符
·实参(argument):子程序调用中列在括号中的标识符
·实参表示的是调用单元中的真正变量
·可以把形参看作子程序中使用的临时标识符
·值(values)和长度(length)绑定在一起形成一个记录,称之为列表(list),并把它传递给需要它的子程序
·子程序会通过形参在留言板上的相对位置访问实参,以这种方式传递的形参通常叫做位置形参(positional parameter)
2.值参与引用参数
·值参( value parameter):由调用单元传人实参的副本(写在留言板上)的形参
·引用参数(reference parameter): 由调用単元传入实参的地址 (写在留言板上)的形参
·由于子程序接收的只是实参的一个副本,因此它不不能改变实参的内容,而只能修改副本,不会改变原始变量
·要访问一个引用参数,子程序必须访问留言板上列出的地扯中的内容
·并非所有高级语言都支持这两种类型的参数,但支持它们的语言都有标示值参和引用参数的语法
·无返回值的子程序可能也有RETEURN语句

                                      面向对象设计与改进程序设计语言

·高级编程语言是实现算法的正式方法;伪代码时描述算法的非正式方法
·需要翻译程序把高级语言编写的程序翻译成机器码
9.1 面向对象方法
·面向对象的设计方法是用叫做对象的独立实体生成解决方案的问题求解方法
1.面向对象
每个对象负责自己的处理(行为)
·面向对象设计(OOD)的底层概念是类(class)和对象(object)
·对象(object):在问题背景中相关的事物或实体
·对象类(object class) 或类(class):一组具有相似的属性和行为的对象的描述
·字段(field ):表示类的属性。
·方法(method):定义了类的一种行为的特定算法
·特定的对象只是类的一个实例(instant)(具体的例子)
·类是一种模式,说明了对象是什么(字段)以及它的行为(方法)
2.设计方法
分解过程的四个阶段:1’头脑风暴(确定问题中的类的第一个阶段) 2’过滤阶段(回顾头脑风暴阶段确定的类) 3’场景阶段(确定每个类的行为,称类的行为为责任) 4’责任算法阶段(列出所有类的责任编写算法)
1)头脑风暴
·在准备过程中,每个成员都会操你出自己的类列表
2)过滤
·头脑风暴会生成一份暂时的类列表
·共同的属性和行为可以组合在一起
·完成过滤后,这个阶段保留下来的所有类将被传递到下一阶段
3)场景
·这个阶段的目标是给每个类分配责任。最终,责任将被实现为子程序
·责任的类型有两种,即类自身必须知道什么(知识)和类必须能够做什么(行为)
·封装( encapsulation ) ,就是把数据和动作集中在一起,使数据和动作的逻辑属性与它们的实现细节分离
·封装是抽象的关键这个阶段输出的是一套分配了责任的类
4)责任算法
·最终必须为责任编写算法
·自顶向下设计算法的方法通常也适用于设计动作责任算法
5)总结
·自顶向下的设计方法重点在于把输人转化成输出的过程,结果将生成任务的体系结构
·面向对象设计的重点是要转换的数据对象,结果生成的是对象的体系结构
3.示例
1)问题:······
2)头脑风暴:列表、姓名、电话号码、电子邮件地址、列表、姓名、小纸片、名片
·列表指的都是创建的容器
·顺序类说明如何输出列表中的条目
·小纸片和名片描述的对象包含的是真实世界中的数据,没有与之对应的类`
3)过滤:列表、姓名、电话号码、电子邮箱地址
·利用问题陈述中的动词,可以顺利设计出责任,即创建、输出和加入
·加入这个动词是让某人准备数据的指令,在设计中没有与之相对应的责任
·用于实现设计的每种语言都有一个容器类库(library)
·采用的类是按照字母顺序保存条目的,而且会输出列表
4)责任算法
·Person类有两个责任需要分解,即初始化和输出(可以让这些类自己进行初始化并输出自身)
·Name类有两个责任,即初始化和输出,它们算法不同
9.2 翻译过程
·汇编语言编写的程序要输入汇编器
1.编译器
·编译器(compiler ):把用高级语言编写的程序翻译成机器码的程序
·汇编语言阶段通常被省略了
·编译器是一种程序,因此,要编译一个程序,就必须具有这个编译器在特定机器上的机器码版本
·想要在多种类型的机器上使用一种高级语言,就要具备这种语言的多个编译器
2.解释器
·解释器 ( interpreter) :输人用高级语言编写的程序,指导计算机执行每个语句指定的动作的程序
·解释器再翻译过语句后立即执行语句,可以把解释器看做理解编写程序所使用的语言的模拟器和虚拟机
·第二代高级语言可以分为两种,一种是要编译的,一种是要解释的
·FORTRAN、COBOL和 ALGOL 是要编译的语言;Lisp、SNOBOL4和 APL 是要解释的语言
·在 Java 的设计中,可移植性是最重要的特性
·为了达到最佳可移植性,Java 被编译成一种标准机器语言——字节码( bytecode )
·字节码( bytecode ):编译Java 源代码使用的标准机器语言
·一种名为 JVM (Java 虚拟机)的软件解释器接收字节码程序,然后执行它
·字节码不是某个特定硬件处理签的机器语言,任何具有JVM 的机器都可以运行编译过的 Java程序
9.3 程序设计语言范型
·范型被定义为“一种模式或事物的示例”,这个词还暗含意象和思维模式的含义
1.命令式范型
·冯 诺伊曼顺序指令模型在内存中操作数值,这给了编程语言所用的绝大多数常用模型巨大的影响:命令式模型
·因此,这些命令式范型具有顺序执行指令的特征,变量的使用代表了内
存地址,而使用赋值语句则改变这些变量的值
1)面向过程的范型
·面向过程编程是一种命令式模型
·一个程序是子程序分层次构成的,每一层执行整个问题求解的一个必要的特定任务
2)面向对象的范型
·面向对象视角是与对象交互的一种方式,每个对象负责执行它自己的动作
·在面向过程的范型中,数据被认为是被动并且被程序所操控的。在面向对象的范型中,数据对象是活跃的
·对象和操作对象的代码绑定在一起,使得每个对象负责控制自己的操作
·SIMULA 和Smalltalk 是最先支持面向对象编程的语言;Java 和Python 是两种新式的面向对象编程语言
·C++和 Java 是命令式的语言,但就它们的范型而言又是混合的。尽管 Java 被认为是向对象的,但是它还是一些面向过程的特性;C++被认为是面向过程的,但是它又有面向对象的特征
2.声明式范型
·声明式范型是一个描述结果的模型,但是完成结果的过程则不被描述
·在这种范型中有两种基本模型:函数式式和逻辑式。
1)函数式模型
函数式模型基于函数的数学概念。计算通过对函数求值来实现,而问题求解通过函数调用来实现
·因此基本的原理是函数的求值,而不是变量和赋值语句
2)逻辑编程
·逻辑编程基于数理逻辑的原则,这个模型包括了一系列关于对象的事实和一系列关于对象间关系的规则
·PROLOG是1970年在法国研发的第三代逻辑编程语言
·一个 PROLOG程序包含三种语句:一种声明了对象及对象之间关系的事实;一种定义了对象及对象之间关系的规则;第三种询问对象及对象之间关系的问题
9.4 高级程序设计语言的功能性
·两种伪代码结构————选择和重复(循环)是命令式语句的标志
1)布尔表达式
·程序设计语言提问的方式语句称为断言或条件,在编写算法时,我们采用自然语言表示断言
·布尔表达式( Boolean expression)是一个标识符序列,标识符之间由相容的运算符分隔,求得的值是 true 或 false
·布尔运算符是特殊的运算符AND、OR、NOT
2.数据归类
·强类型化 (strong typing):每个变量都有一个类型,只有这种类型的值才能存储到该变量中
·数据类型( (data type ):一组值以及能够应用于这种类型的值的基本操作集合的说明
·我们将要探讨的语言中,C++、Java、VB.NET 是强类型的语言,而 Python则不是
1)数据类型
·数据是表示信息的物理符号
·四种固有数据类型:整数、实数、字符、布尔型
·字符串是一个字符序列
2)声明
·声明( declaration) 是把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目
·保留字(reserved word):一种语言中具有特殊意义的字,不能用它作为标识符
·区分大小写(case sensitive):大写字母和小写字母被看作是不同的;两个拼写方法相同但大小写形式不同的标识符被看作是两个不同的标识符
·C++和Java声明变量不采用保留字,用分号结束语句
·VB·NET利用一行的结尾或注释符号结束语句
3.输入/输出结构
·高级语言把输入的文本数据看作一个分为多行的字符流
·字符含义由存放值的内存单元的数据类型决定
·所有输入语句都由三部分组成,即要存放数据的变量的声明、输入语句和要读入的变量名以及数据流自身
·在强类型语言中,需要分别声明变量的数据类型
·输人流可能来自键盘,也可能来自一个数据文件,不过处理过程是一样的:变量出现在输入语句中的顺序必须与值出现在输入流中的顺序一样
·下一个值要存入的变量的类型决定了如何解释这个字符序列,为了便于叙述,假设输人语句采用空格分隔每个数值
·在非强类型语言中,输入的格式决定了类型
·输出语句中列出的项目可以是文字值或变量名
·文字值是直接在输出语句中写的数字或字符串(或任何语句)
·一次处理一个将要输出的值,从而找到标识符或文字的类型,类型确定了如何解释位模式
·在强类型语言中,不管输入/输出语句的语法或输入/输出流在哪儿,处于数据类型,数据类型确定字符是如何被转换为位模式(输入)以及如何被转换为字符(输出);在非强类型语言中,输入的格式决定了位模式是如何转换的
4.控制单元
·控制结构(control structure):确定程序中的其他指令的执行顺序的指令
·Edsger W. Dijkstra 在 1972 年发表的论文“Notes on Structured Programming”和其他同期发表的论文开创了结构化程序设计的时代
·根据这种观点,程序中的每个逻辑单元都只能有一个入口和一个出口,程序不应随意地跳入或跳出这些逻辑模块
·这些控制结构是选择语句、循环语句和子程序语句;无限制的分支语句不再是必需的
· 没有Java 或者 Python 的例子是因为它们控制内存的方式不同,它们只允许使用值参
1)嵌套逻辑
·被跳过或重复的语句可以包含一个控制结构。选择语句可以在循环结构中做嵌套。循环结构可以在选择语句中被嵌套。选择和循环语句可以在子程序中被嵌套,而子程序可以在循环或选择结构中被嵌套
·控制结构的嵌套多深没有限制
2)异步处理
·点击(clicking)成了计算机的主要输入形式
·异步(asynchronous) :不与计算机中的其他操作同时发生;换句话说,与程序的操作不同步
·鼠标的点击可能发生在任何时间,因此它和其他的指令并不同步
9.5 面向对象语言的功能性
·面向对象语言的基本构造是类
·面向对象语言的三个必要组成部分:封装、继承和多态(这些部分促进重用,减少构建和维护成本)
1.封装
·封装是把数据和动作集合在一起,数据和动作的逻辑属性与它们的实现细节是分离的;另一种说法是封装(encapsulation)是实施信息隐蔽的语言特性
·类的概念也是 Java 和其他面向对象语言的主要特性
·对象(问题求解阶段)(object(problem-solving phase)):与背景问题相关的事物或实体
·类(实现阶段)(class(implementation phase)): 对象的模式
·对象类或类(问题求解阶段)(object lass or class ( problem-solving phase)):属性和行为相似的一组对象的说明
·对象(实现阶段)(object(implementation phase)):类的一个实例
2.类
·类像前面介绍的记录,它们都是异构复合数据类型
·记录通常被认是被动结构,只是近年来才采用子程序作为字段;而类则是主动结构,一直都把子程序用字段
·操作类的数据域的唯一方式是通过类中定义的方法(子程序)
·实例化(instantiate):创建类的对象
·算法声明类的对象只能通过类的子程序(称为方法)访问类的字段
3.继承
·继承( inheritance)是面向对象语言的一种属性,即一个类可以继承另一个类的数据和方法。这种关系是一种is-a关系。超类是被继承的类,派生类是继承的类。类构成了继承的体系结构。在这种体系结构中,所处的层次越低,对象越专门化。下级的类会继承其父类的所有行为和数据。
4.多态
·多态(polymorphism ):语言在运行时确定给定调用将执行哪些可能的方法的能力
·继承和多态结合在一起使程序员能够构造出在不同应用程序中可以重复使用的类的体系结构
·可重用性不仅仅适用于面向对象语言;而面向对象语言的功能却使编写通用的、可重
用的代码段变得更容易
9.6 过程设计和面向对象设计的区别
·方法的代码需要直接可以访问到类变量,而用户的代码则不可以。类需要被分别编译,并且想使用该类的程序需要在程序中包含它

posted @ 2021-10-24 22:50  20212407林媛媛  阅读(161)  评论(0)    收藏  举报