2021-2022-1学期 20212319刘宇佳《网络空间安全专业导论》第四周学习总结
抽象数据类型与子程序
抽象数据类型
属性(数据和操作)明确地与特定实现分离的容器。设计的目标是通过抽象减小复杂度。
应用层(特定问题中的数据的视图)、逻辑层(数据值和处理操作的抽象视图)和实现层(明确存放数据项的结构,并用程序设计语言对数据的操作进行编码)
栈
栈是一种抽象复合结构,只能从一段访问栈中的元素。
LIFO:可以在第一项插入元素,也可以删除第一个元素。(push pop)
队列
项目从一端入,从另一端出,插入在尾部,删除在头部。(Enqueue,Enque,Enq,Enter,Insert表示插入,Dequeque,Deque,Deq,Delete Remove表示删除)
列表
项目是同构的,项目是线性的,列表是变长的。
插入:Insert,删除:Delete,检索:IsThere,项目数:GetLength,有些机制允许查案每一项:Reset,Getext,MoreItems
也可以被形象化为链式结构:一个节点由用户的数据和指向列表的下一个节点的链接或指针组成,最后一个节点指针存放的是表示列表结束的符号,通常为null或者“/”有序列表项目有语序关系
树
非线形,每个节点下有多个节点
二叉树
每个节点可以至多有两个后集结点,子女,起始节点叫做根,如果一个节点没有子女,则这个节点叫做树叶。
二叉检索树
任何节点的值都要大于它的左子树中的所有节点的值,并且小于它的右子树中所有节点的值
在二叉检索树中检索方法与二分检索法类似
info(current):访问当前节点的用户数据
right(current):指向current的右子树的根节点
left(current):指向current的左子树的根节点
如果一个指针是null,则这个子树是空的。
沿根节点开始沿着后继子树前进,直到找到搜索的项目或者空子树。
构建二叉树根插入顺序有关,要输出根的值,先输出左子树的所有,本身,再输出右子树的所有。
图
由一组节点(顶点)和连接节点的线段(边/弧)构成
如果图的边是无向的,则为无向图,边有向则为有向图。
如果两个顶点有一条边相连,则把它们称为邻顶点
创建一个表格操作如下:
在表格中添加一个顶点
在表格中添加一条边
在表格中添加一个权值
图算法
- 深度优先搜索
从起点到终点的路径的算法,用栈来存储访问顶点,用深度优先搜索来检查第一个与起点相邻的顶点,看他是不是终点,同时存储其它和起点相邻的顶点。一旦我们把一个顶点所有的相邻顶点都放到栈内,就标记这个顶点为访问过。已访问过的不会被回溯,所以该方法会选择一条尽可能可以走远的路
- 广度优先搜索
怎样用最少的停顿次数到达。运用队列而不是栈,优先检查与起点相邻的顶点,而深度优先检查与相邻顶点相连的其他顶点
- 单源最短路搜索
找最短航线。优先队列,寻找与顶点相连的边权值最小的顶点。
子程序
一般的软件库里有
参数列表是子程序要使用的标识符或值的列表,它放置在子程序名后的括号中。括号中声明了一个变量名的列表(形参),调用单元列出子程序名,这时括号中的一系列标识符为实参。在调用过程中,实参逐步替代形参。实参个数必须与形参一致。
值参与引用参数
如果一个形参是值参,调用单元将把实参的一个副本传递给子程序。如果一个形参是引用参数,调用单元将把实参的地址传递给子程序。前者调用单元不会改变原是变量,而后者可以改变实际变量。
面向对象设计与高级程序设计语言
面向对象设计的重点是对象以及他们在问题中的交互,一旦收集到了问题中的所有对象,他们就能构成问题的解决方案。面向对象设计的底层概念是类和对象。对象是在问题背景中具有意义的事物或实体。对象类简称类,描述了一组类似的对象,是把对象归入相关的组,并描述他们共性的思想,特定的对象只是类的一个实例,类中包括的字段表示类的属性,方法是处理对象中的数据值的指定算法。类是一个模式,说明了对象是什么(字段)以及他的行为(方法)。面向对象设计的重点是要转换的数据对象,结果生成的是对象的体系结构
设计方法
头脑风暴→过滤→场景→责任算法→总结
注解:
头脑风暴为的是生成解决某个特定问题要用到的候选类的列表
场景:给每个类分配责任(类自身必须知道什么和类必须能够做什么)
封装:把数据和动作集中在一起,使数据和动作的逻辑属性与它们的实现细节分离(抽象关键)
翻译过程
编译器
翻译用高级程序设计语言编写的程序的程序叫编译器。任何计算机只要有具有一种高级语言的编译器,就能运用这种语言编写的程序,要编译一个程序,就必须具有这个编译器在特定机器上的机器码版本。
解释器
解释器是一种程序,用于翻译和执行语句序列。解释器在翻译过语句之后,会立即执行这个语句,可以把解释器看做编写程序所使用的语言的模拟器或虚拟机。JAVA 被编译成一种标准机器语言字节码,一种名为JVM的软件解释器接受字节码程序,然后执行它。字节码不是特定硬件处理器的机器语言,任何具有JVM的机器都可以运行编译过的JAVA程序
程序设计语言范型
命令式范型
- 面向过程的范型:语句被分组为子程序,程序是子程序分层次构成的,每一层执行整个问题求解的一个必要的特定任务
- 面向对象的范型:面向对象视角是与对象交互的一种方式。每个对象负责制行它自己的动作,数据被认为是被动并且被程序所操控的,在此类型中,数据对象是活跃的。
声明式范型
函数式模型:计算通过对函数求值来实现,而问题求解通过函数调用来实现(形式:(函数 操作数))
逻辑编程:逻辑编程基于数理逻辑,模型包括了一系列关于对象的事实和一系列关于对象间关系的规则
高级程序设计语言的功能性
选择和重复(循环)是命令式语言的标志
布尔表达式
是一个标识符序列,标识符之间由相容的运算符分隔,求得的值是true or false,可以是一个布尔变量,一个算术表达式加一个关系运算符再加一个算术表达式,一个布尔表达式加一个布尔运算符再加一个布尔表达式。
!=或/=或<>表示不等于
数据归类
只能在变量中存储合适的类型的要求叫做强类型化。
数据类型(简单数据类型、原子数据类型)
- 整数
- 实数(通常不精确)
- 字符
- 布尔型
字符串:字符序列,在某些语言中整个序列被看作一个数据值。
声明
声明是把变量、动作或语言中的其他实体与标识符关联起来的语句,是程序员可以通过名字引用这些项目。
保留字是一种语言中具有特殊意义的字,不能用作标识符。
输入/输出结构
变量在输入语句中的顺序必须与值出现在输入流中的顺序一样,输入的变量的类型决定了如何解释输入流中的字符。非强类型中,输入格式决定类型。如果输入出现在引号之间,则它被假定为一个字符串。
输出语句创建字符流,项目可以是文字值(直接在输出语句中写的东西)或者变量名。
关键在于数据类型,它决定了字符是如何被转化为位模式(输入)及如何被转换为字符(输出),在非强类型中,输入格式决定了位模式是如何转换的。
控制结构
重复、选择和子程序
- 嵌套逻辑 一个控制结构中含有另一个
- 异步处理 与程序的操作不同步,也叫做事件驱动处理
面向对象语言的功能性
封装
包括信息隐蔽和抽象。信息隐蔽是为了控制对细节的访问,是实现抽象的方法。
封装用具有正式定义的接口的独立模块把实现模块隐藏了起来。用于提供封装的结构叫作类。
类
主动结构,将子程序用作字段。如果用标识符来表示一个类,需要用new操作符来实例化这个类。算法声明类的对象只能通过子程序访问类的字段
继承
一个类可以继承另一个来的数据和方法。超类是被继承的类;派生类是继承的类。在类的体系中,所处的层次越低,对象越专门化。继承通过允许应用程序使用已经被测试过的类和从一个类中继承应用所需的属性来促进重用,可以继承后添加内容。
多态
程序设计语言处理中的明显二义性叫作多态。
过程设计与面向对象设计的区别
通过ADT列表算法的实现来描述值返回和非值返回子程序,ADT的实现是一个变量列表的记录,其中存储了一个数组的值和字段的长度。
列表数据结构和子程序需要在类中绑定在一起,方法代码需要直接访问到类变量,用户代码需要在程序中包含它。
在面向过程的版本中,列表被呈现为传递给子程序的记录,以便子程序可以对其操作,操作它的数据结构和子程序是用户程序的一部分;面向对象的版本中,类对象的实现通过封装实现对用户的隐藏。
posted on 2021-10-20 16:42 20212319刘宇佳 阅读(38) 评论(2) 编辑 收藏 举报