下个学期就要开始我的计算机双学位就读了。在此之前,我打算先考几个证来过渡一下,像二级的C、C++、VB、Java、Python、Office都考一下。其中我比较熟悉的只有C和Python,其他的编程语言就要自己突击一下了。3月我报的是C、C++和VB。为此还买了几本书。这里总结一下考点,做一下笔记。之后书就不重要了,可以丢了。再刷一些题目,做一些记录就可以了。开始笔记吧。
定义:对解决方案的操作步骤的准确而完整的描述。(是数学计算方法和程序间的一个过渡)
基本特征:可行性(可以在实际计算工具上执行);确定性(算法每一步的表述没有歧义);有穷性(操作步骤有限,在有限时间内完成);有足够的输入。
总之,算法是指一组严谨地定义操作步骤的可以在有限的次数中终止的规则,每一个规则都是可行的、明确的。
基本要素:
(1). 对数据对象的运算和操作(由不同计算机系统的指令集规定其基本运算和操作);
(2). 控制结构(就是顺序、选择、循环三种);
算法基本设计方法:列举法、归纳法、递推法、递归法、减半递推法、回溯法
算法复杂度:体现在运行该算法所需的计算机的时间和空间资源上,越多则算法复杂度越高。
(1). 时间复杂度:执行算法所需的计算工作量,用算法所执行的基本运算次数来度量(注意: 不是具体的执行时间)。常用大O表示法表示。我们经常用平均复杂度和最坏情况复杂度来分析算法的工作量。
(2). 空间复杂度:执行这个算法所需的内存空间。包括3个部分。为降低空间复杂度,主要应减少输入数据所占的空间和额外空间。如果额外空间不随问题规模变化,称该算法in place原地工作。
a. 输入数据所占的存储空间
b. 程序本身所占的存储空间
c. 算法执行过程中所需要的额外空间,包括算法执行过程中的工作单元和某种数据结构所需要的附加存储空间
如:B=D+R,D={早餐,中餐,晚餐},R={(早餐,午餐),(午餐,晚餐)}。
基本概念 | 含义 | 例子 |
---|---|---|
线性结构 | 一个非空的数据结构,满足一下两个条件:有且只有一个根节点;每个节点最多只有一个前驱,也最多只有一个后继 | (早餐,午餐), (午餐,晚餐) |
非线性结构 | 不满足以上两个条件的数据结构称为非线性结构,主要是指树和图形结构 |
S=(a1, a2, a3, a4)
,则a1为栈底元素,a4为栈底元素。按照a1,a2,a3,a4
的顺序入栈,a4,a3,a2,a1
的顺序出栈。Q=(q1,q2,q3,q4)
,则q1为队头元素,q4为队尾元素。按照q1,q2,q3,q4
的顺序进入,也按照这个顺序退出。首先队尾指针进1,然后在rear指针指向的位置插入新元素
。排头指针front+1,然后删除front指针指向的位置上的元素
。队头指针始终指向当前执行退队操作的队头位置。HEAD
,最后一个元素没有后继,其指针域为空,用NULL
表示。更加直观的表示是用箭头相链接的节点序列。在单链表中,只能顺时针向链尾方向进行扫描。类型 | 优点 | 缺点 |
---|---|---|
顺序表 | (1) 可以随机存取表中的任意节点;(2) 无需为表示节点间的逻辑关系额外增加存储空间 | (1) 其插入和删除运算效率很低;(2) 存储空间不便于扩充,不便于对存储空间的动态分配 |
链表 | (1) 插入和删除效率高,只需改变指针即可,不用移动元素;(2) 存储空间易于扩充且方便空间的动态分配 | (1)需要额外的空间来表示数据元素之间的逻辑关系;(2) 数据的查询效率较低 |
线性链表的存储单元是不连续的,就存在离散的空闲节点,将计算机存储空间中空闲的存储节点利用起来,把其组织成一个带链的栈,就是可利用栈
)的插入和删除:线性链表执行删除时,被删除节点回收到可利用栈,即把该空闲节点放到可利用栈栈顶,执行入栈操作;线性链表执行插入运算时,相关术语 | 含义 |
---|---|
父节点和根节点 | 树结构中,每个节点只有一个直接前驱,称为父节点;没有直接前驱的节点只有一个,即树的根节点(树的根) |
子节点和叶子节点 | 在树结构中,每个节点可以有0、1或多个直接后继,称作该节点的子节点。没有后继的节点是叶子节点 |
度 | 一个节点拥有的后件(直接后继)个数就是该节点的度。所有节点中最大的度是树的度 |
深度 | 根节点所在的层次为1,其他节点所在的层次等于父节点的层次+1,树的最大层次称为该树的深度。 |
子树 | 在树中,以某节点的一个子节点为根构成的树称为该节点的一棵子树。 |
二叉树(Binary Tree)定义:是一个有限的节点集合,该集合或为空,或由一个根节点及其左右不相交的左、右二叉子树所构成。与树是相似的,但又有不同。二叉树不是树的特殊情况,二者是不同的概念。
二叉树的特点:
(1). 二叉树可以为空,空的二叉树没有节点,非空二叉树只有一个根节点;
(2). 每个节点最多只有两棵子树,即二叉树中不存在度大于2的节点,二叉树中的节点可能没有子节点,可能只有一个左子节点或只有一个右子节点;
(3). 二叉树的子树有左右之分,不能任意颠倒次序。
二叉树的基本形态:5种;空,仅有根节点,左右子树均非空,左子树非空右子树为空,左子树为空右子树非空。
满二叉树:除最后一层,每一层上的所有节点都有两个子节点的二叉树,一棵平衡的二叉树。
(1). 其在第i层有2(i-1)个节点,相当于每一层的节点数都满了;
(2). 一棵深度为K的满二叉树共有2k-1个节点;
(3). 满二叉树中只有度为2和0的节点,没有度为1的节点。所有度为0的叶子节点都在最后同一层。
完全二叉树:除最后一层,每一层上的节点数均达到最大,在最后一层上只缺少右边的若干节点。
(1). 叶子节点只在最后两层出现;
(2). 对于任一节点,若其右子树的深度为m,则左子树的深度为m或m+1。
二叉树的基本性质:
(1). 二叉树的第K层上面,最多只有2k-1个节点;
(2). 深度为K的二叉树,最多有2k-1个节点(等比数列求和);
(3). 对任何一棵二叉树,度为0的节点(叶子节点)总是比度为2的节点多一个;
(4). 具有n个节点的二叉树,其深度至少为[log2n]+1;
(5). 具有n个节点的完全二叉树,其深度为[log2n]+1。
(6). 较复杂。
已知中序遍历序列和前序遍历序列(或后序遍历序列)可以唯一确认一棵二叉树,但是知道前序和后序则无法唯一确定这棵二叉树。
查找是插入和删除等运算的基础,是数据处理的重要内容。
排序是指将一个无序序列整理成按值非递减顺序排列的有序序列。
交换类排序法(借助数据元素的交换来排序的方法
):冒泡排序: 最坏的情况下,对长度为n的线性表排列需要比较n(n-1)/2
次。快速排序则是对冒泡排序的一种本质改进,其平均时间最佳O(nlog2n) ,最坏O(n2)。如初始序列基本有序,则蜕化为冒泡排序。
插入类排序法(每次将一个待排序元素按其大小插入到前面的有序子表中
):简单插入排序:持续不断的清空无序表,插入有序表中,其效率与冒泡排序法基本相同。希尔排序法则有较大改进。
选择类排序法(每趟从待排序的序列中选择最小的元素,顺序放在有序子表中的后面,直到全部序列满足排序要求为止
):简单选择排序,最坏的情况下要比较n(n-1)/2
次。对于大量数据元素,堆排序则是很有效的。
排序方法比较:
方法 | 平均时间 | 最坏情况时间 | 辅助存储 |
---|---|---|---|
冒泡排序 | O(n2) | O(n2) | O(1) |
快速排序 | O(nlog2n) | O(n2) | O(log2n) |
简单插入排序 | O(n2) | O(n2) | O(1) |
简单选择排序 | O(n2) | O(n2) | O(1) |
堆排序 | O(nlog2n) | O(nlog2n) | O(1) |
基本概念:
对象内部对外是不可见的
);模块独立性好(完成对象功能所需的元素都被封装在对象内部
)。(机器可执行的)程序、数据和(不可执行的)相关文档
组成的完整集合。软件开发生产率低;软件质量难以保证;软件开发进度无法控制;软件成本不断提高;软件维护程度低下;软件需求的增长得不到满足
)。主要原因在于:软件本身的特点,如复杂度高,规模庞大;人们对软件开发维护有许多错误认识和做法,对软件的特性认识不足。为此,诞生了软件工程的概念。原则 | 具体描述 |
---|---|
抽象 | 分层次抽象,自顶向下、逐层细分控制软件开发的复杂性 |
信息隐蔽 | 模块设计成黑箱,不让模块使用者直接访问 |
模块化 | 模块化有助于信息隐蔽和抽象,有助于表示复杂的系统 |
局部化 | 模块间松耦合,模块内部强内聚,有助于控制分解的复杂性 |
确定性 | 软件开发过程中所有概念的表述是无歧义的、确定的、规范的 |
一致性 | 各个模块使用一致的概念、符号;程序内外部接口一致;系统规格说明书和系统行为一致 |
完备性 | 软件系统不丢失任何重要成分,完全实现系统所要求的功能 |
可验证性 | 开发大型的软件系统需要对系统自顶向下、逐层分解,遵循系统易于检查、测试、评审的原则 |
活动名称 | 含义 |
---|---|
软件规格说明 | 规定软件的功能及其运行时的限制 |
软件开发 | 产生满足规格说明的软件 |
软件确认 | 确认能够满足用户提出的要求 |
软件演进 | 为满足用户要求的变更,软件必须在使用的过程中不断演进 |
大时期 | 小阶段 | 主要任务 | 成果与文档 |
---|---|---|---|
软件定义期 | 问题定义 | 确定要解决的问题是什么 | |
可行性研究与计划制定 | 决定该问题是否存在解决方法可行,指定完成任务的实施计划 | 可行性分析报告 | |
需求分析 | 对于开发软件提出的需求进行分析并给出详细定义 | 软件规格说明书、初步的用户手册 | |
软件开发期 | 软件设计 | 分为概要设计和详细设计,给出软件的结构、模块划分及设计流程 | 概要和详细设计说明书、测试计划初稿 |
软件实现 | 在软件设计的基础上编写程序 | 用户手册、操作手册和单元测试计划 | |
软件测试 | 在设计测试用例的基础上检验软件的各个组成部分 | 测试分析报告 | |
运行维护期 | 运行和维护 | 将已交付的软件投入运行,同时不断地维护,进行必要而且可行的扩充和删改 |
也称传统方法学,使用结构化方法完成软件开发的各项任务。
名称 | 图形 | 说明 |
---|---|---|
数据流 | 有向箭头 | 沿箭头方向传输数据,在旁边标注数据流名 |
加工过程 | 圆形 | 转换,输入数据经过加工、交换产生输出 |
数据存储文件 | 类长方形 | 表示存储过程中存放各种数据的文件 |
源/潭 | 长方形 | 表示系统与环境的接口,属于系统之外的实体 |
这是需求分析阶段的最后成果,是软件开发过程中的重要文档之一,衡量它的标准如下:
标准 | 内涵 |
---|---|
正确性 | 首先正确体现系统的真实需求 |
无歧义性 | 对每一个需求没有两种解释 |
完整性 | 涵盖用户对系统的所有需求,包括功能需求、性能需求、接口需求、设计约束等 |
可验证性 | 每一个需求都可在有限代价的有效过程中验证确认 |
一致性 | 各个需求的描述之间不能有逻辑上的冲突 |
可理解性 | 应尽量少使用计算机的概念和术语 |
可修改性 | 结构风格在需要的时候不难改变 |
可追踪性 | 每个需求的来源和流向是清晰的 |
在需求分析阶段已经使用数据流图和数据字典等工具建立了系统的逻辑模型,即做什么,接下来解决怎么做的问题。
划分 | 名称 | 含义 |
---|---|---|
按工程管理角度划分 | 概要设计 | 将软件需求转化为软件体系结构,确定系统及接口、全局数据结构或数据库模式 |
详细设计 | 确认每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。 | |
按技术观点划分 | 结构设计 | 定义软件系统各主要部件之间的关系 |
数据设计 | 将分析时创建的模型转换成数据结构的定义 | |
接口设计 | 描述软件内部、软件和协作系统之间以及软件与人之间如何通信 | |
过程设计 | 把系统结构部件转换成软件的过程描述 |
概念 | 含义 | 图符 |
---|---|---|
模块 | 一个矩形代表一个模块 | 矩形 |
调用关系 | 矩形之间的调用关系用矩形之间的箭头表明 | 箭头或直线 |
信息 | 用带注释的箭头表名模块调用过程中来回传递的信息 | 数据信息是带空心圆的箭头,控制信息则是带实心箭头 |
协调模块 | 对所有下属模块进行协调和管理 | |
传入模块 | 从下级模块取得数据,经处理传到上级模块 | |
变换模块 | 从上级模块取得数据,经过特定的处理转换成其他形式,再传送给上级模块 | |
传出模块 | 从上级模块取得数据,经处理传给下级模块 | |
上级模块 | 控制其他模块的模块 | |
从属模块 | 被另一个模块调用的模块 | |
原子模块 | 树中位于叶子节点的模块,没有从属节点的模块 | |
深度 | 表示控制的层数 | |
宽度 | 最大模块数的层的控制宽度 | |
扇入 | 调用一个给定模块的模块个数 | |
扇出 | 由一个模块直接调用的其他模块个数 |
在软件投入使用之前尽可能多的发现软件中的错误,是保证软件质量、可靠性的关键步骤,是对软件规格说明、设计和编码的最后复审。
又称结构测试或逻辑驱动测试
)把程序看成装在一只透明的白盒子里,测试者必须完全了解程序的结构和处理过程。根据程序的内部逻辑来设计测试用例。其主要是在程序内部进行,完成软件内部操作的验证。主要技术有逻辑覆盖测试和基本路径测试等。选择足够多的测试用例,使被测程序中的每个语句至少执行一次,是逻辑覆盖中的基本覆盖,但是没有关注判断的条件中隐含的错误
)和路径覆盖(执行足够的测试用例,使程序中所有可能的路径至少经历一次
)、判定覆盖(对每个判断条件的取值分支T或F都要测试一次
)、条件覆盖(设计测试用例保证程序中的每个判断的每个条件的可能取值至少执行一次,但可能忽略全面的判断覆盖的要求
)、判断-条件覆盖(使判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有取值分支至少执行一次
)。设计测试用例使之刚好运行在边界情况附近,揭露错误
)、错误推测法(列出所有的错误和易错情况表,基于此设计测试用例;针对性强,非常实用,但是需要丰富经验
)等。软件设计的最小单位
)测试,对软件进行正确性的检验,以尽早发现模块内部可能存在的各种错误。它在编码阶段进行,依据是源程序和详细设计说明书。采用静态或动态测试,动态以白盒测试法为主,测试其结构,黑盒测试法为辅,测试其功能。因为测试的是单模块,需要一些辅助模块去模拟与被测模块相联系的其他模块,即为测试模块设计驱动模块(相当于主程序,接收测试数据,传给被测模块,输出结果
)和桩模块(虚拟子程序,代替被测模块调用的模块,接受被测模块的调用,默认被调用的子模块的功能,将结果返回被测模块
),构成其测试环境。先分别测试每个模块,再按设计要求组装在一起进行整体测试
)和增量方式集成(把要测试的模块和已经测试的模块连接起来测试,测试完把下一个模块连接进来测试
)。在对软件进行成功的测试之后进行程序的调试,诊断和改正程序中的错误。
程序调试基本概念:测试发现错误,调试是在成功测试(发现了错误的测试)
之后排除错误的过程。软件测试贯穿整个软件生命期,调试主要在开发阶段。
程序调试的基本步骤:
(1). 错误定位;(2). 修改设计和代码,排除错误;(3). 进行回归测试,防止引进新的错误。
程序调试的原则:
(1). 错误定性和定位
的原则: 集中思考分析与错误现象有关的信息;不钻死胡同;不要过分依赖调试工具;避免用试探法;
(2). 修改错误
的原则:错误可能群集;要修改错误本身;必须进行回归测试;修改源代码程序,不要改变目标代码。
软件调试方法:从是否追踪和执行程序的角度,分为静态(主要调试手段
)和动态调试(通过人的思维分析代码调错,辅助手段
)。
(1). 强行排错法:传统方法,很低效;设置断点,程序暂停,观察程序状态和继续运行程序
。
(2). 回溯法:相当常用,适合小程序;大程序回溯可能性很低。
(3). 原因排除法:二分法,归纳法,演绎法。都可以使用调试工具来辅助完成,但是工具不能完全替代。
背景 | 人工管理阶段 | 文件管理阶段 | 数据库系统管理阶段 |
---|---|---|---|
应用背景 | 科学技算 | 科学计算、管理 | 大规模管理 |
硬件背景 | 无直接存取设备 | 磁盘、磁鼓 | 大容量磁盘 |
软件背景 | 无操作系统 | 有文件系统 | 数据库管理系统 |
处理方式 | 批处理 | 联机实时处理、批处理 | 分布处理、联机实时处理和批处理 |
特点 | |||
数据管理者 | 人 | 文件系统 | 数据库管理系统 |
数据面向的对象 | 某个应用程序 | 某个应用程序 | 现实世界 |
数据共享程度 | 无共享,冗余度大 | 共享性差,冗余度高 | 共享性大,冗余度小 |
数据独立性 | 不独立,完全依赖于程序 | 独立性差 | 具有高度的物理独立性和逻辑独立性 |
数据结构化 | 无结构 | 记录内部有结构,整体无结构 | 整体结构化,用数据模型描述 |
数据控制能力 | 由应用程序控制 | 由应用程序控制 | 由DBMS提供数据安全性、完整性、并发控制和恢复 |
使数据库中的数据具有较高的逻辑独立性
),概念模式/内模式的映射(使数据库中的数据具有较高的物理独立性
)。现有的数据库系统都是基于某种数据模型而建立的,数据模型是数据库系统的基础。
数据模型三要素:
(1). 数据结构:对系统静态特征的描述,是数据模型的核心。
(2). 数据操作:对系统动态特征的描述,是允许的操作的集合。
(3). 数据约束:特定的语义约束条件,保证数据的正确、有效、相容。
数据模型的类型(按不同的应用层次分成三种):
(1). 概念数据模型(概念模型):一种面向客观世界、面向用户的模型,与具体的平台和系统无关。
(2). 逻辑数据模型(数据模型):面向数据库系统的模型,着重与数据库系统一级的实现。
(3). 物理数据模型(物理模型):面向计算机物理实现的模型。
E-R模型:实体联系模型。有1:1、1:n、n:m三种联系。可以直观的用E-R图表示。属于概念模型。
层次模型:用树形结构表示实体及其联系,节点是实体,树枝是联系,从上到下是一对多的联系
,有且只有一个根节点。
网状模型:用网状结构表示实体及其联系,是层次模型的扩展,允许一个或多个节点无父节点,一个节点可以有多于一个的父节点。
关系模型:用二维表来表示关系
,以其为基本结构建立的模型称为关系模型。
表示关系模型的数据操作的相关理论——关系代数和关系演算。
数据库设计是数据应用的核心,根本目标是要解决数据共享问题。
成果:需求说明书
。设计数据库的起点,收集到的基础数据和数据流程图是下一步设计概念结构的基础。方法主要有两种:结构化分析(SA,自顶向下,逐步分解;使用数据流程图和数据字典,数据字典包含数据项、数据结构、数据流、数据存储和处理过程)和面向对象分析。成果:概念数据模型
。分析数据间的语义关联,在此基础上建立一个数据的概念模型。方法有集中式模式设计法(设计简单方便,强调统一一致,适合小型单位
)和视图集成设计法(先做局部在合并;选择局部应用,视图设计——逐一设计分E-R图,视图集成——合并E-R图,得到概念模式,常见的冲突有命名、概念、域、约束冲突;策略:自顶向下,自底向上,自内向外)
。成果:逻辑数据模型
。将E-R图转换为关系模式(即关系数据模型),这就是逻辑设计的主要内容。在关系模式的基础上进行关系视图设计(外模式设计,用户子模式设计),关系视图具有优点(提供数据逻辑独立性;能够适应用户对数据的不同需求;有一定的数据保密功能
)。其后还要进行规范化。成果:数据库内模型
。是为一个给定的逻辑模型选取一个最适合应用要求的物理结构的过程。一般留给用户的内容有索引设计、集簇设计、分区设计。