1.数据表示
1.1进制的转换
进制 数码 基数 位权 十进制(D) 0,1,2,3,4,5,6,7,8,9 10 10^k 二进制(B) 0,1 2 2^k 十六进制(H) 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 16 16^k
1.1.1 按权展开法(R进制转十进制)
R进制转十进制使用按权展开法,其具体操作方式为:将R进制数的每一位数值用R^k形式表示,即幂的底数是R,指数为k,k与该位和小数点之间的距离有关。当该位位于小数点左边,k值是该位和小数点之间数码的个数,而当该位位于小数点右边,k值是负值,其绝对值是该位和小数点之间数码的个数加1。
例如:
进制 数值 按权展开 转为十进制 二进制 10100.01 1*2^4+0+1*2^2+0+0+0+1*2^-2 20.25 七进制 604.01 6*7^2+0+4*7^0+0+1*7^-2 298+1/49
1.1.2 短除法(十进制转R进制)
十进制转R进制使用短除法(除基取余法):除以基数取到余数,一直到商0,然后从下向上依次排列
例如:
十进制 二进制 16进制 94
被除数 除数 商 余 94 2 47 0 47 2 23 1 23 2 11 1 11 2 5 1 5 2 2 1 2 2 1 0 1 2 0 1
被除数 除数 商 余 94 16 5 14(E) 5 16 0 5 结果 1011110 5EH 结果:由下向上依次排列
1.1.2.1 快速算法
10转2
记住常用的2的n次方,找到最大的且小于等于需要运算的值。
2^1 2 2^6 64 2^2 4 2^7 128 2^3 8 2^8 256 2^4 16 2^9 512 2^5 32 2^10 1024 例如94:
计算次数 计算 幂 结果 1 94-2^6 6 30 2 30-2^4 4 14 3 14-2^3 3 6 4 6-2^2 2 2 5 2-2^1 1 0 对应的幂有值则取1,无值则取0,一直到幂为0为止(幂为0说明该位置位于小数点左侧第一位),结果为:
位置 6 5 4 3 2 1 0 值 1 0 1 1 1 1 0
2转8/8转2
二进制转八进制。
八进制最大数值为7对应二进制【111】,位权是【421】。
把二进制的三位看做是一个数并对其位权求和,不足的话需要补0。
例如:
数值 10001110 补0 010001110 分组 【010】【001】【110】 按位权求值 【0+1*2^1+0】【0+0+1*2^0】【1*2^2+1*2^1+0】 求和 【2】【1】【6】 结果 216 八进制转进制二。
把八进制的一位看作是三位即可。
例如:216=【010】【001】【110】=10001110
2转16/16转2
和8进制类似,16进制对应2进制的4位数,位权是【8421】
1.1.3 码制
1.1.3.1原/反/补/移码
原码:最高位是符号位,其余低位置表示数值的绝对值。
反码:
正数:和原码一样。
负数:符号(最高)位不动,其余值取反(1取0,0取1)。
补码:
正数:和原码一样。
负数:在其反码末尾+1。
移码:不区分正负数,在补码符号位按位取反。
码制\数值 1 -1 1-1 原码 0000 0001 1000 0001 1000 0010 反码 0000 0001 1111 1110 1111 1111 补码 0000 0001 1111 1111 0000 0000 移码 1000 0001 0111 1111 1000 0000 1-1 即为1+(-1)。
移码运算与其他运算不同。
1.1.3.2 表示数值范围
码制\数值 定点整数 定点小数 数码个数 原码 -[(2^n-1)-1] ~
+[(2^n-1)-1]
-[1-2^-(n-1)] ~
+-[1-2^-(n-1)]
(2^n)-1 反码 -[(2^n-1)-1] ~
+[(2^n-1)-1]
-[1-2^-(n-1)] ~
+-[1-2^-(n-1)]
(2^n)-1 补码 -(2^n-1) ~
+[(2^n-1)-1]
-1 ~
+-[1-2^-(n-1)]
2^n 移码 -(2^n-1) ~
+[(2^n-1)-1]
-1 ~
+-[1-2^-(n-1)]
2^n
类型 定点整数 定点小数 位数 当n=8时也就是一共有8个位数。 原码 范围
-[(2^n-1)-1] ~
+[(2^n-1)-1]
-[1-2^-(n-1)] ~
+-[1-2^-(n-1)]
-127~
+127
-0.1111111~~
+0.1111111
二进制 1111 1111 ~~0111 1111
补码 二进制 1000 0000 ~~
0111 1111
其中-128的补码 1000 0000
是人为指定的
-1 ~~
+0.1111111
其中-1的补码 1000 0000
是人为指定的
1.1.4 浮点数
1.1.4.1 浮点数的表示
N=尾数*基数^指数(阶码)
运算过程:对阶>尾数计算>结果格式化(结果限定在0.5-1之间)。
特点:
1、一般尾数用补码,阶码用移码(IEEE754位数也可以用原码表示)。2、阶码的位数决定数的表示范围,位数越多范围越大。
3、尾数的位数决定数的有效精度,位数越多精度越高。
4、对阶时,小数向大数看齐。
5、对阶是通过较小数的尾数右移实现的。
阶符:阶码符号位。
数符:尾数的符号位。
1.1.5逻辑运算
1.1.5.1 关系运算符
< 小于 优先级相同(高) > 大于 <= 小于等于 >= 大于等于 == 等于 优先级相同(低) != 不等于 说明:关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符。
1.1.5.2 逻辑运算
逻辑变量之间的运算称为逻辑运算。二进制数1和0在逻辑上可以代表“真”与“假”。
A B !A A+B A*B A XOR B 0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0
1.1.5.3逻辑运算符
&&(逻辑与) 相当于其他语言中的AND
(逻辑或) 相当于其他语言中的OR
(逻辑非) 相当于其他语言中的NOT
例:a&&b 若a,b为真,则a&&b为真。al|b 若a,b之一为真,则ab为真。!a 若a为真,则!a为假。
1.1.5.4优先次序
!(非)>&&(与)>||(或)
逻辑运算符中的"&&"和"||"低于关系运算符,"!"高于算术运算符因此运算符的优先顺序为:!>算术运算符>关系运算符>&&>||>赋值运算符
1.1.5.5 短路原则
在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。
(1)a&&b&&c 只有a为真时,才需要判断b的值,只有a和b都为真时,才需要判断c的值。
(2)a||b||c 只要a为真,就不必判断b和c的值,只有a为假,才判断b。a和b都为假才判断c。
1.2.校验码
1.2.1 基础知识
码距;任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据校验码的码距。
例如,用4位工进制表示16种状态,则有16个不同的码字,此时码距为1。如0000与0001。
1.2.2 奇偶校验码
奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。
奇校验:整个校验码(有效信息位和校验位)中“1”的个数为奇数。
偶校验:整个校验码(有效信息位和校验位)中“1”的个数为偶数。奇偶校验,可检查1位(奇数位)的错误,不可纠错。
1.2.3 循环校验码CRC
CRC校验,可检错不可纠错。
CRC的编码方法是:在k位信息码之后拼接r位校验码。应用CRC码的关键是如何从k 位信息位简便地得到r位校验位(编码),以及如何从k+r位信息码判断是否出错。
把接收到的CRC码用约定的生成多项式G(X)去除(模二除法),如果正确则余数为0;如果某一位出错,则余数不为0。不同的位数出错其余数不同,余数和出错位序号之间有惟一的对应关系。
1.2.4 海明校验码
海明校验码的原理是:在有效信息位中加入几个校验位形成海明码使码距比较均匀地拉大,并把海明码的每个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化这不但可以发现错误,还能指出错误的位置,为自动纠错提供了依据。
海明校验,可检错,也可纠错。
2^r >= m+r+1
1.2.5 校验码总结
校验码 位数 位置 检错 纠错 校验方式 奇偶校验 1 一般在头部 可检奇数位错 不可纠错 奇校验:最终1的个数是奇数个。
偶校验:最终1的个数是偶数个。
CRC循环冗余校验 生成多项式的最高次幂决定 尾部 可检错 不可纠错 模二除法求余数,拼接作为校验位。 海明校验 2^r >= m+r+1 插入在信息位中间 可检错 可纠错 分组奇偶校验。
1.3 CPU的组成(运算器与控制器)
1.3.1 计算机的结构
1.3.2 CPU结构
运算器 算术逻辑单元ALU 数据的算术运算和逻辑运算 累加寄存器AC 通用寄存器,为ALU提供一个工作区,用于暂存数据。 数据缓冲寄存器DR 写内存时用于暂存指令或数据。 状态条件寄存器PSW 存状态标志与控制标志(也有将其归为控制器的)。 控制器 程序计数器PC 存储下一条要执行指令的地址。 指令寄存器IR 存储即将执行的指令地址。 指令译码器ID 对指令中的操作码字段进行分析 解释。 时序部件 提供时序控制信号。
1.4 寻址方式
1.4.1 指令的基本概念
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下:
操作码字段 地址码字段 MOV ADD JMP
OP A1 A2
1.4.2 寻址方式
寻址方式 特点 执行方式 立即寻址方式 操作数直接放在指令中,速度快,灵活性差。 ![]()
直接寻址方式 指令中存放的地址是操作数的地址。 间接寻址方式 特点:指令中存放了一个地址,这个地址对应的内容是操作数的地址。 寄存器寻址方式 寄存器中存放操作数。 寄存器间接寻址方式 寄存器中存放操作数的地址。
1.5 CISC与RISC
指令系统类型 指令 寻址方式 实现方式 其他 CISC(复杂) 数量多,使用频率差别大,可变长格式。 支持多种 微程序控制技术(微码) 研制周期长 RISC(精简) 数量少,使用频率接近,大部分为单周期指令,操作寄存器,只有Load/Store操作内存。 支持方式少,(以寄存器寻址为主)。 增加了通用寄存器(为了解决寄存器不够用);硬布线控制为主(硬件线路);适合采用流水线。 优化编译,有效支持高级语言 CISC与RISC比较,分哪些维度?
指令数量、指令使用频率,寻址方式,寄存器,流水线支持:高级语言支持。
CISC:复杂,指令数量多,频率差别大,多寻址
RISC:精简,指令数量少,操作寄存器,单周期,少寻址,多通用寄存器,流水线。
1.6 流水线技术
1.6.1 概念
相关参数计算:流水线执行时间计算、流水线吞吐率、流水线加速比、流水线效率。
流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的,它们可同时为多条指令的不同部分进行工作,以提高各部件的利用率和指令的平均执行速度。
1.6.2 流水线计算
流水线周期为执行时间最长的一段
流水线计算公式为:1条指令执行时间+(指令条数-1)*流水线周期
①理论公式:(t1+t2+..+tk)+(n-1)*t(第一条指令执行结束时间+(总条数-1)*流水线周期为执行时间最长的一段,默认)
②实践公式:k*t+(n-1)*t(把每一条都作为流水线周期为执行时间最长的一段,k为一个周期命令总数*流水线周期为执行时间最长的一段+(指令条数-1)*流水线周期)
1.6.3 流水线吞吐率计算
流水线的吞吐率(Though Putrate,TP)是指在单位时间内流水线所完成的任务数量或输出的结果数量。计算流水线吞吐率的
最基本的公式如下(理论公式计算):
流水线最大吞吐率:
t是流水线周期为执行时间最长的一段,流水线的导数。
1.7 存储系统
1.7.1:层次化存储体系
1.7.1.1概念:
局部化原理是层次存储结构的支撑,分为:
时间局部性:刚访问的内容立即又被访问(循环)。
空间局部性:刚访问的内容,临近的空间很快被访问(数组)。
1.7.1.2:层次化存储结构分类
1.按位置:内存、外存。
2.存取方式:
2.1按内容存取:
相联存储器(Cache)。
2.2 按地址存取:
随机存取存储器(内存)。
顺序存取存储器(磁带)
直接存取存储器(磁盘)
3.工作方式:
3.1随机存取存储器RAM(内存DRAM、掉电丢失)
3.2只读存储器ROM(BIOS、掉电保留)
DRAM:动态随机存取存储器。
SRAM:静态随机存取存储器。
Cache:高速缓存。
EEPROM:电可擦可编程只读存储器。
1.7.2:Cache
1.7.2.1 概念
在计算机的存储系统体系中,Cache是访问速度最快的层次(若有寄存器,则寄存器最快)。
使用Cache改善系统性能的依据是程序的局部性原理。
时间局部性
空间局部性如果以h代表对Cache的访问命中率t1,表示Cache的周期时间,t2表示主存储器周期时间,以读操作为例,使用“Cache+主存储器”!的系统的平均周期为t;,则:
t3=h*t1+(1-h)*t2例如:t1=1ms,t2为100ms,h=90%,访问100次时间为
109ms。
其中,(1-h)又称为失效率(未命中率)
直接相联映像:硬件电路较简单,但冲突率很高。
全相联映像:电路难于设计和实现,只适用于小容量的cache,冲突率较低。
组相联映像:直接相联与全相联的折中。
注:主存与Cache之间的地址映射由硬伴直接完成。
1.7.2.2 Cache-映像
1.7.2.2.1直接相联映像
当0-14号页面都被放置,只有15页空闲,但是此时还有2048-15都未被放置,可以被放到15页不冲突的只有0-127区的15号页,会发生冲突的有2048-15-128,冲突率非常高,电路简单。
1.7.2.2.2 全相联映像
每个页面都可以放到任意页面,冲突率低,但是电路复杂
1.7.2.2.3 组联映像
电路复杂度二者折中,冲突率二者折中。
1.7.2.3 映像对比
分类 冲突率 电路复杂度 直接相联映像 高 简单 全相联映像 低 复杂 组相联映像 折中 折中
1.7.3:主存编址计算
1.7.3.1 主存-编址与计算
存储单元
存储单元个数=最大地址-最小地址+1
编址内容
按字编址:存储体的存储单元是字存储单元,即最小寻址单位是一个字按字节编址:存储体的存储单元是字节存储单元,即最小寻址单位是一个字节。
总容量=存储单元个数*编址内容
根据存储器所要求的容量和选定的存储芯片的容量,就可以计算出所需芯片的总数,即:
总片数=总容量*每片的容量
1.8 输入/输出技术
1.8.1 数据传输控制方式
程序控制(查询)方式:分为无条件传送和程序查询方式两种。方法简单,硬件开销小,但I/0能力不高,严重影响CPU的利用率。
程序中断方式:与程序控制方式相比,中断方式因为CPU无需等待而提高了传输请求的响应速度。(CPU与数据传输并行)
DMA方式:DMA方式是为了在主存与外设之间实现高速、批量数据交换而设置的。DMA方式比程序控制方式与中断方式都高效。(DMAC向总线裁决逻辑提出总线请求;CPU执行完当前总线周期即可释放总线控制权。此时DMA响应,通过DMAC通知I/O接口开始DMA传输。)
通道方式
I/O处理机从上往下处理效率越来越高。
1.8.1.1 中断处理方式
中断处理过程:
CPU无需等待也不必查询I/O状态。
当I/O系统准备好以后,发出中断请求信号通知CPU;
CPU接到中断请求后,保存正在执行程序的现场(保存现场),打断的程序当前位置即为断点。(通过中断向量表)转入I/O中的服务程序的执行,完成I/O系统的数据交换;
返回被打断的程序继续执行(恢复现场)
1.9 总线
一条总线同一时刻仅允许一个设备发送,但允许多个设备接收(分时双工)。
总线的分类:
数据总线(Data Bus):在CPU与RAM之间来回传送需要处理或是需要储存的数据。
地址总线(Address Bus):用来指定在RAM(Random AccessMemory)之中储存的数据的地址。
控制总线(ControlBus):将微处理器控制单元(ControlUnit)的信号,传送到周边设备。
1.10 可靠性
平均无故障时间→(MTTF)MTTF=1/γ,γ为失效率,
平均故障修复时间 →(MTTR) MTTR=1/μ,μ为修复率
平均故障间隔时间→(MTBF)MTBF=MTTR+MTTF
系统可用性 → MTTE(MTTR+MTTF)x100%
在实际应用中,
一般MTTR很小,所以通常认为MTBF≈MTTF。
可靠性可以用可以用MTTF/(1+MTTF)来度量。
1.10.1 串联系统与并联系统
1.11 性能指标
1.12 概述
1.2.1 考点分析
2.操作系统
2.1操作系统的概念
2.1.1:操作系统的作用
1.管理系统的硬件、软件、数据资源
2.控制程序运行
3.人机之间的接口
4.应用软件与硬件之间的接口任务板块
1.进程管理
2.存储管理
3.文件管理4.作业管理
5.设备管理
2.1.2:特殊的操作系统
分类 特点 批处理操作系统 单道批:一次一个作业入内存,作业由程序、数据、作业说明书组成
多道批:一次多个作业入内存,特点:多道、宏观上并行微观上串行
分时操作系统 采用时间片轮转的方式为多个用户提供服务,每个用户感觉独占系统
特点:多路性、独立性、交互性和及时性
实时操作系统 实时控制系统和实时信息系统交互能力要求不高,可靠性要求高(规定时间内响应并处理) 网络操作系统 方便有效共享网络资源,提供服务软件和有关协议的集合
主要的网络操作系统有:Unix、Linux和WindowsServer系统
分布式操作系统 任意两台计算机可以通过通信交换信息
是网络操作系统的更高级形式,具有透明性、可靠性和高性能等特性
微机操作系统 Windows:Microsoft开发的图形用户界面、多任务、多线程操作系统
Linux:免费使用和自由传播的类Unix操作系统,多用户、多任务、多线程和多CPU的操作系统
嵌入式操作系统 运行在智能芯片环境中
特点:微型化、可定制(针对硬件变化配置)、实时性、可靠性、易移植性(HAL和BSP支持)(可定制和易移植容易混淆)
2.2 进程的概念
2.2.1:线程的概念
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。它由程序块、进程控制块(PCB)和数据块三部分组成。
PCB:PCB是进程存在的唯一标志。内容包含进程标识符、状态、位置信控制信息、队列指针(链接同一状态的进程)、优先级、现场保护区等。
进程与程序的区别:进程是程序的一次执行过程,没有程序就没有进程。
程序是一个静态的概念,而进程是一个动态的概念,它由创建而产生,完成任务后因撤销而消亡;进程是系统进行资源分配和调度的独立单位,而程序不是。
进程的2个基本属性:可拥有资源的独立单位;可独立调度和分配资源的基本单位。
线程可以共享资源。
2.2.2:进程的状态
2.2.2.1 三态模型
运行:当一个进程在CPU上运行时。单处理机处于运行态的进程只有一个)
就绪:一个进程获得了除CPU外的一切所需资源,一旦得到处理机即可
阻塞:阻塞也称等待或睡眠状态,一个进程正在等待某一事件发生(例如求I/O等待I/0完成等)而暂时停止运行,此时即使把CPU分配给进程也无法运行,故称进程处于阻塞状态。就绪态无法回到阻塞态,阻塞态也无法直接成为运行态。
2.2.2.2 五态模型
挂起原因:
(1)进程过多,主存资源不足,此时必须将某些进程挂起放到磁盘对换区,暂时不参与调
度,以平衡系统负载;
(2)系统出现故障,或者是用户调试程序,也可能需要将进程挂起检查问题。
2.3 进程调度
2.3.1:PV操作的概念
互斥:如千军万马过独木桥。间接制约关系
临界资源:诸进程间需要互斥方式对其进行共享的资源。(进程中访问临界资源的那段代码称为临界区)
同步:速度有差异,在一定情况停下等待。直接制约关系
2.3.2:信号量与PV操作
信号量:是一种特殊的变量。
信号量可以表示资源数量;
信号量为负数时还可以表示排队进程数。
P是荷兰语的Passeren,V是荷兰语的Verhoog。
2.3.2.1 互斥模型
多个进程共享一台打印机问题(互斥模型)
P(S);
便用打印机:
V(s); 后续代码;
互斥信号量S的初值为1(打印机输的数量M)。
2.3.2.2 同步模型
市场资源S1初始值为1,产品资源S2初始值为0
2.3.2.3 综合模型
将产品送到缓冲区或从缓冲区取产品,不同时操作,所以送产品之前应用P(S)加锁,送完之后V(S)解锁,从缓冲区取产品也一样。
2.3.3:前趋图与PV操作
执行前检查前置,执行后解锁后置
2.4 死锁资源数计算
2.4.1 死锁概念
所谓死锁,是指两个以上的进程互相都要求对方已经占有的资源导致无法继续运行下去的现象。
死锁四大条件:
互斥
保持和等待不剥夺
环路等待
2.4.2死锁的处理
死锁的预防:(打破四大条件)有序资源分配法静态资源分配
死锁的避免:银行家算法
死锁的检测与解除
鸵鸟策略(不予理睬)
进程管理是操作系统的核心,但如果设计不当,就会出现死锁的问题。如果进程在等待一件不可能发生的事,则进程就死锁了。而如果多个进程产生死锁,就会造成系统死锁。
系统不可能发生死锁的最小资源数(w-1)*m+1<=n(m为进程个数,w为每个进程所需资源数量)。
2.5 进程资源图
先分析资源分配情况,列出剩余可用资源:此时已分配1个R1给进程P,剩余1个R1可用。再判断申请后进程是否能够执行:P进程申请1个R1,系统有1个R1可用,P进程可成功执行,执行后释放占用的2个R1。
2.6段页式存储
2.6.1:页式存储
2.6.1.1:页式存储组织
页式存储:将程序与内存均划分为同样大小的块,以页为单位将程序调入内存。
页表块号又叫做页帧号。
逻辑地址=页号+页内地址。
物理地址=页帧号+页内地址。
例如,页式存储系统中每个页的大小为4KB
逻辑地址:10 1100 1101 1110对应物理地址计算为:
前两位是页号,10为第二页,查表可得对应物理内存地址为6,转为2进制等于110。
故物理地址为:110 1100 1101 1110
优点:利用率高,碎片小,分配及管理简单。
缺点:增加了系统开销;可能产生抖动现象。
高级程序语言中使用 内存中使用 1:在内存中
0:不在内存中1:最近访问过
0:最近未被访问1:内容被修改;
0:内容未被修页号(逻辑) 页帧号(物理) 状态位 访问位 修改位 0 2 1 1 0 1 3 1 0 1 2 5 1 1 0 3 - 0 0 0 4 - 0 0 0 5 6 1 1 1 局部化原理是层次存储结构的支撑,分为:
时间局部性:刚访问的内容立即又被访问(循环)。
空间局部性:刚访问的内容,临近的空间很快被访问(数组)。
根据时间局部性和空间局部性原则:
1. 优先淘汰访问为0的。
2.如果访问全部都是1,则淘汰修改位为0的。
2.6.1.2页面置换算法
最优(optimal,OPT)算法(理想型)。
随机(RAND)算法。
先进先出(FIFO)算法:有可能产生“抖动”。例如,432143543215序列,用3个页面,比4个缺页要少。
最近最少使用(LRU)算法:不会“抖动”,LRU的理论依据是“局部性原理”。
2.6.2:段式存储
2.6.2.1:段式存储组织
段式存储:按用户作业中的自然段来划分逻辑空间,然后调入内存,段的长度可以不一样。
合法段地址:(0,25K)
非法段地址:(0,35K)偏移量必须小于段长,否则是非法地址。
优点:多道程序共享内存,各段程序修改互不影响。
缺点:内存利用率低,内存碎片浪费大。
2.6.3:段页式存储
2.6.2.1:段页式存储组织
段页式存储:段式与页式的综合体。先分段,再分页。1个程序有若干个段:每个段中可以有若干页,每个页的大小相同,但每个段的大小不同。
段的个数不固定,一般为2^(最大值-最小值+1)个
页的个数不固定,一般为2^(最大值-最小值+1)个
页的大小不固定,一般为2^(最大值-最小值+1)个
优点:空间浪费小、存储共享容易、存储保护容易、能动态连接。
缺点:由于管理软件的增加,复杂性和开销也随之增加,需要的硬件以及占用的内容也有所增加,使得执行速度大大下降。
2.7 磁盘管理
2.7.1存储管理-磁盘管理
存取时间=寻道时间+等待时间,寻道时间是指磁头移动到磁道所需的时间;等待时间为等待读写的扇区转到磁头下方所用的时间。
读取磁盘数据的时间应包括以下三个部分:
(1)找磁道的时间。
(2)找块(扇区)的时间,即旋转延迟时间。
(3)传输时间。
2.7.2 磁盘调度(SSTF)
(1)先来先服务(FCFS)
(2) 最短寻道时间优先(SSTF)
(3)扫描算法(SCAN)(电梯算法)
循环扫描(CSCAN)算法
2.8 I/O管理软件
2.9 文件管理
2.9.1:文件相关概念
文件:具有符号名的、在逻辑上具有完整意义的一组相关信息项的集合。
逻辑结构:有结构的记录式文件、无结构的流式文件。
物理结构:连续结构、链接结构、索引结构、多个物理块的索引表。
文件目录:
文件目录项/文件的说明/文件控制块FCB基本信息类:文件名、文件的物理地址、文件长度和文件块数等
存储控制信息类:文件的存储权限:读写、执行权限等
(文件属性:只执行、隐含、只读、读/写、共享、系统)
使用信息类:文件建立日期、最后一次修改/访问日期、当前使用的信息、打开文件的进程数以及在文件上的等待队列等
目录结构
一级目录结构:线性结构,查找速度慢,不允许重名和实现文件共享等二级目录结构:主文件目录(MFD)+用户目录(UFD)
三级目录结构:树型目录结构(多级目录结构)
2.9.2:树形目录结构(绝对路径与相对路径)
多级目录结构允许不同用户的文件可以具有相同的文件名
绝对路径:是从盘符开始的路径。
相对路径:是从当前目录开始的路径。
全文件名:绝对路径+文件名
3:位示图
2.9.4:索引文件
2.9.4.1 索引结构
2.10 作业管理
2.10.1 作业状态
2.10.2 作业调度算法
先来先服务法
时间片轮转法
短作业优先法
最高优先权优先法
高响应比优先法
响应比=(作业等待时间+作业执行时间)/作业执行时间
2.11 章节概述
3.数据库系统
3.1数据库的基本概念
3.1.1:数据库体系结构
3.1.1.1集中式数据库系统
数据是集中的数据管理是集中的
数据库系统的素有功能(从形式的用户接口到DBMS核心)都集中在DBMS所在的计算机
3.1.1.2C/S结构
客户端负责数据表示服务服务器主要负责数据库服务
数据库系统分为前端和后端
ODBC、JDBC
3.1.1.3 分布式数据库
物理上分布、逻辑上集中
物理上分布、逻辑上分布
特点
透明性
特点:
数据独立性。除了数据的逻辑独立性与物理独立性外,还有数据分布独立性(分布透明性)。
集中与自治共享结合的控制结构。各局部的DBMS可以独立地管理局部数据库,具有自治的功能。同时,系统又设有集中控制机制,协调各局部DBMS的工作,执行全局应用。
适当增加数据冗余度。在不同的场地存储同一数据的多个副本,可以提高系统的可靠性和可用性,同时也能提高系统性能。
(提高系统的可用性,即当系统中某个节点发生故障时,因为数据有其他副本在非故障场地上,对其他所有场地来说,数据仍然是可用的,从而保证数据的完备性。)
全局的一致性、可串行性和可恢复性。
透明性:
分片透明:是指用户不必关心数据是如何分片的,它们对数据的操作在全局关系上进行,即如何分片对用户是透明的。
复制透明:用户不用关心数据库在网络中各个节点的复制情况,被复制的数据的更新都由系统自动完成。
位置透明:是指用户不必知道所操作的数据放在何处,即数据分配到哪个或哪些站点存储对用户是透明的。
局部映像透明性(逻辑透明):是最低层次的透明性,该透明性提供数据到局部数据库的映像,即用户不必关心局部DBMS支持哪种数据模型、使用哪种数据操纵语言,数据模型和操纵语言的转换是由系统完成的。因此,局部映像透明性对异构型和同构异质的分布式数据库系统是非常重要的。
3.1.1.4并行数据库
共享内存式
无共享式
3.1.2:三级模式结构
逻辑独立性:数据的逻辑结构发生变化后,用户程序也可以不修故。但是为了保证应用程序能够正确执行,需要修改外使式和概念模式之间的映像。
物理独立性:当数据的物理结构发生改变是,应用程序不用改变。但是为了能够保证应用程序能够给正确执行,霜要修改概念模式和内模议之间的映像。
3.1.3:数据仓库
面向主题:数据按主题组织。
集成的:消除了源数据中的不一致性,提供整个企业的一致性全局信息,
相对稳定的(非易失的):主要进行查询操作,只有少量的修改和删除操作(或是不删除)。
反映历史变化(随着时间变化):记录了企业从过去某一时刻到当前各个阶段的信息,可对发展历程和未来趋势做定量分析和预测。
OLTP:数据库:联机事务
OLAP:数据仓库:联机分析
3.2 数据库设计过程
聚簇索引在物理设计考虑。
3.3概念设计阶段
3.3.1:概念设计过程
集成的方法:
多个局部E-R图一次集成。
逐步集成,用累加的方式一次集成两个局部E-R。集成严生的冲突及解决办法:(针对同一对象)
属性冲突:包括属性域冲突和属性取值冲突。
命名冲突:包括同名异义和异名同义。
结构冲突:包括同一对象在不同应用中具有不同的抽象,以及同一实体在不同局部E-R图中所包含的属性个数和属性排列次序不完全相同。
3.3.2:E-R图
实体:实体是现实世界中可以区别于其他对象的事件或事物。(实体集一实体的集合)
属性:属性是实体某方面的特性。联系:实体的联系分为实体内部的联系和实体与实体间的联系。实体间联系类型:1:1,1:*,*:*
属性:
简单属性和复合属性
简单属性是原子的,不可再分的;
复合属性可以细分为更小的部分(即划分为别的属性)
单值属性和多值属性:
定义的属性对于一个特定的实体都只有单独的一个值,称为单值属性;
在某些特定情况下,一个属性可能对应一组值,称为多值属性NULL属性:表示无意义或不知道。
派生属性:可以从其他属性得来。
联系:
一对一(1:1)
一对多(1:n)
多对多(m:n)两个以上不同实体集之间的联系(三元联系)多重度的确定(可根据语义直接转换)
以三元关系中的一个实体作为中心,假设另两个实体都只有一个实例:
若中心实体只有一个实例能与另两个实体的一个实例进行关联,则中心实体的连通数为“一”
若中心实体有多于一个实例能与另两个实体实例进行关联,则中心实体的连通数为“多”。P_D:表示一个病房有多个病人和多个医生,一个医生只负责一个病房,一个病人只属一个病房。
SP_P:表示供应商为多个项目供应多种零件,每个项目可用多个供应商供应的零件,每种零件可由不同的供应商供应。
同一个实体集内的二元联系:
弱实体:在现实世界中有一种特殊的依赖联系,该联系是指某实体是否存在对于另一些实体具有很强的依赖关系,即一个实体的存在必须以另一个实体为前提,而将这类实体称为弱实体,如家属与职工的联系,附件与邮件。
特殊化:在现实世界中,某些实体一方面具有一些共性,另一方面还具有各自的特性,一个实体集可以按照某些特征区分为几个子实体。
聚集:一个联系作为另一个联系的一端。
3.4逻辑结构设计
3.4.1:关系模式相关概念
3.4.1.1 数据模型
层次模型
网状模型
关系模型
面向对象模型
数据模型三要素:数据结构、数据操作、数据的约束条件
3.4.1.2关系模型相关概念
目或度:关系模式中属性的个数。
候选码(候选键)主码(主键)
主属性与非主属性:组成候选码的属性就是主属性,其它的就是非主属性
全码(ALL-Key):关系模式的所有属性组是这个关系的候选码。
候选键位属性的集合:可以有一个,可以有多个,可以是单个属性,也可以是多个属性的集合。
3.4.1.3关系的3种类型
基本关系
查询表
视图表
3.4.1.4整性约束
实体完整性约束:主键唯一且非空
参照完整性约束:外键要么是其他关系主键,要么为空
用户自定义完整性约束
触发器:根据某个属性改变,随之修改另一个属性。
3.4.2:E-R图转关系模式
一个实体型必须转换为一个关系模式
联系转关系模式:
(1)一对一联系的转换有两种方式。
独立的关系模式:并入两端主键及联系自身属性。(主键:任一端主键)
归并(任意一端):并入另一端主键及联系自身属性。(主键:保持不变)
独立:
归并:
(2)一对多联系的转换有两种方式。
独立的关系模式:并入两端主键及联系自身属性。(主键:多端主键)
归并(多端):并入另一端主键及联系自身属性。(主键:保持不变)
独立:
归并:
(3)多对多联系的转换只有一种方式
独立的关系模式:并入两端主键及联系自身属性。(主键:两端主键的组合键)
3.5 关系代数
3.5.1 并集交集差集
差集要注意方向。
3.5.2 笛卡尔积
列数等于二者之和,类似于SQL中的内连接
行数等于两个表行数的积
3.5.3 投影
列数等于选择的列数,行数不变
3.5.4选择
列数不变,行数等于选择的行数
3.5.5 自然连接
属性列数等二者属性列之和-重复属性列数,行数等于同名属性列相等的行数。
先选择再投影,笛卡尔积和自然连接相同,先投影在选择,由于已经将重复列筛除,则无法和自然连接相等。
3.6 规范化理论
3.6.1:规范化理论基本概念
3.6.1.2 函数依赖
设R(U)是属性U上的一个关系模式,X和Y是U的子集,r为R的任一关系,如果对于r中的任意两个元组u,v,只要有u[X]=v[X],就有u[Y]=v[Y],则称X函数决定Y,或称Y函数依赖于X,记为X→Y。
部分函数依赖
传递函数依赖
由:A->B,B->C,可得出A->C。此为传递函数依赖
3.6.1.3 Amstrong公理体系
关系模式R<U,F>来说有以下的推理规则:
A1.自反律(Reflexivity):若Y⊆X⊆U,则X→Y成立。
A2.增广律(Augmentation):若Z⊆U且X→Y,则XZ→YZ成立。
A3.传递律(Transitivity):若X→Y且Y→Z,则X→Z成立。根据A1,A2,A3这三条推理规则可以得到下面三条推理规则
合并规则:由X→Y,X→Z,有X→YZ。(A2,A3)
伪传递规则:由X→Y,WY→Z,有XW→Z。(A2,A3)
分解规则:由X→Y及Z⊆Y,有X→Z。(A1, A3)
3.6.1.4 候选键
★ 图示法求候选键
1、将关系的函数依赖关系,用“有向图”的方式表示。2、找出人度为0的属性,并以该属性集合为起点,尝试遍历有向图,若能正常遍历图中所有结点,则该属性集即为关系模式的候选键
3、若入度为0的属性集不能遍历图中所有结点,则需要尝试性的将一些中间结点(既有入度,也有出度的结点)并入入度为0的属性集中,直至该集合能遍历所有结点,集合为候选键。
主属性与非主属性 :
定义:组成候选码的属性就是主属性,其它的就是非主属性。
3.6.2:范式判断
问题:数据冗余、修改异常、插入异常、删除异常
3.6.2.1第1,2,3范式
第一范式(1NF):在关系模式R中,当且仅当所有域只包含原子值,即每个属性都是不可再分的数据项,则称关系模式R是第一范式。
例如:关系模式R(系名称,高级职称人数)是否满足1NF,如果不满足,应如何调整?
第二范式(2NF):当且仅当关系模式R是第一范式(1NF),且每一个非主属性完全依赖候选键(没有不完全依赖)时,则称关系模式R是第二范式。
思考题:关系模式SC(学号,课程号,成绩,学分),其中:(学号,课程号)→成绩,课程号→学分,会存在哪些问题(从数据冗余、更新异常、插入异常、删除异常这几个方面来考虑),解决方案是什么?
第三范式(3NF):当且仅当关系模式R是第二范式(2NF),且R中没有非主属性传递依赖于候选键时,则称关系模式R是第三范式。
思考题:学生关系(学号,姓名,系号,系名,系位置)各属性分别代表号,姓名,所在系号,系名称,系地址。思考该关系模式会存在哪些问题(从据冗余、更新异常、插入异常、删除异常这几个方面来考虑),解决方案是什么?
3.6.2.2 BC范式
BC范式(BCNF):设R是一个关系模式,F是它的依赖集,R属于BCNF当且仅当其F中每个依赖的决定因素必定包含R的某个候选码。
例:关系模式STJ(S,T,J)中,S表示学生,T表示老师,J表示课程。每一老师只教一门课程。每门课程有若干老师,某一学生选定某门课,就对应一个固定老师。
3.6.3:模式分解
3.6.3.1保持函数依赖分解
设数据库模式p={R1,R2,…,Rk}是关系模式R的一个分解,F是R上的函数依赖集,p中每个模式Ri上的FD集是Fi。如果{F1F2,…,Fk}与F是等价的(即相互逻辑蕴涵),那么称分解p保持FD
例:设关系模式R(U,F),其中U={A,B,C,D,E},F={A→BC,C→D,BC→E,E→A},
则分解p={R1(ABCE),R2(CD)}是否保持函数依赖?保持了
而分解p={R1(ABE),R2(CD)}是否保持函数依赖?未保持
例:设关系模式R(U,F),其中U={A,B,C},F{A→B,B→C,A→C},
则分解p={R1(AB),R2(BC)}是否保持函数依赖?保持了
3.6.3.2 无损分解
什么是有损,什么又是无损?
有损:不能还原。
无损:可以还原。无损连接分解:指将一个关系模式分解成若干个关系模式后,通过自然连接等运算仍能还原到原来的关系模式
3.6.3.3 表格法
例:设R=ABC,F={A→B},则分解p,={R(AB),R(AC)}与分解p,={R,(AB),R:(BC)}是否都为无损分解?
3.6.3.4 公式法
定理:如果R的分解为p={R,R},F为R所满足的函数依赖集合分解p具有无损连接性的充分必要条件是:
其中,R1∩R2,表示模式的交,为R1与R2中公共属性组成,R2-R1或R1-R2,表示模式的差集,R1-R2,表示R,中去除R1和R2的公共属性所组成。当模式R分解成两个关系模式R1和R2时,如果R1与R2的公共属性能函数决定R1中或R2中的其它属性,这样的分解就具有无损连接性。
例:设R=ABC,F={A→B},则分解p1={R1(AB),R2(AC)}与分解p2={R1(AB),R2(BC)}是否都为无损分解?
3.7 SQL语言
3.7.1 普通查询
SELECT [ALL|DISTINCT]<目标表达式>[,<目标表达式>]…FROM <表名>[,<表名>]…[WHERE<条件表达式>][ORDER BY <列名2> [ASC|DESC]…… ];
3.7.2 分组查询
[GROUP BY<列名1> [HAVING<条件表达式>]]
3.7.4 权限控制
授权语句
GRANT<权限>[,···n]
ON<对象类型><对象名>
TO<用户>[,···n]
WITH GRANT OPTION
WITH GRANT OPTION 子句,获得权限的用户还可以将权限赋给其他用户
收回权限语句
REVOKE<权限>[,"··n]ON<对象类型><对象名>
FROM <用户>[,···n]
[RESTRICTICASCADE]
3.8 并发控制
3.8.1:事务的特性(ACID)
原子性(Atomicity):事务是原子的,要么做,要么都不做。
一致性(Consistency):事务执行的结果必须保证数据库从一个一致性状态变到另一个一致性状态。
隔离性(lsolation):事务相互隔离。当多个事务并发执行时,任一事务的更新操作直到其成功提交的整个过程,对其他事物都是不可见的。
持久性(Durability):一旦事务成功提交,即使数据库崩溃,其对数据库的更新操作也永久有效。
3.8.2:并发问题
由于事务都是并发的,所以会导致以下问题:
丢失更新:多次写回,第一次写回被第二次覆盖了。
不可重复读问题:进行两次读操作,第一次结束,第二次开始之前对数据进行了更新导致第一次和第二次读数据不一致。
读“脏”数据:第一次操作数据更新后,事务还未提交,此时第二个进程进行读取,读取结束之后,第一个进程进行ROLLBANK,数据回滚后,第二次进程读取到的数据为垃圾数据。
3.8.3:封锁协议
共享锁/S锁/读锁:若事务T对数据对象A加上S锁其他事务只能对A再加S锁,不能再对A添加X锁。
排他锁/独占锁/X锁/写锁:若事务T对数据对象A加上X锁,其他事务不能再对A添加任意锁
3.9数据库系统概述
3.10 章节回顾
4.数据库设计
4.1数据库设计过程
4.2答题技巧
联系和联系类型判断:比如“每个部门可以有多名员工,每名员工只属于一个部门”,部门和员工之间存在1:多的联系。“采购完的商品交由配送员根据顾客订单组合装箱,然后交给托运公司运送这里存在配送员、订单、托运公司三元联系,其中订单是联系名称,作为另一个联系的一端,存在聚集形式。
关系模式属性判断:名称、电话和地址”电话,地址)“托运公司信息包括托运公司托运公司(托运公司名称,电话,地址)(注意关系模式中的属性可能会有联系的归并处理)
主键判断:“系统内部用商品条码唯一标识每种商品”,商品条码是商品的主键。(外键判断来源于其他关系的主键)
1、E-R图
2、联系类型判断
3、E-R图转关系模式
4、主键、外键判断
5、规范化理论
5 计算机网络
5.1 OSI/RM七层模型
5.2 TCP/IP协议簇
5.2.1:常见协议基础
一、 TCP是可靠的,效率低的;
1.HTTP协议端口默认80,HTTP+SSL之后成为HTTPS协议默认端口443。
2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需要注册。
3.FTP是文件共享协议,控制信息21和数据信息20进行传输。
4.邮件收取协议POP3端口110,邮件传输协议SMTP,默认端口25。
5.远程协议Telent默认端口23,由于明文传输,所以是可靠的不安全的。
二、 UDP是不可靠的,但是效率高。
1.域名解析协议DNS默认端口53,将域名转为IP。
2.TFTP简单的文件传输协议,默认端口69。
3.SNMP简单网络管理协议,默认端口161。
三、 IP地址转为MAC地址在网络层进行,由ARP将IP转为MAC地址,与之相反的是RARP将MAC地址转为IP地址
四、UFS既不属于TCP也不属于UDP。
5.2.2:TCP与UDP
5.2.3:协议应用提升
5..2.3.1DHCP
1、客户机/服务器模型
2、租约默认为8天
3、当租约过半时,客户机需要向DHCP服务器申请续租;
4、当租约超过87.5%时,如果仍然没有和当初提供IP的DHCP服务器联系上,则开始联系其他的DHCP服务器。5、固定分配、动态分配和自动分配。
6、windows的169.254.X.X和 Linux,Unix0.0.0.0 无效IP
5.2.3.2 DNS
5.3 网络诊断命令
1、ping:用于检查网络是否连通;
2、tracert(linux: traceroute):用于确定IP数据包访问目标所采取的路径,若网络不通,能定位到具体哪个结点不通;
3、ipconfig(linux: ifconfig)(显示TCP/IP网络配置值,如:IP地址,MAC地址,网关地址等)
4、nslookup(查询DNS记录)
5、Netstat:用于显示网络连接、路由表和网络接口信息;
5.4 IP地址与子网划分
5.4.1:IP地址分类及特殊的IP地址
5.4.2:子网划分与路由汇聚
5.4.2.1 子网划分
将一个网络划分成多个子网(取部分主机号当子网号)
例1,将B类IP地址168.195.0.0划分成27个子网,子网掩码为多少?
5.4.2.2 路由汇聚
将多个网络合并成一个大的网络(取部分网络号当主机号)
5.4.3:IPv6
IPv6是设计用于替代现行版本IP协议(IPv4)的下一代IP协议
(1)IPv6地址长度为128位,地址空间增大了2^96倍;
(2)灵活的IP报文头部格式。使用一系列固定格式的扩展头部取代了IPv4中可变长度的选项字段。IPv6中选项部分的出现方式也有所变化,使路由器可以简单路过选项而不做任何处理,加快了报文处理速度;
(3) IPv6简化了报文头部格式,字段只有8个,加快报文转发,提高了吞吐量;
(4)提高安全性。身份认证和隐私权是IPv6的关键特性;
(5)支持更多的服务类型;
(6)允许协议继续演变,增加新的功能,使之适应未来技术的发展;
单播地址(Unicast):用于单个接口的标识符,传统的点对点通信。
组播地址(Multicast):多播地址,一点对多点的通信,数据报交付到一组计算机中的每一个。IPv6没有广播的术语,而是将广播看做多播的一个特例。
任播地址(Anycast):泛播地址,这是IPv6增加的一种类型。任播的目的站是一组计算机,但数据包在交付时只交付给其中一个,通常是举例最近的一个
可聚合全球单播地址:前缀001
本地单播地址:
链路本地:前缀为1111111010(一般以fe80开头)
站点本地:前缀为1111111011
IPv6地址由8个16进制字段构成。
例如:2001:0db8:85a3:0000:1319:8a2e:0370:7344
IPv6地址的省写,上面的IP地址等价于:
2001:0db8:85a3::1319:8a2e:0370:7344.
遵守这些规则,如果因为省略而出现了两个以上的冒号,则可以压缩为一个,但这种零压缩在地址中只能出现一次。因此:
2001:0DB8:0000:0000:0000:0000:1428:57ab多个0可以写作一个零
2001:0DB8:0:0:0:0:1428:57ab连续的多个:0可以省略为::但是只能使用一次
2001:0DB8::1428:57ab0开头可以省略,0D与D等价
2001:DB8::1428:57ab
以上都是合法的地址,并且它们是等价的。同时前导的零可以省略,因此:2001:0DB8:02de::0e13等价于2001:DB8:2de::e13.
IPv4/IPv6过渡技术有:
(1)双协议栈技术:双栈技术通过节点对IPv4和IPv6双协议栈的支持从而支持两种业务的共存。(2)隧道技术:隧道技术通过在IPv4网络中部署隧道,实现在IPv4网络上对IPv6业务的承载,保证业务的共存和过渡。隧道技术包括:6to4隧道;6over4隧道;ISATAP隧道。
(3)NAT-PT技术:NAT-PT使用网关设备连接IPv6和IPv4网络。当IPv4和IPv6节点互相访问时,NAT-PT网关实现两种协议的转换翻译和地址的映射。
5.5网络规划与设计
核心层:主要是高速数据交换,实现高速数据传输、出口路由,常用冗余机制。
汇聚层:网络访问策略控制、数据包处理和过滤、策略路由、广播域定义、寻址。接入层:主要是针对用户端,实现用户接入、计费管理、MAC地址认证、MAC地址过滤、1收集用户信息,可以使用集线器代替交换机。
5.6网络接入技术
5.7 WWW服务
5.7.1:URL
Internet地址:域名格式和IP地址格式。
URL:统一资源定位符,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL:协议名://主机名.组名.最高层域名。例:http://www.baidu.com
URL: protocol ://hostname[:port]/path /filenameprotocol指定使用的传输协议,最常见的是 HTTP 或者 HTTPS 协议,也可以有其他协议,如 file、ftp、gopher、mms、ed2k等;
Hostname 是指主机名,即存放资源的服务域名或者IP地址。
Port 是指各种传输协议所使用的默认端口号,例如http的默认端口号为80
Path 是指路径,由一个或者多个“”分隔,一般用来表示主机上的一个目录或者文件地址
filename是指文件名,该选项用于指定需要打开的文件名称。
一般情况下,一个URL可以采用"主机名.域名"的形式打开指定页面,也可以单独使用"域名"来打开指定页面,但是这样实现的前提是需进行相应的设置和对应。
URL:协议名://主机名.组名.最高层域名。例:http://www.baidu.com
5.7.2:HTML
5.8 章节概述
6 加密技术与认证技术
6.1:对称加密与非对称加密技术
6.1.1:对称加密
对称加密:
;
特点: 1、加密强度不高,但效率高;2、密钥分发困难。
常见对称密钥(共享秘钥)加密算法:DES、3DES(三重DES)、RC-5、IDEA算法。
6.1.1.2非对称加密技术
非对称加密: K。≠K;密钥必须成对使用(公钥加密,相应的私钥解密)
特点:加密速度慢,但强度高。
常见非对称密钥(公开密钥)加密算法:RSA、ECC
6.1.2:数字签名与信息摘要应用
数字摘要:由单向散列函数加密成固定长度的散列值。
常用的消息摘要算法有MD5,SHA等,市场上广泛使用的MD5,SHA算法的散列值分别为128和160位,由于SHA通常采用的密钥长度较长,因此安全性高于MD5。
6.1.3:数字证书应用
6.1.3.1 PKI公钥体系
6.2 网络安全协议
6.3网络安全威胁
6.3.1 信息安全基本要素
6.3.2:主动攻击与被动攻击
6.3.2.1 DoS(拒绝服务)与DDoS
6.3.2:计算机病毒与木马
病毒:编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码。
计算机病毒具有隐蔽性、传染性、潜伏性、触发性和破坏性等特点。
木马:计算机木马是一种后门程序,常被黑客用作控制远程计算机的工具。
6.3.2.1 病毒分类
系统病毒(前缀:Win32、PE、W32,如:KCOM--Win32.KCOM)
蠕虫病毒(如:恶鹰--Worm.BBeagle)
木马病毒、黑客病毒(如:QQ消息尾巴木马--Trojan.QQ3344)脚本病毒(如:红色代码--Script.Redlof)
宏病毒(如:美丽莎--Macro.Melissa)后门病毒(如:灰鸽子--Backdoor.Win32.Huigezi)
病毒种植程序病毒(冰河播种者--Dropper.BingHe2.2C)
破坏性程序病毒(杀手命令--Harm.Command.Killer)
玩笑病毒(如:女鬼--Jioke.Grl ghost)
捆绑机病毒(如:捆绑QQ--Binder.QQPass.QQBin)
6.4安全控制策略
6.4.1:防火墙技术
6.4.2:其他安全控制策略
6.5 安全防范体系分级
安全防范体系的层次划分:
(1)物理环境的安全性。包括通信线路、物理设备和机房的安全等。物理层的安全主要体现在通信线路的可靠性(线路备份、网管软件和传输介质)、软硬件设备的安全性(替换设备、拆卸设备、增加设备)、设备的备份、防灾害能力、防干扰能力、设备的运行环境(温度、
湿度、烟尘)和不间断电源保障等。(2)操作系统的安全性。主要表现在三个方面,一是操作系统本身的缺陷带来的不安全因素,主要包括身份认证、访问控制和系统漏洞等;二是对操作系统的安全配置问题,三是病毒对操作系统的威胁。
(3)网络的安全性。网络层的安全问题主要体现在计算机网络方面的安全性,包括网络层身份认证、网络资源的访问控制、数据传输的保密与完整性、远程接入的安全、域名系统的安全、路由系统的安全、入侵检测的手段和网络设施防病毒等。
(4)应用的安全性。由提供服务所采用的应用软件和数据的安全性产生,包括Web服务、电子邮件系统和DNS等。此外,还包括病毒对系统的威胁。
(5)管理的安全性。包括安全技术和设备的管理、安全管理制度、部门与人员的组织规则等。管理的制度化极大程度地影响着整个计算机网络的安全,严格的安全管理制度、明确的部门安全职责划分与合理的人员角色配置,都可以在很大程度上降低其他层次的安全漏洞。
6.6 概述
7.系统开发基础
7.1软件工程概述
7.1.1:信息系统基本生存周期
7.1.2:软件过程
7.1.2.1 软件过程改进-CMM
初始级:杂乱无章,甚至混乱,几乎没有明确定义的步骤项目的成功完全依赖个人的努力和英雄式核心人物的作用。
可重复级:建立了基本的项目管理过程和实践来跟踪项目费用、进度和功能特性,有必要的过程准则来重复以前在同类项目中成功。
已定义级:管理和工程两方面的软件过程已经文档化、标准化,并综合成整个软件开发组织的标准过程。
已管理级:制定了软件过程和产品质量的详细度量标准。
优化级:加强了定量分析,通过来自过程质量反馈和来自新观念、新技术的反馈使过程能不断持续地改进。
7.1.2.2 CMMI阶段式模型
7.1.2.3 CMMI连续式模型
7.2 软件开发方法
7.2.1 开发方法分类
结构化方法(面向过程):适用于需求明确的项目
用户至上
严格区分工作阶段,每阶段有任务和结果强调系统开发过程的整体性和全局性
系统开发过程工程化,文档资料标准化
自顶向下,逐步分解(求精)
原型法:适用于需求不明确
面问对象方法:适用于复杂大项目
更好的复用性
关键在于建立一个全面、合理、统一的模型分析、设计、实现三个阶段,界限不明确
面向服务的方法
抽象级别:操作、服务、业务流程
7.3软件开发模型
7.3.1:瀑布模型与V模型
瀑布模型
以文档作为驱动、适合于软件需求很明确的软件项目
V模型
将验证确认活动应用于早期软件工程工作中,测试贯穿始终,设计强调测试。
7.3.2:演化模型(原型模型、螺旋模型)
原型模型
演化模型:演化模型是迭代的过程模型,使得软件开发人员能够逐步开发出更完整的软件版本。演化模型特别适用于对软件需求缺乏准确认识的情况。
螺旋模型
瀑布模型和演化模型结合,加入了风险分析。
特别适用于庞大、复杂并且具有高风险的系统。
7.3.3:增量模型
第1个增量往往是核心产品。将需求分段为一系列增量产品,每一增量可以分别开发。
7.3.4:喷泉模型
以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发模型
特点:迭代无间隙
7.3.5:统一过程UP
7.3.6:敏捷方法
7.3.6.1极限编程XP
7.3.6.2 敏捷方法分类
7.4需求分析
7.4.1:需求分析的概念
需求的任务
需求的过程问题识别
分析与综合
编制需求
分析文档
需求分析与评审
结构化分析的结果:一套分层的数据流图,一本数据词典,一组小说明(也称加工逻辑说明)、补充材料
7.4.2:需求的分类
7.4.3:需求分析的工具
应用的工具
数据流图(DFD)
数据字典(DD)
判定表判定树
7.4.3.1 数据流图
7.4.3.2 数据字典
数据字典有以下4类条目,数据流、数据项、数据存储和基本加工。(源点和终点不再系统之内,不在字典中说明)
7.4.3.3 加工逻辑描述
常用的加工逻辑描述方法有结构化语言、判定表和判定树3种。
7.5系统设计
7.5.1:系统设计概述
7.5.1.1软件设计的任务与活动
体系结构设计:定义软件系统各主要部件之间的关系。
数据设计:基于E-R图确定软件涉及的文件系统的结构及数据库的表结构。
接口设计(人机界面设计):软件内部,软件和操作系统间以及软件和人之间如何通信。
过程设计:系统结构部件转换成软件的过程描述。确定软件各个组成部分内的算法及内部数据结构,并选定某种过程的表达形式来描述各种算法。
7.1.5.2 应用工具
7.5.2:模块设计
保持模块的大小适中
尽可能减少调用的深度
多扇入,少扇出
单入口,单出口
模块的作用域应该在模块之内
功能应该是可预测的
7.5.2.1 高内聚
7.5.2.2 低耦合
7.5.3:人机界面设计
黄金三原则
置于用户控制之下
减少用户的记忆负担
保持界面的一致性
7.5.4:架构设计
7.5.4.1 架构风格
架构设计的一个核心问题是能否达到架构级的软件复用
架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个构件有效地组织成一个完整的系统
架构风格定义了用于描述系统的术语表和一组指导构建系统的规则
数据流风格:批处理序列、管道-过滤器
调用/返回风格:主程序/子程序、面向对象、层次结构(MVC、C/S、B/S)独立构件风格:进程通信、事件驱动系统(隐式调用)
虚拟机风格:解释器、基于规则的系统
仓库风格:数据库系统、超文本系统、黑板系统
7.5.4.2 数据流风格
批处理序列
构件为一系列固定顺序的计算单元,构件之间只通过数据传递交互。每个处理步骤是一个独立的程序,每一步必须在其前一步结束后才能开始数据必须是完整的,以整体的方式传递。管道-过滤器
每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常是通过对输入数据流的变换或计算来完成的,包括通过计算和增加信息以丰富数据、通过浓缩和删除以精简数据、通过改变记录方式以转化数据和递增地转化数据等。这里的构件称为过滤器,连接件就是数据流传输的管道,将一个过滤器的输出传到另一个过滤器的输入。
早期编译器就是采用的这种架构。要一步一步处理的,均可考虑采用此架构风格。
7.5.4.3调用/返回风格
主程序/子程序
单线程控制,把问题划分为若干个处理步骤,构件即为主程序和子程序,子程序通常可合成为模块。过程调用作为交互机制,即充当连接件的角色。调用关系具有层次性,其语义逻辑表现为主程序的正确性取决于它调用的子程序的正确性
面向对象
构件是对象,对象是抽象数据类型的实例。在抽象数据类型中,数据的表示和它们的相应操作被封装起来,对象的行为体现在其接受和请求的动作。连接件即是对象间交互的方式,对象是通过函数和过程的调用来交互的
层次结构
构件组织成一个层次结构,连接件通过决定层间如何交互的协议来定义。每层为上一层提供服务,使用下一层的服务,只能见到与自己邻接的层。通过层次结构,可以将大的问题分解为若干个渐进的小问题逐步解决,可以隐藏问题的复杂度。修改某一层,最多影响其相邻的两层(通常只能影响上层)
层次架构风格
MVC架构风格
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controler(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
J2EE体系结构中:
视图(View):JSP
控制(Controller):Servlet
模型(Model): Entity Bean、Session Bean
7.5.4.4 独立构件风格
进程通信
构件是独立的过程,连接件是消息传递。构件通常是命名过程,消息传递的方式可以是点对点、异步或同步方式,以及远程过程(方法)调用等。
事件驱动系统(隐式调用)
构件不直接调用一个过程,而是触发或广播一个或多个事件。构件中的过程在-个或多个事件中注册,当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。一个事件的触发就导致了另一个模块中的过程调用。这种风格中的构件是匿名的过程,它们之间交互的连接件往往是以过程之间的隐式调用来实现的。主要优点是为软件复用提供了强大的支持,为构件的维护和演化带来了方便:其缺点是构件放弃了对系统计算的控制。
7.5.4.5 虚拟机风格
解释器
解释器通常包括一个完成解释工作的解释引擎、一个包含将被解释的代码的存储区、一个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行的进度的数据结构。具有解释器风格的软件中含有一个虚拟机可以仿真硬件的执行过程和一些关键应用,其缺点是执行效率比较低。
基于规则的系统基于规则的系统包括规则集、规则解释器、规则/数据选择器和工作内存,一般用在人工智能领域和DSS中。
7.5.4.6仓库风格
数据库系统
构件主要有两大类,一类是中央共享数据源,保存当前系统的数据状态;另一类是多个独立处理单元,处理单元对数据元素进行操作。
黑板系统
包括知识源、黑板和控制三部分。知识源包括若干独立计算的不同单元,提供解决问题的知识。知识源响应黑板的变化,也只修改黑板;黑板是一个全局数据库包含问题域解空间的全部状态,是知识源相互作用的唯一介:知识源响应是通过黑板状态的变化来控制的。黑板系统通常应用在对于解决问题没有确定性算法的软件中(信号处理、问题规划和编译器优化等)。
超文本系统
构件以网状链接方式相互连接,用户可以在构件之间进行按照人类的联想思维方式任意跳转到相关构件。超文本是一种非线性的网状信息组织方法,它以结点为基本单位,链作为结点之间的联想式关联。超文本系统通常应用在互联网领域。现代集成编译环境一般采用这种架构风格。
7.6 系统测试
7.6.1:测试的基本概念及分类
尽早、不断的进行测试
程序员避免测试自己设计的程序
既要选择有效、合理的数据,也要选择无效、不合理的数据
修改后应进行回归测试
尚未发现的错误数量与该程序已发现错误数成正比
7.6.2:黑盒测试
7.6.3:白盒测试
7.6.4:测试阶段划分
7.6.5:McCabe复杂度计算
计算有向图G的环路复杂度公式为:V(G)=m-n+2(边个数-点个数+2)
说明:其中V(G)是有向图G中的环路个数,m是G中的有向弧数,n是G中的节点数
7.7 软件维护
适应性维护。指使应用软件适应信息技术变化和管理需求变化而进行的修改。企业的外部市场环境和管理需求的不断变化也使得各级管理人员不断提出新的信息需求。
完善性维护。扩充功能和改善性能而进行的修改。对已有的软件系统增加一些在系统分析和设计阶段中没有规定的功能与性能特征。
7.8 软件文档
软件工程国家标准-软件文档管理指南-按阅读对象分类
开发文档(开发人员)
可行性研究和项目任务书
需求规格说明
功能规格说明
设计规格说明(包括程序和数据规格说明)开发计划
软件集成和测试计划质量保证计划、标准、进度
安全和测试信息
产品文档(用户)
培训手册
参考手册和用户指南软件支持手册
产品手册和信息广告管理文档(管理人员)
开发过程的每个阶段的进度和进度变更的记录
软件变更情况的记录
相对于开发的判定记录
职责定义
7.9软件质量保证模型
软件质量保证 ISO/EC9126
7.10 概述
8 项目管理
8.1进度管理
8.1.1:Gantt图
优点:
Gantt图能够清晰地描述每个任务从何时开始,到何时结束,任务的进程情况以及各个任务之间的并行关系。
缺点:
Gantt图不能清晰地反映出个任务之间的依赖关系,难以确定整个项目的关键所在,也不能反映计划中有潜力的部分。
8.1.2:PERT图(重点)
优点:
PERT图不仅给出了每个任务的开始时间、结束时间和完成该任务所需的时间,还给出了任务之间的关系,即哪些任务完成之后才能开始另外的一些任务,以及如期完成整个工程的关键路径。图中的松弛时间则反映了某些任务是可以推迟其开始时间或延长其所需完成的时间。
缺点:
PERT图不能反映任务之间的并行关系。
8.1.2.1 关键路径法
关键路径法是在制订进度计划时使用的一种进度网络分析技术。
关键路线法沿着项目进度网络路线进行正向与反向分析,从而计算出所有计划活动理论上:
最早开始与完成日期
最迟开始与完成日期
注:不考虑任何资源限制。
关键路径:从开始到结束,需要时间最长的路径。
项目工期:完成项目的最少时间注意由关键路径即最长路径决定。
总时差(松弛时间):在不延误总工期的前提下,该活动的机动时间。活动的总时差等于该活动最迟完成时间与最早完成时间之差,或该活动最迟开始时间与最早开始时间之差。
8.1.2.2 时间管理-前导图法(单代号网络图,PDM)
ES:最早开始时间 EF:最早完成时间
LS:最迟开始时间 LF:最迟完成时间
活动的最早开始时间由前趋决定,如果有多个前趋,由最大值决定。
正向走通之后反向推出最晚结束时间,最晚开始时间。
总时差为0的活动为关键活动,关键活动的路径为关键路径
8.1.2.3 活动排序-箭线图法(双代号网络图,ADM)
节点表示里程碑,箭头线表示活动,活动时间标注在箭头线上,虚线表示虚活动(表示EF活动一定要在A活动之后完成,强调逻辑关系)
8.2 风险管理
风险曝光度(Risk Exposure)计算方法是风险出现的概率乘以风险可能造成的损失。
假设正在开发的软件项目可能存在一个未被发现的错误而这个错误出现的概率是0.5%,给公司造成的损失将是1000000元,那么这个错误的风险曝光度就应为1000000x0.5%=5000元。
8.3 沟通管理
无主程序员:1+2+3+…+(n-3)+(n-2)+(n-1)=(1+n-1)*(n-1)/2 =n*(n-1)/2
有主程序员:n-1
8.4 成本管理
8.5 章节概述
9 数据流图
9.1数据平衡原则
子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。
9.2解题技巧
实件名
存储名
加工名
数据流
10 面向对象
10.1面向对象基本概念
10.1.1:对象与类相关概念
10.1.2:继承与泛化相关概念
10.1.3:多态与动态绑定相关概念
执行过程决定的叫做动态绑定
编译过程决定的叫做静态绑定
10.1.4 基本概念
对象:属性(数据)+方法(操作)+对象ID
封装:隐藏对象的属性和实现细节,仅对外公开接口(信息隐藏技术)
类(实体类/控制类/边界类)
接口:一种特殊的类,他只有方法定义没有实现继承与泛化:复用机制(单重继承和多重继承)
重置/覆盖(Overriding):在子类中重新定义父类中已经定义的方法
重载:一个类可以有多个同名而参数类型不同的方法
多态:不同对象收到同样的消息产生不同的结果
过载多态:同一个名字在不同的上下文中所代表的含义不同。
动态绑定:根据接收对象的具体情况将请求的操作与实现的方法进行连接(运行时绑定)
消息和消息通信:对象之间进行通信的一种构造叫做消息。消息是异步通信的(消息传递:接收到信息的对象经过解释,然后予以响应)
实体类的对象表示现实世界中真实的实体,如人、物等。
接口类(边界类)的对象为用户提供一种与系统合作交互的方式,分为人和系统两大类,其中人的接口可以是显示屏、窗口、Web窗体、对话框、菜单、列表框、其他显示控制、条形码、二维码或者用户与系统交互的其他方法。系统接口涉及到把数据发送到其他系统,或者从其他系统接收数据。
控制类的对象用来控制活动流,充当协调者。
参数多态:应用广泛、最纯的多态。
包含多态:同样的操作可用于一个类型及其子类型。包含多态一般需要进行运行时的类型检查。
强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。
过载多态:同一个名(操作符、函数名)在不同的上下文中有所代表的含义不同。目前只考过载多态
10.2 面向对象分析
面向对象分析
认定对象(名词)
组织对象(抽象成类)
对象间的相互作用
基于对象的操作
面向对象设计
识别类及对象
定义属性
定义服务
识别关系
识别包
面向对象程序设计
程序设计范型
选择一种OOPL
面向对象测试
算法层
类层模板层
系统层
10.3面向对象设计
面向对象设计7大原则
单一职责原则:设计自的单一的类
开放-封闭原则:对扩展开放,对修改封闭
李氏(Liskov)替换原则:子类可以替换父类
依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程
接口隔离原则:使用多个专门的接口比使用单一的总接口要好
组合重用原则:要尽量使用组合,而不是继承关系达到重用目的
迪米特(Demeter)原则(最少知识法则):一个对象应当对其他对象有尽可能少的了解
面向对象设计其他原则
重用发布等价原则:重用的粒度就是发布的粒度
共同封闭原则:包中的所有类对于同一性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包里的所有类产生影响,而对于其他的包不造成任何影响。
共同重用原则:一个包里的所有类应该是共同重用的。如果重用了包里的一个类,那么就要重用包中的所有类。
无环依赖原则:在包的依赖关系图中不允许存在环,即包之间的结构必须是一个直接的无环图形。
稳定抽象原则:包的抽象程度应该和其稳定程度一致。
10.4 UML
10.4.1:UML图概念
10.4.2:UML图关系
包含关系:其中这个提取出来的公共用例称为抽象用例,而把原始用例称为基本用例或基础用例系:当可以从两个或两个以上的用例中提取公共行为时,应该使用包含关系来表示它们。
扩展关系:如果一个用例明显地混合了两种或两种以上的不同场景即根据情况可能发生多种分支,则可以将这个用例分为一个基本用例和一个或多个扩展用例,这样使描述可能更加清晰。
泛化关系:当多个用例共同拥有一种类似的结构和行为的时候,可以将它们的共性抽象成为父用例,其他的用例作为泛化关系中的子用例。在用例的泛化关系中,子用例是父用例的一种特殊形式,子用例继承了父用例所有的结构、行为和关系。
10.4.3: UML图图示
10.4.3.1 类图与对象图
类图(class diagram):类图描述一组类接口、协作和它们之间的关系。在00系统的建模中,最常见的图就是类图。类图给出了系统的静态设计视图,活动类的类图给出了系统的静态进程视图。
对象图(object diagram):对象图描述一组对象及它们之间的关系。对象图描述了在类图中所建立的事物实例的静态快照。和类图一样,这些图给出系统的静态设计视图或静态进程视图,但它们是从真实案例或原型案例的角度建立的。
多重度
1:表示一个集合中的一个对象对应另一个集合中1个对象。
0..*/*:表示一个集合中的一个对象对应另一个集合中的0个或多个对象。(可以不对应)
1..*:表示一个集合中的一个对象对应另一个集合中的一个或多个对象。(至少对应一个)
0..1:表示一个集合中的一个对象对应另一个集合中的0个或1个对象。(可以不对应)
10.4.3.2 用例图
用例图描述一组用例、参与者及它们之间的关系
关系包括:
包含关系、扩展关系、泛化关系
用例建模的流程:
识别参与者(必须)
合并需求获得用例(必须)
细化用例描述(必须)
调整用例模型(可选)
10.4.3.3 顺序图
顺序图(sequence diagram,序列图)。顺序图是一种交互图(interactiondiagram),交互图展现了一种交互,它由一组对象或参与者以及它们之间可能发送的消息构成。交互图专注于系统的动态视图。顺序图是强调消息的时间次序的交互图。
10.4.3.4 通信图
通信图(communication diagram)。通信图也是一种交互图,它强调收发消息的对象或参与者的结构组织。顺序图和通信图表达了类似的基本概念,但它们所强调的概念不同,顺序图强调的是时序,通信图强调的是对象之间的组织结构(关系)
顺序图强调时序,通信图强调组织结构(关系)
10.4.3.5 活动图
活动图(activity diagram)。活动图将进程或其他计算结构展示为计算内部一步步的控制流和数据流。活动图专注于系统的动态视图。它对系统的功能建模和业务流程建模特别重要,并强调对象间的控制流程。
10.4.3.6 状态图
状态图(state diagram)。状态图描述一个状态机,它由状态、转移、事件和活动组成。状态图给出了对象的动态视图。它对于接口、类或协作的行为建模尤为重要,而且它强调事件导致的对象行为,这非常有助于对反应式系统建。
![]()
10.4.3.7 构件图
构件图(component diagram)。构件图描述一个封装的类和它的接口、端口,以及由内嵌的构件和连接件构成的内部结构。构件图用于表示系统的静态设计实现视图。对于由小的部件构建大的系统来说,构件图是很重要的。构件图是类图的变体。
大图标画法
小图标画法
10.4.3.8 部署图
部署图(deployment diagram)。部署图描述对运行时的处理节点及在其中生存的构件的配置。部署图给出了架构的静态部署视图,通常一个节点包含一个或多中D弹个部署图。
唯一一个描述物理部署的UML图,一般不涉及。
10.5 设计模式
10.5.1:创建型设计模式(5种)
10.5.1.1 抽象工厂模式(AbstractFactory)
抽象工厂模式的意图是:提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类。
AbstractFactory:抽象工厂,声明抽象产品的方法。
ConcreteFactory:具体工厂,执行生成抽象产品的方法,生成一个具体的产品。
AbstractProduct:抽象产品,为一种产品声明接口。
Product:具体产品,定义具体工厂生成的具体产品的对象,实现产品接口。
Client:客户,我们的应用程序使用抽象产品和抽象工厂生成对象。
10.5.1.2 工厂模式(Factory Method)
工厂模式的意图是:定义一个创建对象的接口,但由子类决定需要实例化哪一个类。工厂方法使得子类实例化的过程推迟。
Product:产品角色定义产品的接口。
ConcreteProduct:真实的产品,实现接口Product的类。Creator:工厂角色声明工厂方法(Factory Method),返回一个产品。
ConcreteCreator:真实的工厂实现
FactoryMethod工厂方法,由客户调用,返回一个产品的实例。
10.5.1.3 原型模式(Prototype)
原型模式的意图是:用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象。
Prototype:抽象原型类,定义具有克隆自己的方法的接口。
ConcretePrototype:具体原型类,实现具体的克隆方法。
Client:客户。
10.5.1.4单例模式(Singleton)
单例模式(单件模式)的意图是:保证一个类只有一个实例,并提供一个访问它的全局访问点。
Singleton:单例,提供一个instance的方法,让客户可以使用它的唯一实例。内部实现只生成一个实例。
10.5.1.5 生成器模式(Builder)
生成器(构建器)模式的意图是:将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示。
Builder:抽象建造者,为创建一个Product对象各个部件指定抽象接口,把产品的生产过程分解为不同的步骤,从而使具体建造者在具体的建造步骤上具有更多弹性,从而创造出不同表示的产品。
ConcreteBuilder:具体建造者,实现Builder接口,构造和装配产品的各个部件定义并明确它所创建的表示,提供一个返回这个产品的接口。Director:指挥者,构建一个是使用Builder接口的对象。
Product:产品角色,被构建的复杂对象,具体产品建造者,创建该产品的内部表示并定义他的装配过程。
10.5.2: 结构型设计模式(7种)
10.5.2.1 桥接模式(Bridge)
桥接模式的意图是:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Abstraction:抽象类定义抽象类的接口。维护一个Implementor(实现抽象类)的对象
RefinedAbstraction:扩充的抽象类,扩充由Abstraction定义的接口。
Implementor:实现类接口,定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般的讲lmplementor接口仅仅给出基本操作,而Abstraction接口则会给出很多更复杂的操作。
Concretelmplementor:具体实现类,实现lmplementor定义的接口并且具体实现它。
10.5.2.2 组合模式(Composite)
组合模式的意图是:将对象组合成树型结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
Leaf:叶部件,在组合中表示叶节点对象,叶节点没有子节点。定义组合中原有接口对象的行为。
Composite:组合类,定义有子节点(子部件)的部件的行为。在Component接口中实现与子部件相关的操作。
Client:客户应用程序,通过Component接口控制组合部件的对象。
10.5.2.3 适配器模式 ( Adapter )
适配器模式的意图是:将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同工作。
目标抽象(Target)类:定义客户要用的特定领域的接口。
适配器公接口(Adapter):调用另一个接口,作为一个转换器。
适配器母接口(Adaptee):Adapter需要接入。
客户调用(Client)类:协同对象符合Adapter适配器(公接口)
10.5.2.4 装饰模式(Decorator)
装饰模式的意图是:动态地给一个对象添加一些额外的职责。它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加灵活。
Component:部件,定义对象的接口,可以给这些对象动态的增加职责(方法)
Concrete Component:具体部件,定义具体的对象,Decorator可以给他增加额外的职责(方法)
Decorator:装饰抽象类,维护一个内有的Component,并且定义一个与Component接口一致的接口
Concrete Decorator:具体装饰对象,给内在的具体部件对象增加具体的职责(方法)。
10.5.2.5 外观模式(Facade)
外观(门面)模式的意图是:定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用。
Facade:外形类,知道哪些子系统负责处理那些请求,将客户的请求传递给相应得子系统对象处理。
Subsvstem:子系统类,实现子系统的功能,处理由Facade传过来的任务。子系统不用知道Facade在任何地方也没有引用Facade。
10.5.2.6 享元模式(Flyweight)
享元(轻量级)模式的意图是:提供支持大量细粒度对象共享的有效方法。
Flyweight:抽象轻量级类,声明一个接口,通过它可以接受外来的状态并作出处理。
ConcreteFlyweight:具体轻量级类,实现Flyweight接口。
UnsharedConcreteFlyweight:不共享的具体轻量级类,UnsharedFlyweight对象常常将ConcreteFlyweight对象作为子节点。
FlyweightFactory:轻量级类工厂,创建并且管理flyweight对象确保享用flyweight。
Client:客户应用程序.
10.5.2.7 代理模式(Proxy)
代理模式的意图是:为其他对象提供一种代理以控制这个对象的访问。
Proxy:代理维护一个引用使得代理可以访问实体,如果RealSubject和Subject的接口相同,则Proxy会引用Subject。其他功能取决于Proxy的类型。
远程代理:负责对请求及其参数编码,向不同地址空间中的实体发送已编码的请求。
虚拟代理:可以缓存实体的其他信息,以便延迟对它的访问。
保护代理:检查调用者的请求是不是有所需的权限。
Subject:抽象实体接口,为RealSubject实体和Proxy代理定义相同的接口,使得RealSubject在任何地方都可以使用Proxy来访问。
RealSubject:真实对象,定义Proxy代理的实体。
10.5.3:行为型设计模式(11种)
10.5.3.1 观察者模式(Observer)
观察者模式的意图是:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Concrete Subject:具体被观察对象,存储具体观察者,Concrete Observer有兴趣的状态。当其状态改变时,发送一个通知给其所有的观察者对象。
Observer:观察者,定义一个更新接口,在一个被观察对象改变时应被通知。
Subject:被观察对象,了解其多个观察者,任意数量的观察者可以观察一个对象,提供一个接口用来绑定以及分离观察者对象。
Concrete Observer:具体观察者,维护一个对ConcreteSubject对象的引用。
10.5.3.2 访问者模式(Visitor)
访问者模式的意图是:表示一个作用于某对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作。
Visitor:抽象访问者,为对象结构类中每一个ConcreteElement的类声明一个Visit操作。
ConcreteVisitor:具体访问者,实现每个由Visitor声明的操作。
Element:元素,定义一个Accept操作,它一个访问者为参数。
ConcreteElement:抽象具体元素,实现Accept操作,该操作以一个访问者为参数。
ObjectStructure:对象结构类。
10.5.3.3 状态模式(State)
状态模式的意图是:允许一个对象在其内部状态改变时改变它的行为。
Context:情景类,定义客户应用程序有兴趣的接口,维护一个Concrete State(具体状态)子类的实例对象。
State:抽象状态类,定义一个接口用来封装与Context的一个特别状态(State)相关的行为。Concrete State:具体状态类,每一个具体状态类(Concrete State)实现了一个Context的状态(State)相关的行为。
10.5.3.4 职责链模式(Chain of Responsibility)
职责链模式的意图是:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Handler:传递者接口,定义一个处理请求的接口。
ConcreteHandler:具体传递者,处理它所负责的请求。可以访问链中下一个对象,如果可以处理请求,就处理它,否则将请求转发给后继者。
Client:客户应用程序,向链中的对象提出最初的请求。
10.5.3.5 命令模式(Command)
命令模式的意图是:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作。
Command:抽象命令类,声明执行操作的一个接口。
ConcreteCommand:具体命令类将一个接收者对象绑定于一个动作。实现execute方法以调用接收者的相关操作(Action)
Invoker:调用者,要求一个命令对象执行一个请求。
Receiver:接收者,知道如何执行关联请求的相关操作。
Client:客户应用程序,创建一个具体命令类对象,并且设定它的接收者。
10.5.3.6 解释器模式(interpreter)
解释器模式的意图是:给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子。
NonTerminalExpression:非终结符表达式
Context:场景,包含解释器的所有全局信息。
Client:客户程序,建造(或被给定)由这种语言表示的句子的抽象文法树,文法树由终结符表达式或非终结表达式的实例组成。
AbstractExpression:抽象表达式类,定义一个接口来执行解释操作,实现与文法中的元素相关联的解释操作。
TerminalExpression:终结符表达式,实现文法中关联终结符的解释操作。文句中的每个终结符都需要一个实例。![]()
10.4.3.6 迭代器模式(lterator)
迭代器模式的意图是:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
lterator:迭代器,迭代器定义访问和遍历元素的接口。
Concretelterator:具体迭代器,实现迭代器的借口,在遍历时跟踪当前聚合对象中的位置
Aggregate:聚合,定义一个创建选代器对象的接口。
ConcreteAggregate:具体聚合,实现创建迭代器对象,返回一个具体选代器的实例。
10.4.3.7 中介者模式(Mediator)
中介者模式的意图是:用一个中介对象来封装一系列的对象交互。它使各对象不需要显式地相互调用,从而达到低耦合,还可以独立地改变对象间的交互。
Mediator:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
ConcreteMediator:具体中介者,协调各个同事对象之间实现协作的行为,掌握并且维护它的各个同事对象引用。
Colleague:同事类,每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。
10.4.3.8 备忘录模式(Memento)
备忘录模式的意图是:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态。
Memento:备忘录对象,保持0riginator(原发器)的内部状态,根据原发器来决定保存哪些内部的状态。保存原发器之外的对象访问备忘录。备忘录可以有效地利用两个接口。看管者只能调用狭窄(功能有限)的接口--它只能传递备忘录对象给其他对象。而原发器能调用一个宽接口(功能强大的接口)通过这个接口可以访问所有需要的数据,使原发器可以返回原先的状态。理想的情况是,只允许生成本备忘录那个原发器访问本备忘录的状态。
Originator:原发器,通常是需要备忘的对象自己,创建一个备忘录,记录它的当前内部状态。可以利用一个备忘录来恢复它的内部状态。
CareTaker:备忘录管理者,只负责看管备忘录,不可以对备忘录的内容操作或者检察。
10.4.3.9 策略模式(Strategy)
策略模式的意图是:定义一系列算法,把它们一个个封装起来,并且使它们之间可互相替换,从而让算法可以独立于使用它的用户而变化。
Strategy:抽象策略类,定义一个接口给所有支持的算法,Context使用这个接口调用ConcreteStrategy定义的算法。
ConcreteStrategy:具体策略类,用ConcreteStrategy对象配置其执行环境。
10.4.3.10 模板方法模式(Strategy)
模板方法模式的意图是:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。
Abstractclass:抽象类,定义一个抽象原始的操作,其子类可以重新定义它实现一个算法的各个步骤。实现一个模板方法定义一个算法的骨架,此模板方法不仅可以调用原始的操作,还可以调用定义于AbstractClass中的方法或者其他对象中的方法。
ConcreteClass:具体子类,实现原始的操作以完成子类特定算法的步骤
10.5.4:设计模式拼写及分类汇总
10.5.4.1:识别设计模式(应用场景)
10.5.4.2:识别设计模式(图示)
10.5.4.3:设计模式分类
10.5.4.4:设计模式类图组成部分分析
技巧1:设计模式中英文名称+分类
技巧2:设计模式应用场景表格+关键字
10.6 面向对象汇总
11.UML建模
11.1类图与对象图
填类名,方法名,属性名
填多重度
填关系
依赖关系:左侧被右侧(箭头指向)影响
泛化关系:左侧为右侧(箭头指向)子类
关联关系:
聚合关系:左侧和右侧(箭头指向)为一个整体,生命周期不一致。
组合关系:左侧和右侧(箭头指向)为一个整体,生命周期一致。
实现关系:左侧为实现类,右侧(箭头指向)为接口
11.2用例图
包含关系:左侧包含右侧(箭头指向)
扩展关系:右侧为左侧(箭头指向)的扩展
泛化关系:右侧为左侧(箭头指向)的实现
11.3通信图
11.4状态图活动图
11.5顺序图
11.6 活动图
12.面向对象程序设计
12.1 Java语法要点
12.1.1 类的定义
说明:
import包:引入包中的类。
类修饰符:主要有四个修饰符,public、abstract、final、private。
class为关键字,xxxclass为类名,命名遵循Java标识符的命名规则。
extends为继承关键字,implements 为接口关键字。
12.1.2 接口的定义
12.2注意事项及代码填空技巧
12.2.1注意事项
一、大小写问题
Java语言大小写敏感,如:定义接口关键字为interface,则算错。 C++也如此。
写成Interface,
二、什么时候要加this1、set方法中,引用对象的变量
class EnvironmentDataimplements (1){ private float temperature, humidity, cleanness; public void setMeasurements(float temperature, float humidity, floatcleanness){ this.temperature=temperature;//总不能写成:temperature=temperature } }
2、带参数的构造函数
class CashDiscountimplements CashSuper { // 折扣率 private double moneyDiscount; public CashDiscount(double moneyDiscount){ //构造函数 this moneyDiscount=moneyDiscount; } }
三、父类与子类(接口与实现类)之间方法的统一
1、对于方法填空,主要依据父类与子类(接口与实现类)之间方法的统一
2、注意对于接口抽象方法,JAVA没有方法体(无花括号)C++纯虚函数写法。四、注意函数调用
1、代码中可能出现方法体的缺失,这一类填空可以根据函数传参,从而判断该参数类型该类型对象能够调用的方法,从而填空;2、代码中可能出现方法形参的缺失,这一类填空需要根据方法体判断该方法需要使用的参数名,根据调用的过程判断该参数的类型。
12.2.2 答题技巧
一、关键字填空
经常出现关键字填空,比如abstract、extends、implements等,注意不要拼写错误。
二、缺失方法填空
1、注意父类与子类、接口与实现类之间的统一,经常出现对应方法的缺失!可以根据上下文进行填写,注意接口方法无方法体,其他返回值类型、、参数列表应该保持一致;
2、注意构造函数的写法,get和set方法的应用;3.如果JAVA自带的一些类型的方法,需要靠平常的积累,建议多做真题进行积累。
三、实例化填写注意实例化的参数选择。
四、注意函数调用(参数列表、参数类型、对应参数能够调用的方法)
五、在软件设计师考试中,程序设计题最难的地方在于与设计模式的结合,建议多做真题进行积累。
13.数据结构(软考)
13.1:线性表
13.1.1 顺序表
顺序存储方式:数组的内存是连续分配的并且是静态分配的,即在使用数组之前需要分配固定大小的空间。
时间复杂度:
读:O(1)
查询:1,(n+1)/2,n
插入:1,(n+1)/2,n
删除:1,(n+1)/2,n-1
优势在于读操作。
13.1.2 链表
链表(linked-list)存储方式:链表的内存是不连续的,前一个元素存储地址的下一个地址中存储的不一定是下一个元素。链表通过一个指向下一个元素地址的引用将链表中的所有元素串起来。
尾结点:最后一个有效结点。
首结点:第一个有效结点。
头结点:第一个有效结点之前的那个结点,存放链表首地址。
头指针:指向头结点的指针变量。
尾指针:指向尾结点的指针变量。特点:
①n个结点离散分布,彼此通过指针相联系。
② 除头结点和尾结点外,每个结点只有一个前驱结点和一个后续结点。头结点没有前驱结点,尾结点没有后继结点。
③头结点并不存放有效数据,只存放链表首地址。其头结点的数据类型和首结点类型一样。
④加头结点的目的是方便对链表的操作,比如在链表头部进行结点的删除、插入。
13.1.2.1 单项链表
插入:
删除当前节点的下一个节点:
删除当前节点:
这里做了处理为将当前节点赋值为下一个节点值,然后山出下一个节点
13.1.2.2 双向链表
插入:
删除:
13.1.3 顺序存储与链式存储对比
13.1.4:栈和队列
13.1.5:串
1.串的定义:
串是仅由字符构成的有限序列,是一种线性表。一般记为S=“abcdef”,其中,S是串名,单引号括起来的字符序列是串值。
2.串的几个基本概念
(1)空串与空格串
空串:长度为零,不包含任何字符。
空格串:由一个或多个空格组成的串。虽然空格是一个空白字符,但它也是一个字符,在计算串长度时要将其计算在内。
(2)子串与子序列
子串:由串中任意长度的连续字符构成的序列称为子串。含有子串的串称为主串子串在主串中的位置是指子串首次出现时,该子串的第一个字符在主串中的位置。空串是任意串的子串。
子序列:一个串的“子序列”(subsequence)是将这个串中的一些字符提取出来得到一个新串,并且不改变它们的相对位置关系。
(3)串比较与串相等
串比较:两个串比较大小时以字符的ASCII码值(或其他字符编码集合)作为依据。实质上,比较操作从两个的第一个字符开始进行,字符的码值大者所在的串为大;若其中一个串先结束,则以串长较大者为大。
串相等:指两个串长度相等且对应序号的字符也相同。
3、串的基本操作:
(1)赋值操作StrAssign(s,t):将串s的值赋给串t。
(2)连接操作Concat(s,t):将串t接续在串s的尾部,形成一个新的串。(3)求串长StrLength(s):返回串s的长度。
(4)串比较StrCompare(s,t):比较两个串的大小。返回值-1、0和1分别表示s=t和s>t三种情况。s<t.
(5)求子串SubString(s,start,len):返回串S中从start开始的、长度为len的字符序列。
4、串的存储
(1)顺序存储
(2)链式存储
模式匹配:子串的定位操作通常称为串的模式匹配。(子串也称为模式串)
朴素的模式匹配算法(布鲁特-福斯算法):其基本思想是从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐一对字符进行后续的比较,否则从主串第二个字符起与模式串的第一个字符重新比较,直到模式串中每个字符依次与主串中一个连续的字符序列相等时为止,此时称为匹配成功。如果不能在主串中找到与模式串相同的子串,则匹配失败。
改进的模式匹配算法(KMP算法):
其改进之处在于-每当匹配过程中出现相比较的字符不相等时,不需要回退到主串的字符位置指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的距离再继续进行比较。
在KMP算法中,依据模式串的next函数值实现子串的滑动。若令next[i]=k,则next[]表示当模式串中的p;与主串中相应字符不相等时,令模式串的pnexu与主串的相应字符进行比较。(j=next[j])next函数的定义如下:
KMP是进行字符串模式匹配运算效率较高的算法。根据对 next 函数的定义,模式串前两个字符的 next 值为 0、1。
对于第3 个字符 “a”,,其在模式串中的前缀为“ab”,从该子串找不出前缀和后缀相同的部分,因此,根据定义,该位置字符的next 值为 1。
对于第4个字符“a”其在模式串中的前缀为“ aba”:音量:8%1只有长度为1的前缀“a” 和后缀“a”相同,根据定义,该位置字符的 next 值为 2。
对于第5个字符 “a”其在模式串中的前缀为“abaa0”,该子串只有长度为 1的前缀“a” 和后缀相同,根据定义,该位置字符的 next 值为 2。
综上可得,模式串“abaac”的 next 函数值为 01122.一、对于公式
1、由(1)式,当j=1时,next[1]=0;
2、当j=1时,由(2)式,max{k|13、取值范围,j、k都为正整数,且1<=j<=5【可根据下面的具体过程理解公式】二、本题计算如下:2、1),电( nety,.lplp2Lpk1'='PIp2Lp1'p1,为第一个字母a;'pik+1pj-k+2Lpj-1'='p2p3Lp2'=p2,为第二个字母b,a!=b,此时,找不到k不满足条件,由(3)式,next[3]=1.
4、j=4,满足1(1)当k=2,'plp2Lpk-1'='p1p2Lp1'=p1,为第一个字母a,'pj-k+lpjk+2Lpj-1'='p3p4Lp3'=p3,为第三个字母a,满足'p1p2Lpk-1'='pj-k+lpj-k+2Lpj-1'。(2)当k=3,'p1p2Lpk-1'='p1p2Lp2'=p1p2,为第一二字母ab,'pj-k+lpj-k+2Lpj1'='p2p3Lp3'=p2p3,为第二三个字母ba,不满足'p1p2Lpk-1'='pj-k+lpj-k+2Lpj-1'。综上可得,当j-4时,满足条件的最大k值为2,next[4]=2。
5、j=5,满足1(1)当k=2,'p1lp2Lpk-1'='plp2Lp1'=p1,为第一个字母a,'pj-k+lpjk+2Lpj-1'='p4p5Lp4'=p4,为第四个字母a,满足'plp2Lpk-1'='pj-k+lpj-k+2Lpj-1'。(2)当k=3,'p1p2Lpk-1'='p1p2Lp2'=p1p2,为第一二字母ab,'pj-k+lpj-k+2Lpj1'='p3p4Lp4'=p3p4,为第三四个字母aa,不满足'p1p2Lpk-1'='pj-k+lpj-k+2Lpj-1'。(3)当k=4,'p1p2Lpk-1'='p1p2Lp3'=p1p2p3,为第一二三字母aba,'pj-k+lpj-k+2Lpj1'='p2p3Lp4'=p2p3p4,为第二三四个字母baa,不满足'p1p2Lpk-1'='pj-k+lpj-k+2Lpj-1综上可得,当j=5时,满足条件的最大k值为2,next[5]=2。根据上面的分析过程,可以得出next0函数值为01122.
13.2数组与矩阵
13.2.1:数组
按行存储:a+(2*5+3)*2B=a+2B。
按列存储:a+(3*5+2)*2B=a+34B
13.2.2:矩阵
13.2.2.1 稀疏矩阵
13.2.2.2 对角矩阵
13.3 树
13.3.1:树与二叉树的特性
二叉树的重要特性:
1、在二叉树的第i层上最多有2^i-1个结点(i>=1)2、深度为k的二叉树最多有2^k -1个结点(k>=1)
3、对任何一棵二叉树,如果其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1.
4、如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到Llog2n+1层,每层从左到右),则对任一结点i(1≤isn),有:
如果i=1,则结点i无父结点,是二叉树的根;如果i>1,则父结点是_i/2」;如果2i>n,则结点i为叶子结点,无左子结点;否则,其左子结点是结点215
如果2i+1>n,则结点i无右子叶点,否则,其右子结点是结点2i+1。
13.3.2:二叉树的遍历
前(先)序遍历:根节点=>左子树=>右子树:1、2、4、5、7、8、3、6。
中序遍历:左子树=>根节点=>右子树:4、2、7、8、5、1、3、6。
后序遍历:左子树=>右子树=>根节点:4、8、7、5、2、6、3、1。
层次遍历:从左往右,按层次遍历:1、2、3、4、5、6、7。
13.3.3:二叉排序树
二叉排序树
左孩子小于根
右孩子大于根
插入结点:
1.若该键值结点已存在,则不再插入,如:48;2.若查找二叉树为空树,则以新结点为查找二叉树:
3.将要插入结点键值与插入后父结点键值比较,就能确定新结点是父结点的左子结点,还是右子结点。
1.若待删除结点是叶子结点,则直接删除;
2.若待删除结点只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,如:56;
3.若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除节点s,节点s必属于上述①,②情况之一,如89.
13.3.4:最优二叉树(哈夫曼树)
13.3.5:其他特殊的二叉树
13.3.5.1 平衡二叉树
13.3.5.2 线索二叉树
13.4 图
13.4.1:图的定义与存储
完全图
在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图(complete graph)在有向图中,若每对顶点之间都有二条有向边相互连接,则称该图为完全图。
连通图
连通图:指任意两个顶点之间都有一个路径相连。
13.4.2:图的遍历
13.4.3:拓扑排序
我们把用有向边表示活动之间开始的先后关系。这种有向图称为用顶点表示活动网络,简称AOV网络。
上图的拓朴序列有:02143567,01243657,02143657,01243567.
13.4.4:最小生成树与最短路径问题
13.6 章节概述
14 算法基础
14.1 算法的特性
有穷性:执行有穷步之后结束,且每一步都可在有穷时间内完成。
确定性:算法中每一条指令都必须有确切的含义,不能含糊不清。
输入(>=0)
输出(>=1)
有效性(可行性):算法的每个步骤都能有效执行并能在执行有限次后得到确定的结果。例如a=0,b/a就无效
14.2算法的效率
14.2.1 时间复杂度
时间复杂度是指程序运行从开始到结束所需要的时间。
通常分析时间复杂度的方法是从算法中选取一种对于所研究的问题来说是基本运算的操作,以该操作重复执行的次数作为算法的时间度量。一般来说,算法中原操作重复执行的次数是规模n的某个函数T(n)。由于许多情况下要精确计算T(n)是困难的,因此引入了渐进时间复杂度在数量上估计一个算法的执行时间。其定义如下
如果存在两个常数c和m,对于所有的n,当n>m时有f(n)≤cg(n),则有f(n)=0(g(n))。也就是说,随着n的增大,f(n)渐进地不大于g(n)。例如,一个程序的实际执行时间为T(n)=3n3+2n2+n,则T(n)=0(n3)。
常见的对算法执行所需时间的度量:重点:O(1)<O(
)<O(n)<O(
)<O(n^2)<O(n^3)<O(2^n)
14.2.1.1、O(1)
1、单个语句
如:k=0;
2、整个程序都没有循环语句,或复杂函数的调用
如:
void main() { char*x= "ABCADAB"; int m= strlen(x); printf("len:%d\n",m); }
14.2.1.2、O(n)
单层循环:
void main() { int i,j; k=0; for(i=0;i<n;i++){ b[i]=0; } }
14.2.1.3、O(n^2)
双层循环:
void main() { int i,s=0, n=1000; for(i=1;i<n;i++) for(j=1;j<n;j++) s+=j; printf("结果为:%d”,s) }
O(n^3)以此类推,三层嵌套
14.2.1.4、O(logn) 、
2^x=n则n=
,以2为底n的对数。
一般应用在二分查找和二叉树结构中。
int search(int array[], int n, int v){ int left, right, middle; left=0,right=n-1; while (left <= right){ middle= (left + right)/2; if (array{middle]> v){ right = middle-1; } else if (array[middle] < v){ left = middle+l; } else{ return middle; } } return -1; }
14.2.1.5、(nlogn)、
![]()
典型代表:堆排序,归并排序,快速排序每次重建堆的时间复杂度是
,n个元素基本上就是
。
14.2.1.6、O(2^n)
典型代表: LCS最长公共子序列、钢管切割问题,动态规划法自顶向下,时间复杂度为O(2^n)。
14.2.2空间复度
空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小;
14.3 算法策略
14.3.1:算法策略概述
一、分治法
特征:把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔
二、贪心法(一般用于求满意解)
特征:局部最优,但整体不见得最优。每步有明确的,既定的策略。
经典问题:背包问题(如装箱)、多机调度、找零钱问题
三、动态规划法(用于求最优解)--“最优子结构”和递归式
特征:划分子问题,并把子问题结果使用数组存储,利用查询子问题结果构造最终问题结果。(一般自顶向下时间复杂度为O(2^n),自底向上时间复杂度为O(n^a)效率更高)
经典问题:斐波那契数列、矩阵乘法、背包问题、 LCS最长公共子序列
四、回溯法
特征:系统的搜索一个问题的所有解或任一解。经典问题:N皇后问题、迷宫、背包问题
14.3.1.1 算法汇总
14.3.1.2 常见算法特征总结
算法策略判断:
1、回溯,大家比较熟悉,有尝试探索和回退的过程。这个比较好识别。2、分治,分治与动态规划法其实最难区分,分治不好解决问题,从而记录中间解解决问题,有了动态规划法,但是在软设考试中,分治目前只有二分的思想,二分以外的思想都用动态规划法解决了。二分的时间复杂度,与0(nlog2n)相关,注意有没有外层嵌套循环。(结合归并排序、快速排序的过程,也是二分的)
3、动态规划法,有递归式,经常考查递归式,此时自底向上实现时,中间解基上是查表可得的,所以时间复杂度一般是0(n^k),具体k是多少,根据for循环的嵌套。此时循环变量能够看到,是从0或1开始,到n结束,这种情况就是从小规模到大规模,自底向上的。如果用到自顶向下,其实跟分治的实现就差不多了,查表的意义基本上可以忽略不计了,时间复杂度为0(2^n),递归的变量一般由n开始,向1缩小,所以是大规模到小规模,也就是自顶向下的。(一般动态规划涉及递归式,递归式还会经常用在代码填空中让大家补充缺失的填空,然后会有“最优子结构”的描述,会有表(数组)记录中间解。)
4、贪心法,有时候也会出现,“最优子结构”的描述,但是没有递归式。考虑的是当前最优,求得的是满意解。(特殊情况下,贪心法有时候得到的也可以是最优解,比如部分背包问题)
14.3.2:分治法
对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
14.3.2.1 递归技术
int F(int n){ if(n==0){ return 1; } if(n==1){ return 1; } if(n>1){ return F(n-1)+F(n-2); } }
14.3.2.2 二分查找
function Binary_Search(L,a,b,x){ if(a>b) { return(-1); }else { m=(a+b)/2; if(x==L[m]){ return(m); }else if(x>L[m]){ return(Binary_Search(L,m+l,b,x)); }else{ return(Binary_Search(L,a,m-1,x)); } } }
14.3.3:贪心法
总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不必为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但可能得不到最优解。【贪心法解决部分背包问题可得最优解】
14.3.4:动态规划法
在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件舍弃那些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解。(问题中如果出现“最优子结构”这类描述,并且结果用递归式表示,一般为动态规划法)
14.3.5:回溯法
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。这种走不通就退回再走的技术就是回溯法。
14.4 查找算法
14.4.1:顺序查找
顺序查找的思想:将待查找的关键字为key的元素从头到尾与表中元素进行比较,如果中间存在关键字为key的元素,则返回成功;否则,则查找失败。
查找成功时,顺序查找的平均查找长度为(等概率情况下)
14.4.2:二分查找(★★★)
二分法查找的基本思想是:(设low,…,high]是当前的查找区)
(1)确定该区间的中点位置:mid=[(low+high)/2];
(2)将待查的k值与凡mid].key比较,若相等,则查找成功并返回此位置,否则需确定新的查找区间,继续二分查找,具体方法如下。
若R[mid].key>k,则由表的有序性可知mid,…,n].key均大于k,因此若表中存在关键字等于k的结点,则该结点必定是在位置mid左边的子表low,…,mid-1]中。因此,新的查找区间是左子表风low,…,high],其中high=mid-1。
若R[mid].key<k,则要查找的k必在mid的右子表凡mid+1,…,high]中,即新的查找区间是右子表风low,…,high],其中low=mid+1。
若R[mid].key=k,则查找成功,算法结束。
(3)下一次查找是针对新的査找区间进行,重复步骤(1)和(2)。
(4)在查找过程中,low逐步增加,而high逐步减少。如果high<low,则查找失败,算法结束。
折半查找在查找成功时关键字的比较次数最多为
+1次。
折半查找的时间复杂度为 O()次。
折半查找的前提:有序顺序存储。
14.4.3:哈希查找表
散列表查找的基本思想是:已知关键字集合U,最大关键字为m,设计一个函数Hash,它以关键字为自变量,关键字的存储地址为因变量,将关键字映射到一个有限的、地址连续的区间T[0..n-1](n<<m)中,这个区间就称为散列表,散列查找中使用的转换函数称为散列函数。
开放定址法是指当构造散列表发生冲突时,使用某种探测手段,产生一个探测的散列地址序列,并且逐个查找此地址中是否存储了数据元素,如果没有,则称该散列地址开放,并将关键字存入,否则继续查找下一个地址。只要散列表足够大,总能找到空的散列地址将数据元素存入。
14.5 排序算法
14.5.1:排序的基本概念
14.5.2:插入类排序
14.5.2.1 直接插入排序
直接插入排序:即当插入第i个记录时,R1, R2,R3·····Ri-1均已排好,因此,将第i个记录Ri依次与R3Ri-1·····, R2,R1进行比较,找到合适的位置插入。它简单明了,但速度很慢。
直接插入排序是一种稳定的排序方法,时间复杂度为O(n^2)。在排序过程中仅需要一个元素的辅助空间,空间复杂度为O(1)。
适用于基本有序的情况,此时时间复杂度近乎线性,即O(n)。
14.5.2.2 希尔排序
希尔(Shell)排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<O<d2<d2),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。
希尔排序是一种不稳定的排序方法,据统计分析其时间复杂度约为O(n^1.3)。在排序过程中仅需要一个元素的辅助空间用于数组元素的交互空间复杂度为O(1)。
14.5.3:选择类排序
14.5.4.1 直接选择排序
直接选择排序的过程是,首先在所有记录中选出排序码最小的记录把它与第1个记录交换,然后在其余的记录内选出排序码最小的记录,与第2个记录交换……依次类推,直到所有记录排完为止。
直接选择排序是一种不稳定的排序方法,其时间复杂度约为O(n^2)。在排序过程中仅需要一个元素的辅助空间用于数组元素的交互,空间复杂度为O(1)。
14.5.4.2 堆排序
设有n个元素的序列{K1,K2,…,Kn},当且仅当满足下述关系之一时,称之为堆。
(1)Ki<=K2i;且Ki<=K2i+1;
(2)Ki>=K2i且K>=K2i+1。
其中(1)称为小顶堆,(2)称为大顶堆
堆排序的基本思想为:先将序列建立堆,然后输出堆顶元素,再将剩下的序列建立堆,然后再输出堆顶元素,依此类推,直到所有元素均输出为止,此时元素输出的序列就是一个有序序列。
对于大量的记录来说,堆排序是很有效的。
堆排序的算法步骤如下(以大顶堆为例):
(1)初始时将顺序表R[1..n]中元素建立为一个大顶堆,堆顶位于R[1],待序区为R[1..n]。
(2)循环执行步骤3~步骤4,共n-1次。
(3)假设为第i运行,则待序区为R[1..n-1],将堆顶元素R[1]与待序区尾元素R[n-i+1]交换,此时顶点元素被输出,新的待序区为R[1..n-i]。
(4)待序区对应的堆已经被破坏,将之重新调整为大顶堆。堆排序的时间复杂度为:O(
)。
14.5.4:交换类排序
14.5.4.1 冒泡排序
冒泡排序的基本思想是,通过相邻元素之间的比较和交换,将排序码较小的元素逐渐从底部移向顶部。由于整个排序的过程就像水底下的气泡一样逐渐向上冒,因此称为冒泡算法。
冒泡排序是一种稳定的排序方法,其时间复杂度约为O(n^2)。在排序过程中仅需要一个元素的辅助空间用于数组元素的交互,空间复杂度为O(1)。
14.5.4.2 快速排序
快速排序采用的是分治法,其基本思想是将原问题分解成若干个规模更小但结构与原问题相似的子问题。通过递归地解决这些子问题然后再将这些子问题的解组合成原问题的解。
在O()时间量级上,平均性能最好。
快速排序通常包括两个步骤:
第一步,在待排序的n个记录中任取一个记录,以该记录的排序码为准,将所有记录都分成两组,第1组都小于该数,第2组都大于该数如图所示。
第二步,采用相同的方法对左、右两组分别进行排序,直到所有记录都排到相应的位置为止。
快速排序的基准元素:一般是第一个元素,也可以设置中位数快速排序是一种不稳定的排序方法,平均和最优情况下时间复杂度约为O(
)。
快速排序的最差情况--基本有序以第一个元素为基准元素,此时时间复杂度为O(n^2)。以中位数为基准元素,此时时间复杂度为O(
)。辅助空间
(1)需要辅助空间存储左侧数组和右侧数组时,空间复杂度为O(n)。
(2)需要记录所有基准元素时,空间复杂度度为O()。
14.5.5:归并排序
归并也称为合并,是将两个或两个以上的有序子表合并成一个新的有序表。若将两个有序表合并成一个有序表,则称为二路合并。合并的过程是:比较A[i]和A[j]的排序码大小,若A[i]的排序码小于等于A[j]的排序码,则将第一个有序表中的元素A[i]复制到R[k]中,并令i和k分别加1:如此循环下去,直到其中一个有序表比较和复制完,然后再将另一个有序表的剩余元素复制到R中。
归并排序是一种稳定的排序方法,其时间复杂度约为O()。在排序过程中仅需要一个元素的辅助空间用于数组元素的交互,空间复杂度为O(n)。
14.5.6:基数排序
基数排序是一种借助多关键字排序思想对单逻辑关键字进行排序的方法。基数排序不是基于关键字比较的排序方法,它适合于元素很多而关键字较少的序列。基数的选择和关键字的分解是根据关键字的类型来决定的,例如关键字是十进制数,则按个位、十位来分解。
基数排序是一种稳定的排序方法,其时间复杂度约为O(d(n+rd))。在排序过程中仅需要一个元素的辅助空间用于数组元素的交互,空间复杂度为O(rd)。
14.5.7:排序算法对比
在选取排序方法时需要考虑的因素有待排序的记录个数n、记录本身的天小关键字的分布情况、对排序稳定性的要求、语言工具的条件和辅助空间的大小。依据这些因素,可以得到以下几点结论:
若待排序列的记录数目n较小,可采用直接插入排序和简单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当记录本身信息量大时用简单选择排序方法较好。
若待排记录按关键字基本有序,宜采用直接插入排序或冒泡排序。
当n很大且关键字位数较少时,采用基数排序较好。
若n很大,则应采用时间复杂度为O()的排序方法,例如快速排序、堆排序或归并排序:
(1)快速排序目前被认为是内部排序中最好的方法,当待排序的关键字为随机分布时快速排序的平均运行时间最短;
(2)堆排序只需要一个辅助空间,并且不会出现在快速排序中可能出现的最快情况。
(3)快速排序和堆排序都是不稳定的排序方法,若要求排序稳定,可选择归并排序。
14.6 章节概述
15 数据结构及算法应用
15.1 算法策略区分
15.1.1、分治法
特征:把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。
经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔。
15.1.2、贪心法
(一般用于求满意解)
特征:局部最优,但整体不见得最优。每步有明确的,既定的策略。
经典问题:背包问题(如装箱)、多机调度、找零钱问题。
15.1.3、动态规划法
(用于求最优解)--“最优子结构”和递归式
特征:划分子问题,并把子问题结果使用数组存储,利用查询子问题结果构造最终问题结果。(一般自顶向下时间复杂度为O(2^n),自底向上时间复杂度为O(n^a)效率更高)
经典问题:斐波那契数列、矩阵乘法、背包问题、LCS最长公共子序列
15.1.4、回溯法
特征:系统的搜索一个问题的所有解或任一解。
经典问题:N皇后问题、迷宫、背包问题
15.1.5 特征总结
算法策略判断:
1、回溯,大家比较熟悉,有尝试探索和回退的过程。这个比较好识别。2、分治,分治与动态规划法其实最难区分,分治不好解决问题,从而记录中间解解决问题,有了动态规划法,但是在软设考试中,分治目前只有二分的思想,二分以外的思想都用动态规划法解决了。二分的时间复杂度,与O(
)相关,注意有没有外层嵌套循环。(结合归并排序、快速排序的过程,也是二分的)
3、动态规划法,有递归式,经常考查递归式,此时自底向上实现时,中间解基本上是查表可得的,所以时间复杂度一般是O(n^k),具体k是多少,根据for循环的嵌套。此时循环变量能够看到,是从0或1开始,到n结束,这种情况就是从小规模到大规模,自底向上的。如果用到自顶向下,其实跟分治的实现就差不多了,查表的意义基本上可以忽略不计了,时间复杂度为O(2^n),递归的变量一般由n开始,向1缩小,所以是大规模到小规模,也就是自顶向下的。(一般动态规划法涉及递归式,递归式还会经常用在代码填空中让大家补充缺失的填空,然后会有“最优子结构”的描述,会有表(数组)记录中间解。)
4、贪心法,有时候也会出现“最优子结构”的描述,但是没有递归式。考虑的是当前最优,求得的是满意解。(特殊情况下,贪心法有时候得到的也可以是最优解,比如部分背包问题)
15.2 时间复杂度与空间复杂度
时间复杂度是指程序运行从开始到结束所需要的时间。通常分析时间复杂度的方法是从算法中选取一种对于所研究的问题来说是基本运算的操作,以该操作重复执行的次数作为算法的时间度量。
常见的对算法执行所需时间的度量:
空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小
15.3 代码填空技巧
仔细审题:
1、检查所有用到的变量是否有声明,是否赋初值;
2、检查是否有返回值,与题干要求返回变量名或上下文是否一致;3、检查for循环是否有计数变量的赋值、初值和终止条件;
4、注意while循环的开始和结束;5、有一些变量名具有特殊含义,比如一般用max/min保存最大值/最小值,temp作为中间变量,一般用来存储中间值或用来做数值交换的中间过渡。x>max,则修正max=x
x<min,则修正min=x。6、对特殊的算法策略:回溯法是否有回退k=k-1;对分治法递归的递归调用(调用自身函数名);对动态规划法的查表操作。
7、注意题干描述和代码说明、递归式(条件和等式)、代码中的注释、代码上下文。一般特殊数据结构调用方式会在代码说明或代码上下文中给出。(1)题干公式很重要,一般公式体现在代码中,会有循环边界、判断条件等;
(2)代码说明很重要,一般代码说明会指出一些变量的定义,初始值和边界值;
(3)代码上下文很重要,可以根据上下文判断有没有缺失变量声明、变量赋值;
(4)题干说明很重要,题干有时候也会给出循环边界、判断条件等内容,还可以根据题干描述,判断使用的算法策略,不同的算法策略,一般会有一些典型的代码缺失,比如:动态规划法可能会考查题干给出的递归式以及最优解的判断,分治法一般也会考查到递归式以及问题的划分,贪心法一般会考查满意解的当前最优判断条件,回溯法一般会考查找和回退的过程。
15.4 例题
15.4.1 背包问题
15.4.1.1 背包问题介绍
15.4.1.2 贪心法解决
15.4.1.3 回溯法解决
15.4.1.4 动态规划法解决
16. 知识产权与标准化
16.1 保护范围与对象
16.2 保护期限
16.3 知识产权人确定
16.3.1 职务作品
16.3.2 委托开发、合作开发与同时申请
16.4 侵权判定
第二十五条 对下列各项,不授予专利权:
(一)科学发展;
(二)智力活动的规则和方法;
(三)疾病的诊断和治疗方法;
(四)动物和植物品种;
(五)用原子核变换方法获得的物质;
(六)对平面印刷品的图案、色彩或者二者的结合作出的主要起标识作用的设计。对前款第(四)项所列产品的生产方法,可以依照本法规定授予专利权。
中国公民、法人或者其他组织的作品,不论是否发表,都享有著作权。
开发软件所用的思想、处理过程、操作方法或者数学概念不受保护。具体程序(代码+业务逻辑等)受保护
著作权法不适用于下列情形:
法律、法规,国家机关的决议、决定、命令和其他具有立法、行政、司法性质的文件,及其官方正式译文;
时事新闻;
历法、通用数表、通用表格和公式。
16.5 标准化
16.5.1:标准化分类
国际标准:ISO、IEC等国际标准化组织
国家标准: GB-中国、ANSI-美国、BS-英国、JIS一日本区域标准又称为地区标准,如PASC一太平洋地区标准会议、CEN一欧洲区域标准:标准委员会、ASAC-亚洲标准咨询委员会、ARSO一非洲地区标准化组织
行业标准:GJB-中国军用标准、MIT-S一美国军用标准、IEEE-美国电气电子工程师协会
地方标准:国家的地方一级行政机构制订的标准
企业标准项目规范
16.5.2:标准化代号
国际、国外标准代号:标准代号+专业类号+顺序号+年代号
我国国家标准代号:强制性标准代号为GB、推荐性标准代号为GB/T、指导性标准代号为GB/Z、实物标准代号GSB
行业标准代号:由汉语拼音大写字母组成(如电子行业为SJ)
地方标准代号:由DB加上省级行政区代码的前两位
企业标准代号:由0加上企业代号组成
16.6 章节概述
17.程序设计语言与语言处理程序基础
17.1. 程序设计语言概述
17.1.1:编译程序与解释程序
17.1.2:多种程序设计语言特点
1.Fortran语言(科学计算,执行效率高)
2. Pascal语言(为教学而开发的,表达能力强,Delphi)3.C语言(指针操作能力强,高效)
4.Lisp语言(函数式程序语言,符号处理,人工智能)
5.C++语言(面向对象,高效)
6.Java语言(面向对象,中间代码,跨平台)7.C#语言(面向对象,中间代码,.Net)
8.Prolog语言(逻辑推理,简洁性,表达能力,数据库和专家系统)9.Python语言(解释型,面向对象,胶水语言)
17.1.3:程序设计语言的基本成分
17.1.4:函数调用方式
传值调用
传址调用