第八章、抽象数据类型与子程序
8·1 抽象数据类型
抽象数据类型(Abstract Data Type, ADT):属性(数据和操作)明确地与特定实现分离的容器。
在计算机领域可以从应用层、逻辑层和实现层这三个方面观察数据。应用层是特定问题中的数据视图。逻辑层是数据值(域)和处理它们的操作的抽象视图。实现层明确表示出了存放数据的结构,并用程序设计语言对数据的操作进行编码。用明确的数据和子程序表示对象的属性。涉及了数据结构。
数据结构(data structure):一种抽象数据类型复合数据域的实现。
容器(container):存放和操作其他对象的对象。
8·2 栈
栈是一种抽象复合数据结构:
- 只能从一端访问栈中的元素,对数据进行LIFO(Last In First Out)处理。
- 删除的项总是在栈中最短的项目。插入操作没有任何约束,整个LIFO行为都体现在删除操作上。
- 插入操作叫Push,删除操作叫Pop.栈没有长度属性,所以我们只能用是否为空(IsEmpty)来描述。
8·3 队列
- 队列中的项目从一端入,从另一端出,这种行为称为FIFO,意思为先进先出(First In First Out)。
- 删除的总是在队列中时间最长的项目。插入操作没有任何的约束,整个FIFO行为都体现在删除操作上。
- 插入操作可以用Enqueue,Enque,Enq,Enter和Insert来表示;删除操作可以用Dequeue,Deque,Deq,Delete和Remove来表示。
8·4 列表
列表有三个属性特征:
- 项目是同构的
- 项目是线性的
- 列表是变长的
线性的意思(liner):每个项目除了第一个都有一个独特的组成部分在它之前,除了最后一个,都有一个独特的组成部分在它之后。
数组(Array):是有序的元素排列。把具有相同类型的若干元素按有序的形式组织起来的一种形式,这些有序排列的同类数据元素的集合称为数组。
数组的特点:
- 是相同类型的元素集合。
- 数组中各元素的存储是有先后顺序的,它们在内存(memory)中按这个先后顺序连续存放在一起。
- 数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。
对于下标的要求:下标可以是常量,可以是变量,或者是表达式,但其值必须为整数。
不要把列表误认为是数组,数组是内嵌结构,列表是抽象结构。
列表也可以被形象化为一种链式结构。用户的数据指向列表的下一个节点的链接或指针,列表的最后一个节点的指针变量存放的是表示列表结束的符号,通常为null,用“/”表示。
链式结构(linked structure):一个将数据项和找到下一个项位置的信息保存到同一容器的实现方法。
有序列表中,项目之间具有语义关系,除了第一个项目以外,所有项目之间都存在着某种排序关系;除了最后一个项目以外,所有项目都存在着某种相同的关系。
8·5 树
像列表,栈,队列这样的抽象结构在本质上都是线性的,而对于更复杂的关系需要用更复杂的结构来表示。在最高层进行分类,随着不断的向下移动,标签会变得更加具体,这种分层体系结构叫做树。
二叉树(binary tree):具有唯一的起始点(根节点)的抽象复合结构,其中每个节点都可以有两个子女节点,根节点和每个节点之间都有且只有一条路径。
这就是说每个节点都只有一个父母节点。
根(Root):树中唯一的开始节点。
叶节点(leaf node):没有子女的树节点。
二叉检索树:
就像以排序的列表,节点间存在语义排序,及任何节点的值都要大于它的作子树中所有节点的值,并且要小于它右子树中所有节点的值。
在二叉检索树中搜索:
IsThere(tree, item)
IF(tree is null)
PETURN FALSE
ELSE
IF(item equals info(tree))
RETURN TRUE
ELSE
IF(item<info(tree))
IsThere(left(tree),item)
ELSE
IsThere(right(tree),item)
树的形状,例如四级树,十级树。
构造二叉检索树
如何向树中插入一个元素。
输出二叉检索树中的数据
*书中的所有算法都要好好地研究一遍****
其他操作:
:二叉检索树其实是和列表具有同样功能的对象,它们的区别在于操作的有效性,而行为是相同的。
树的定义引起了Length操作的递归定义。
8·6 图
图(graph):有一组节点,和一组把节点相互连接起来的边构成的数据结构。
顶点(vertex):图中的节点。
边(弧)(edge(arc)):表示图中两个节点连接的定点对。
无向图(undirected graph):其中的边没有方向的图。
有向图(directed graph(digraph)):其中的边是从一个顶点指向另一个顶点(或同一个顶点)的图。
邻顶点(adjacent vertice):通过边连接起来的两个顶点。
路径(path):连接图中两个顶点的一系列顶点。
从数学上来说,顶点是图论中未定义的概念。有关的数学问题多种多样。
创建图:
- 在表格中添加一个顶点
- 在表格中添加一条边
- 在表格中添加一个权值
图算法:
- 深度优先搜索
- 广度优先搜索 深度优先搜索算法是从起点尽可能地往更远的路径检查,而不是优先检查与起点相邻的第二个顶点。相反,广度优先搜索会优先检查所有与起点相邻的顶点,而不是检查与这些定点项链的其他顶点。
- 单源最短路搜索 这里的“最短路径”指的是将路径边上的值(权值)加在一起得到的和最小。我们称以与此顶点相连的边权值最小的顶点为元素的抽象容器为优先队列(priority queue),被检索的元素是在队列里拥有最高优先度的元素。这个算法是极其复杂的。
8·7 子程序
参数传递:
参数列表(parameter list):程序两部份之间的通信机制。
形参(parameter):列在子程序名后的括号中的标识符。
实参(argument):子程序调用中列在括号后面的标志符。值参(value parameter):由调用单元转入实参的副本的形参。(写在留言板上)
引用参数(referance parameter):由调用单元传入实参的地址的形参。(写在留言板上)
第九章、面向对象设计与高级程序设计语言
伪代码与人类的思维和交流方式更为接近。高级编程程序是实现这些算法的正式方法。由于计算机只能执行机器码,所以需要翻译程序。
9·1 面向对象方法
面向对象的设计方法的重点在于对象以及它们在问题中的交互。
面向对象:
对象(object):在问题背景中相关的事物或实体。
对象类(object class)或类(class):一组具有相似的属性和行为的对象的描述。
字段(field):表示类的属性。
方法(method):定义了类的一种行为的特定算法。
设计方法:
分解过程有四个阶段:
头脑风暴 在此背景下,头脑风暴是一种集体行为位的是生成解决某个特定问题要用到的候选类列表。在准备过程中,每个成员都会草拟出自己的类列表。
过滤 根据上一阶段产生出的暂定列表,确定问题解决方案中的核心类。举个例子,学生类应该知道自己的相关信息,使用学生类的类都应该能够获取这些信息。
场景 给每个类分配责任。
责任算法
自顶向下的设计方法重点在于把输入转化为输出的过程,结果将生成任务的体系结构,面向对象的设计重点是要转换对象,结果生成的是对象的体系结构。
可复用性是面向对象设计的一大优点,每个类都是自约束的。
9·2 翻译过程
编译器(compiler):把用高级语言编写的程序翻译成机器码的程序。
解释器(interpreter):输入用高级语言编写的程序。,指导计算机执行每个语句指定的动作的程序。
字节码(bytecode):编译JAVA源代码使用的标准机器语言。JVM是一种虚拟机翻译JAVA编译的字节码。
9·3 程序设计语言范型
范型(paradigm):一种模式或事物的示例。
命令式型范型:
程序描述了解决问题的必要处理,具有顺序执行指令的特征,变量的使用代表了内存地址,赋值语句改变了这些变量的值。
面向过程的范型:编写子程序并通过向其传递所需数据来完成它的功能。
面向对象的范型:每个对象负责执行它自己的动作
声明式范型:
函数式模型:基于函数的数学概念,计算通过对函数求值来实现,而问题求解通过函数调用来实现。
逻辑编程:基于数理逻辑的原则。这个模型包括了一系列关于对象的事实和一系列关于对象间关系的规则。一个程序包括了向这些对象或关系询问可以通过事实和规则推演的问题,解决问题的潜在算法用逻辑的规则推演出事实和规则的答案。
9·4 高级设计语言的功能性
布尔表达式:
布尔表达式(Boolean expression):一个标识符序列,标识符之间由相容的运算符进行分离,求的值是true或false。关系运算符。
数据归类:
强类型化(strong typing):每个变量都有一个类型,只有这种类型的值才能存储到该变量中。
数据类型(data type):一组值以及能够应用于这种类型的值的基本操作的说明。
整数
实数
字符
布尔型
字符串
声明:(declaration)
把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目。
保留字(reserved word):一种语言中具有特殊意义的字,不能用它来作为标识符。
区分大小写
输入输出结构:
高级语言把输入的文本数据看作一个分为多行的字符流。字符的含义则由存放值的内存单元的数据类型决定。所有的输入语句都由三部分组成,即要存放的数据的变量的声明、输入语句和要读入的变量名以及数据流自身。变量出现在输入语句中的顺序必须与值出现在输出语句中的顺序一样。输入变量的类型决定了如何解释输入流中的字符。
输出语句创建字符流,类型决定了如何解释位模式。
控制结构:
伪代码提供了三种方法来改变控制算法的流程:重复,选择和子程序。这些结构叫做控制结构。
控制结构(control structure):确定程序中其他指令执行顺序的语句。
- 嵌套逻辑:在任何控制语句中被执行或条过的语句可以是简单的语句或块(一组语句),对于这些语句没有任何限制。事实上被跳过或重复的语句可以包含一个控制结构。选择语句可以在循结构句里被嵌套。循环结构可以在选择语句中被嵌套。选择和循环语句可以在子程序中被嵌套,而子程序可以在选择或循环结构中被嵌套。
- 异步(asynchronous):不与计算机中其他操作同时发生,换句话说,与程序的操作不同步。
9·5 面向对象的语言的功能性
面向对象的语言的基本构造是类,对象语言中三个必要的组成部分:封装,继承和多态。促进了重用。
封装(encapsulation):实施信息屏蔽的语言特性。
对象(问题求解阶段)(object problem-solving phase)):与问题背景相关的一组对象或实体。
类(实现阶段)(class(implementation phase)):对象的模式。
对象类或类(问题求解阶段)(object class or class(problem-solving phase)):属性和行为相似的一组对象的说明
对象(实现阶段)(object(implementation phase)):类的一个实例。不是那么重要。
类:操作类数据域的唯一方式是通过类中定义的方法(子程序)
实例化(instantiate):创建类的对象。
继承(inheritance):获取其他类的属性(数据和字段的方法的机制)。
多态(polymorphism):语言在运行时确定给定调用将运用哪些方法的能力。
继承和调用结合在一起,使程序员能够构造出在不同应用程序中可重复使用的类的体系结构。可重用性不仅适用于面向对象的语言;而面向对象的语言,却使编写通用的,可重用的代码变得更容易。
9·6 过程设计与面向对象设计的区别
在面向过程的版本中,操作的数据结构和子程序是用户程序使用户程序的一部分,而在面向对象的版本中,类对象通过封装实现对用户的隐藏。