软件设计师笔记
上午题
一、计算机组成原理与结构体系
数据的表示
进制转换
R进制转十进制 : 按权展开法
例如二进制 10100 = $1\times24+1\times22$ = 20
例如七进制 604 = $6\times7^2 + 4\times7^0$ = 298
十进制转R进制 : 短除法
例如20转二进制
2|20 余 0
2|10 余 0
2|5 余1
2|2 余0
2|1 余1
0
余数从下往上就是10100
二进制转八进制与十六进制
转八进制,从右到左三位一段
例如 10001110 = 216
转十六进制,从右到左四位一段
例如10001110 = 8E
原码反码补码移码
正数 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 |
原码:
1B(字节byte) = 8bit
如果用一个字节表示1,会先转成二进制,再在右边补7个0,其中最右边的0是符号位,0代表正数,1代表负数
即1=0000 0001
-1=1000 0001
当1+(-1)时,原码1000 0010,值是-2,值是不对的,所以有其他编码方式
反码:
正数和原码一样.
负数符号位不变,其他按位取反,即0变1,1变0,即1111 1110
1+(-1) = 1111 1111 ,变成原码 = 1000 0000 值为 -0
补码:
正数和原码一样.
负数在反码的基础上+1
1+(-1) =1 0000 0000 为0 (其实补码应该用模的概念)
移码:
特定场合运用,浮点运算
在补码基础上,符号位取反
数值表示范围
整数 | |
---|---|
原码 | $-(2^{n-1}-1)$ ~ $2^{n-1}-1$ |
反码 | $-(2^{n-1}-1)$ ~ $2^{n-1}-1$ |
补码 | $-2^{n-1}$ ~ $2^{n-1}-1$ |
浮点数运算
浮点数表示(科学计数法)
$N= M\times R^e$
M成为尾数(必须是非0的个位数),e是指数,R是基数
进行浮点运算
对阶(低阶兑成高阶) -> 尾数计算 -> 结果格式化 (确保尾数是个位数)
例如1000+119
$1 \times 10^3 +1.19 \times 10^2 = 1 \times 10^3 +0.119 \times 10^3 = 1.119 \times 10^3$
计算机结构
主机只包括两个部分,一个CPU,一个主存储器(内存)
CPU运算器
- 算术逻辑单元ALU
- 累加寄存器AC
- 数据缓冲寄存器DR
- 状态条件寄存器PSW
CPU控制器
- 程序计数器PC
- 指令寄存器IR
- 指令译码器
- 时序部件
Flynn分类法
体系结构类型 | 结构 | 关键特性 | 代表 |
---|---|---|---|
单指令流单数据流SISD | 控制部分 : 一个 处 理 器 : 一个 主存模块 : 一个 |
单处理器系统 | |
单指令流多数据流SIMD | 控制部分 : 一个 处 理 器 : 多个 主存模块 : 多个 |
各处理器以异步的形式 执行同一条指令 |
并行处理机 阵列处理机 超级向量处理机 |
多指令流多数据流MISD | 控制部分 : 多个 处 理 器 : 一个 主存模块 : 多个 |
不存在 | 理论上的,不存在 |
多指令流多数据流MIMD | 控制部分 : 多个 处 理 器 : 多个 主存模块 : 多个 |
能够实现作业、任务、 指令等各级全面并行 |
多处理机系统 多计算机 |
CISC与RISC
指令系统类型 | 指令 | 寻址方式 | 实现方式 | 其他 |
---|---|---|---|---|
CISC (复杂) | 数量多,使用频率差别大,可变长格式 | 支持多种 | 微程序控制技术(微码) | 研制周期长 |
RISC (精简) | 数量少,使用频率接近,定长格式, 大部分为单周期指令,操作寄存器, 只有Load/Store操作内存 |
支持方式少 | 增加了通用寄存器; 硬布线逻辑控制为主; 适合采用流水线 |
优化编译, 有效支持高级语言 |
CISC的背景是计算机还没普及时,机构买计算机需要从硬件到指令都定制
RISC的背景是计算机普及,所以删掉复杂指令,把基础指令提取出来,例如乘法可以由加法指令实现,多在寄存器操作
流水线技术
流水线概念
流水线是指在程序执行时,多条指令重叠进行操作的一种准并行处理实现技术
执行指令顺序 --> 取指 --> 分析 --> 执行
未使用流水线执行指令情况:
时间1 | 时间2 | 时间3 | 时间4 | 时间5 | 时间6 | |
---|---|---|---|---|---|---|
取指 | 1 | 2 | ||||
分析 | 1 | 2 | ||||
执行 | 1 | 2 |
使用流水线执行指令情况:
时间1 | 时间2 | 时间3 | 时间4 | |
---|---|---|---|---|
取指 | 1 | 2 | ||
分析 | 1 | 2 | ||
执行 | 1 | 2 |
流水线时间计算
流水线周期为执行时间最长的一段
例如,取指耗时2ns,分析2ns,执行1ns,那么流水线的周期就是2ns
流水线计算公式为
1条指令执行时间 + (指令条数-1)*流水线周期
理论公式 $(t1+t2+...+tk)+(n-1)*\Delta t$
实践公式 $(k+n-1)*\Delta t$
其中k为指令执行部分(如取指,分析,执行则k=3)
$\Delta t$ 是流水线周期
考试时,有理论的选项值先选理论,没理论选实践选项值
流水线吞吐率计算
流水线的吞吐率是只在单位时间内流水线所完成的任务数量或输出的结果数量
吞吐率 $TP = \frac{指令条数}{流水线执行时间} $
最大吞吐率 $TP_{max} = \frac{1}{流水线周期}$
流水线的加速比计算
完成同一批任务,不使用流水线所用的时间与使用流水线所用时间之比称为流水线的加速比
$S= \frac{不使用流水线执行时间}{使用流水线执行时间}$
流水线的效率
流水线的效率是指流水线的设备利用率
在时空图上,流水线的效率定义为n个任务占用的时空区域k个流水段总得时空区之比
$E = \frac{n个任务占用的时空区}{k个流水段的总的时空区} = \frac{T_0}{KT_k} $
存储系统
层次化存储结构
快 | CPU | 寄存器 | 小 |
---|---|---|---|
$\uparrow$ | Cache | 按需内容存取 | $\downarrow$ |
$\uparrow$ | 内存(主存) | $\downarrow$ | |
慢 | 外存(辅存) | 硬盘,光盘,U盘等 | 大 |
Cache
Cache的功能 : 提高CPU数据输入输出的速率
在计算机的储存系统中,Cache是访问速度最快的层次(如果算寄存器的话则寄存器最快)
使用Cache改善系统性能的依据是程序的局部性原理
使用"Cache+主存储器"的平均周期
$t3 = ht_1+(1-h)t_2$
$t_1$ 表示Cache的周期时间 比如 1ns
$t_2$表示主存储器周期时间 比如1000ns
h 表示对Cache的命中率(CPU能在Cache中访问到数据时读Cache,否则读主存), 比如95%
那么 $t_3= 0.951+0.051000 = 50.95ns$
局部性原理
- 时间局部性 (例如,循环时,循环体的存储位置不断被重复访问)
- 空间局部性 (例如,数组,访问某个元素存储位置时,很有可能访问下一个存储位置)
- 工作集理论 : 工作集是进程运行时被频繁访问的页面集合
主存
分类:
- 随机存取存储器 RAM
- 只读存储器 ROM
编址:(要会算)
例如:内存地址从AC000H到C7FFFH,总共有___K个地址单元?
大-小+1,如0到9是10个数字
C7FFFH - AC000H +1 = C7FFFH + 1 - AC000H = C8000H -AC000H = 1C000H
转换成K 就是 $\frac{1C000H}{1024} = \frac{1*164+12*163}{2^{10}} = 112$
如果该内存地址按字(16bit)编址,有23片芯片构成,已知每片芯片有16K个存储单元,则该芯片每个存储单元存储__位
设每个存储单元存储x位 则 $112K 16 = 2816K*x$ 求得x=4
磁盘结构与参数
磁盘读取数据时,磁头会先找到对应的磁道,磁盘再转动,直到对应的扇区转到磁头的 地方
总线系统
- 内部总线 (芯片与处理器的总线)
- 系统总线 (插件板和系统板的总线)
- 数据总线 (传输数据)
- 地址总线 (传输地址)
- 控制总线 (传输控制信号和时序信号)
- 外部总线 (微机和外部的总线)
可靠性
-
串联系统
- $R = R_1R_2...*R_n$
-
并联系统
- $R = 1-(1-R_1)(1-R_2)...*(1-R_n)$
-
串并混合
- 先看整体,如果是串联,就先算并联;如果是并联,就先算串联
校验码
循环校验码CRC
(在要传输数据后添加的冗余位)
模2除法:在做除法运算的过程中不计其进位的触发
例:原始报文为"10111",其生成多项式为"$x^3+x+1$",对其进行CRC编码后的结果为?
多项式二进制为 111 ,冗余位为多项式长度-1个0,即:
111丿$\overline{1011100}$
111
$\overline{0101100}$
111
$\overline{0010100}$
111
$\overline{0001000}$
111
$\overline{0000110}$
111
$\overline{0000001}$
把最后的结果替换冗余位,即CRC编码后的结果是1011101
可以把结果与111进行模2除法运算,如果为0就是对的
海明校验码
算信息位和校验位
$2^k-1\geq n+k$
校验位都是在2的次方的位置
海明码从1开始,没有0,所以$2^k-1$
k是校验位
n是信息位
比如3个校验位最多能传7个状态数,其中信息位最多7-3=4
算校验位和海明码
例如:求1011的海明码
信息位为4,带入公式得出校验位为3,总位数为4
7 | 6 | 5 | 4($2^2$) | 3 | 2($2^1$) | 1($2^0$) | 位数 |
---|---|---|---|---|---|---|---|
X4 值为1 | X3 值为0 | X2值为1 | X1值为1 | 信息位 | |||
J3 | J2 | J1 | 校验位 |
$7=22+21+2^0$
$6=22+21$
$5=22+20$
$3=21+20$
那么J1的值是所有含有$2^0$的信息位值的异或(同值为0,异值为1),即 $J_1 = X_1 \bigoplus X_2 \bigoplus X_4 =1\bigoplus 1\bigoplus 1=1$
同理,J2 = 0 , J3 =0 ,即 海明码为1010101
海明码纠错
将受到的校验码和原始校验码进行异或,得出的位置就是出错的位置
例如,假如收到的海明码为1011101,校验码J3=1,J2=0,J1=1
与原始校验码001异或,得出100
说明是第$1*2^2+0+0=4$的位置出错了,取反得正确海明码1010101
二、操作系统基本原理
操作系统概述:
- 管理系统的硬件,软件,数据资源
- 控制程序运行
- 人机之间的接口
- 应用软件与硬件之间的接口
进程管理
进程的状态
基本的三态 : -->等待-->就绪-->运行
五态 : 加入了静止就绪和静止阻塞状态
前趋图
描述程序的某个部分的先后依赖关系
考试一般配合PV操作一起考
PV操作
-
进程的同步与互斥
互斥 : 千军万马过独木桥,只能走一个
同步 : 两人一起去游泳馆,一个走路,一个骑自行车,但为了同时到,骑车的人需要时不时停下来等走路的人
-
PV操作
临界资源 : 诸进程间需要互斥方式对其进行共享的资源,如打印机
临界区 : 每个进程中访问临界资源的那段代码
信号量 : 是一种特殊的变量,一般用S表示
P操作相当于阻塞 , 每次执行时信号量S=S-1,当信号量S<0时挂起
V操作相当于释放 , 每次执行时信号量S=S+1,当信号量$S\leq 0$时 激活P执行
在解PV题时,需要先判断是同步还是互斥 , 同步时需要判断他们的先后依赖条件 ,进行阻塞
例如 : 消费者和收银员两个进程.
没买东西是不能触发收银员收钱的,所以消费者购买东西 V(S1) 激活收银员收钱 P(S1)
收银员没收完钱消费者是不能拿着东西走的,所以收银员收完钱 V(S2) 激活消费者拿东西离开 P(S2)
在解趋势图和PV操作混合题时,条件是V,导向的结果是P
-
死锁问题
如果没有资源让进程执行完就会发生死锁
一般考试最少多少个资源不会发生死锁
$ M=n*(k-1)+1 $
n为进程数,k为每个进程需要的资源
例如,3个进程都需要5个系统资源,则如果有13个资源就不会发生死锁,因为如果都先分配4个,剩下的一个随便分配都能完成,并释放资源
存储管理
-
段页式存储
-
页式存储(页号+页内地址)
-
页表存的是页号和物理块号
-
页面大小都一样
逻辑地址和物理地址转换,组成都是 页号/块号 + 页内地址
两者的页内地址都是相同的,先区分逻辑地址中的页号和页内地址,通过逻辑地址的页号找到物理地址的块号就行了
例如:
页面大小为4K,访问逻辑地址为5A29H,那么4K是$2^{12}$,对应16进制的三位,即A29是页内地址,5是页号,可通过页号5去页表里查物理块号
如果需要淘汰页号,则淘汰状态在内存中,并且没有访问的页号
-
-
段式存储(段号+段内地址)
- 段表存的是段号+段长+基址
- 按逻辑结构分,所以分割的段不一样大
-
段页式存储
- 先分段再分页
-
-
页面置换(淘汰 )算法
- 最优算法
- 随机算法
- 先进先出算法
- 最近最少使用算法
文件管理
- 索引文件
- 位示图
- 第多少字从1开始算
- 第多少位置从0开始算
作业管理
设备管理
- 数据传输控制方式
微内核操作系统
- 虚设备与SPOOLING技术
- 可理解为队列,先进先出
三、数据库系统
数据库模式
三个模式:
- 外 模式 (视图)
- 概念模式 (表)
- 内模式 (存储方式)
两级映射:
- 外模式/概念模式映射. 当表改变时,视图不用变,保证了逻辑独立性
- 概念模式/内模式映射. 当存储方式改变时,表结构不用变,保证了物理独立性
ER模型
注意转关系模式和联系
- 一个实体转为一个关系模式
- 一对一的关系,1个实体转成1个关系模式,中间的联系可以转成一个关系模式或合并到任意一个实体里
- 一对多的关系,1个实体转成1个关系模式,中间的联系可以转成一个关系模式或合并到多的实体里,比如部门对员工
- 多对多的关系,1个实体转成1个关系模式,中间的联系必须转成一个关系模式
关系代数与元组演算
- 并
- 交
- 差
- 笛卡尔积 "X"
- 结果是行*行,列+列
- 投影 "π"
- 选中的列 ,参数是字段名(或数字列)
- 选择 "σ"
- 选中的行,参数是属性值(或数字列)
- 联接 "⋈"
- 联接后会把相同字段去掉(与笛卡尔积比较)
- 自然联接是默认条件是相同的字段
规范化理论
函数依赖
- 函数依赖 A ->B
- 部分函数依赖 A+B -> C ; A->C
- 传递函数依赖 A -> B -> C
求候选键
给出一定关系,和函数依赖,求候选键
画图,候选键能推导出所有的关系
范式
- 1NF : 属性值都是不可分的原子值
- 2NF : 在1NF的基础上消除非主属性对候选键的部分依赖
- 3NF : 在2NF的基础上消除非主属性对候选键的传递依赖
- BCNF : 在3NF的基础上消除主属性对候选键的传递依赖
- BCNF相当于每个属性都不部分依赖于候选键也不传递依赖于候选键
主属性:候选关键字里的属性
非主属性:候选关键字外的属性
单主键不可能存在部分依赖,只有复合主键才可能有部分依赖
模式分解
- 保持函数依赖分解
- 无损分解
- 无损:可以还原; 有损:不能还原
并发控制
事务
- 原子性 事情要么做要么不做,不能拆分
- 一致性 能量守恒,做完前做完后总量一致
- 隔离性 独立进行,互不影响
- 持续性 执行后结果影响是持续的
封锁协议
丢失修改: 事务A修改数据R,但结束前其他事务也修改了数据R,导致数据丢失
读脏数据: 事务A读取了其他事务还没提交的数据
不可重复读: 数据A两次读取数据R之间,其他事务修改了数据R,导致同一数据前后读取不一致
X锁,是事务T对数据A加上X锁时,只允许事务T读取和修改数据A
S锁,是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁。
- 一级封锁协议
- 加X锁直到事务结束 (防止丢失修改)
- 在一级协议中,如果只是读数据而不对其修改,是不会加锁的,所以不能保证不读脏数据和可重复读
- 二级封锁协议
- 在一级协议基础上,读前加S锁,读完释放S锁 (防止丢失修改 , 防止读"脏"数据)
- 三级封锁协议
- 在一级协议基础上,读前加S锁,事务结束释放S锁 (防止丢失修改, 防止读"脏"数据, 防止不可重复读)
- 两段锁协议
- 可串行化的,可能发生死锁
- 加锁阶段和解锁阶段,出现解锁后就不能再加锁了,例如: 加加加加解解解解
数据库完整性约束
实体完整性约束 (主键,不能为空,不能重复)
参照完整性约束 (外键,其它表的主键,允许为空)
用户自定义完整性约束 (字段的约束,比如只让填0,1,只让填日期等等)
触发器 (提供给程序员和数据分析员来保证数据完整性的一种方法)
四、计算机网络
七层模型
层次 | 名称 | 主要功能 | 主要设备及协议 |
---|---|---|---|
7 | 应用层 | 实现具体的应用功能 | |
6 | 表示层 | 数据的格式与表达、加密、压缩 | |
5 | 会话层 | 建立、管理和终止会话 | |
4 | 传输层 | 端到端的链接 | TCP、UDP |
3 | 网络层 | 分组传输和路由选择 | 三层交换机、路由器 |
2 | 数据链路层 | 传送以帧为单位的信息 | 网桥、交换机、网卡 |
1 | 物理层 | 二进制传输 | 中继器、集线器 |
网络技术标准与协议
TCP三次握手
DHCP自动分配IP
DNS的迭代查询和递归查询
网络类型和拓扑结构
按分布范围分: 局域网/城域网/广域网/因特网
按拓扑结构分: 总线型/星型/环形
网络规划与设计
分层设计
- 接入层 向本地网段提供用户接入(最底层,只有一层)
- 汇聚层 网络访问策略控制、数据包处理、过滤、寻址 (中间层,可以有多层)
- 核心层 数据交换 (最上层,只有一层)
IP地址和子网划分
IPv4转成2进制总共有32位
IP地址 = 网络位 + 主机位
A类地址 前8位是网络位,以0开头,最多主机位$2^{(32-8)}-2$
B类地址 前16位是网络位,以10开头,最多主机位$2^{(32-16)}-2$
C类地址 前24位是网络位,以110开头,最多主机位$2^{(32-24)}-2$
实际使用时,一个A类或B类的主机位太多了,容易浪费,所以引入了子网划分,节约资源
无分类编址,172.18.129.0/24
24代表前24位为网络位,所以能容纳的主机位为 $2^{8}-2$
子网掩码 : 转二进制后,为1的部分是网络位,为0是主机位
五、信息安全
安全属性
- 保密性 : 最小授权原则, 防暴露 , 信息加密 , 物理保密
- 完整性 : 安全协议 , 校验码 , 密码校验 , 数字签名 , 公证
- 可用性 : 综合保障 ( IP过滤 , 业务流控制 , 路由选择控制 , 审计跟踪 )
- 不可抵赖性 : 数字签名
加密(保密性)
- 对称加密 秘钥加密,秘钥解密 (DES, AES, RC-5, IDEA) 加密速度快,适合大量文本
- 非对称加密 公钥加密,私钥解密 (RSA, Elgamal, ECC, 背包算法, Rabin, D-H) 加密速度慢,适合少量文本
信息摘要(完整性)
单向Hash函数,固定长度的散列值.常用的右MD5和SHA
数字签名(不可抵赖)
比如A发信息给B,用A的私钥加密(数字签名),B收到后用A的公钥解密(验证签名),如果能解开,说明该信息是A发出的,因为只有A才有A的私钥
数字证书与PGP
数字信封
发送方将原文对称加密(适合大量文本)传输过去,再把加密秘钥用接收方公钥加密发送给对方
接收方用自己的私钥解开加密的秘钥,再用秘钥解开对称加密的原文
数字证书
如果B给A的公钥被C截获并篡改为C的公钥,那么A发给B的信息会被C解开.
这时需要正规的组织CA来公布权威的主体公钥信息,类似官方发布
各个网络层次的安全保障
网络攻击与威胁
威胁名称 | 描述 |
---|---|
重放攻击 ( ARP ) | 截获某次通讯数据并拷贝,出于非法的目的重发 |
拒绝服务 ( DOS ) | 合法访问被阻止 |
窃听 | 窃取信息 |
业务流分析 | 长期监(窃)听,并分析 |
信息泄露 | 信息泄露给别人 |
破坏信息完整性 | 非授权的增删改破坏数据 |
非授权访问 | 绕开授权非法访问 |
假冒 | 欺骗系统冒充合法用户或大权限用户 |
旁路控制 | 利用系统缺陷获取非授权信息 |
授权侵犯 | 被授权的人用于非授权的目的,"内部攻击" |
特洛伊木马 | 软件中包含某段程序,执行时破坏用户安全 |
陷阱门 | 在系统中某个地方设置"机关" |
抵赖 | 否认自己发的消息,伪造他人信息 |
防火墙
-
网络级 效率比较高,类似海关只检查发货地
-
应用级 效率比较低,类似海关开箱检查
-
屏蔽子网
外网->防火墙->被屏蔽子网(WEB服务器,邮件服务器等能被外网访问的)->防火墙->内部网络
-
六、数据结构与算法基础
数组与矩阵
数组
数组类型 | 存储地址计算 |
---|---|
一维数组a[n] | a[i]的存储地址为 : a+i*len |
二位数组$a[m][n]$ | $a[i][j]$的存储地址按行为 : a+(i * n+j) *len $a[i][j]$的存储地址按行为 : a+(j * m+i) *len |
稀疏矩阵
考试时直接带入答案计算会更方便
线性表
顺序表与链表
-
顺序表 连续空间存储
-
链表 非连续空间存储
- 单链表
- 循环链表
- 双向链表
注意链表的结构和增删结点
优缺点 :
空间上,顺序表存储密度更优(不用存指针),链表容量分配更优(动态分配)
时间上,顺序表读效率高,链表新增删除效率高
队列与栈
- 队列 先进先出
- 栈 先进后出
广义表
例如 LS = ( a , ( b , c ) , ( d , e ) )
长度 : 表的元素个数,上面长度为3
深度 : 表的递归层数,上面深度为2
(可用多维数组理解)
基本运算 :
- 取表头 head(LS) : 表中第一个元素 ,结果为 a
- 取表尾 tail(LS) : 表中除第一个元素的其他元素 , 结果为 ( ( b , c ) , ( d , e ) )
树与二叉树
了解清楚树的基本概念
满二叉树和完全二叉树的特点
二叉树的遍历
- 前序遍历
- 根左右
- 中序遍历
- 左根右
- 后续遍历
- 左右根
- 层次遍历
- 从上到下,从左到右
树转二叉树
所有的孩子结点转成左子树结点
所有的兄弟结点转成右子树结点
查找二叉树(排序二叉树)
左子树结点都小于根,右子树结点都大于根
最优二叉树(哈夫曼树)
-
树的路径长度 : 层数-1
-
权 : 每个节点的权值
-
带权路径长度 : 路径长度 * 权值
-
树的带权路径长度(树的代价) : 所有叶子结点带权路径长度相加
给定权值构造哈夫曼树 :
先把给定的权值按从小到大的顺序排列
取出最小的两个组成新的结点,如2,3组成5,再把新的结点参与到给定的权值中再次从小到大排序
依次递归,能从下到上构造出哈夫曼树
线索二叉树
由于二叉树里叶子结点的指针没有利用起来,为了遍历方便
产生了前序, 中序, 后序线索二叉树
即:根据前序, 中序, 后序的排列规则,把叶子结点的指针指向对应排序的前后结点
平衡二叉树
任意结点的左右子树深度相差不超过1
每个结点的平衡度只能为-1,0或1 (左右子树深度差)
图
- 无向图
- 有向图
图的存储用邻接矩阵(无向图由于是对称的矩阵所以可以用上三角矩阵或下三角矩阵)和邻接表
图的遍历可以有深度优先和广度优先
拓扑排序,用有向图可以表达出任务完成的先后顺序
最小生成树
- 普里姆算法 选取任意一点做红点,其他为蓝点,选一条红点到蓝点最短的线,连起来的蓝点也成为红点,依次类推
- 克鲁斯卡尔算法 距离从小到大开始选,只要不组成环路就行
算法基础
算法的特性
- 有穷性 : 执行有穷步后结束
- 确定性 : 算法中的每条指令都必须有确切的含义
- 有效性 : 算法的每个步骤都能有效执行并得到确定结果,如0不能做分母
- 输入 大于等于0条
- 输出 大于等于1条(有输出)
算法的复杂度
- 时间复杂度
- $O(1)<O(log_2n)<O(n)<O(n*log_2n)<O(n2)<O(n3)<O(2^n)$
- 推导时间复杂度
- 如果运行时间是常数量级,用常数1表示
- 只保留时间函数中的最高阶项
- 如果最高阶项存在,则省去最高阶项前面的系数
- 举例:
- 常数级就是O(1)
- 排序二叉树查找就是$O(log_2n)$
- 一层循环就是O(n)
- 循环里嵌套二叉树查找就是$O(n*log_2n)$
- 循环嵌套循环就是$O(n^2) O(n^3)$
- 空间复杂度
查找
顺序查找
从头到尾依次比较,平均查找长度为$\frac{n+1}{2}$, 时间复杂度为O(n)
二分查找
有序排列才能用二分查找法,最多查找次数为$\lfloor log_2n \rfloor +1$ , 时间复杂度为$O( log_2n )$
例如有数组下标1~12的值从小到大排列
(1+12)/2=6.5向下取整得6
把值与下标6的比较,如果小则取$\lfloor (1+5)/2 \rfloor$ ,如果比6大则$\lfloor (7+12)/2 \rfloor$
因为已经排除下标6了,所以下次比较从 1 ~ 5或 7 ~ 12
与其结果下标的值继续比较,以此类推找到正确的值
散列表
设计一个Hash函数 , 以关键字为自变量 ,将关键字映射到一个有限的,地址连续的区间中,这个区间就是散列表
散列查找中使用的转换函数就叫散列函数
排序
- 排序的概念
- 稳定与不稳定排序 (比如相同值,谁先谁后)
- 内排序与外排序
- 排序方法分类
- 插入类排序
- 直接插入排序
- 希尔排序
- 选择类排序
- 直接选择排序
- 堆排序
- 交换类排序
- 冒泡排序
- 快速排序
- 归并排序
- 基数排序
- 插入类排序
直接插入排序
类似排队做早操时,不知道站那里,找到比你高的和比你矮的中间插进去就行
希尔排序
直接选择排序
先选第一小的,再选第二小的,一直到最后
堆排序
什么是堆
初建堆
先把序列依次变成完全二叉树,然后从最后一个非叶子结点起,把该结点与它的子结点比较大小,然后做交换
交换后如果有子结点的还要继续对比一下
堆排序
把堆的根节点取走,再把剩下的形成新的堆,再取走根结点,最后形成有序的排列
取走根结点后,把最后一个叶子结点放到根节点,然后和处建堆时候比较一样,与子结点进行比较,往下移,再与子结点比较,再下移
冒泡排序
快速排序
分而治之,和劫匪抢银行一样,以劫匪为基准,男的站左边,女的站右边,站好后对两组再排序
归并排序
基数排序
先比较个位排序,再比较十位排序,再比较百位排序...
排序的时间和空间复杂度
七、程序设计
编译与解释
文法
-
认识终结符和非终结符
- P : 产生式α→β
- S : 起始符
- V : 非终结符是能推导出其他符的,常用大写表示,如A,B等
- T : 终结符是不能再推导出其他的,常用小写表示,如a,b等
-
文法的类型
在产生式α→β中
类型 别称 说明 对应自动机 0型 短语文法 α至少包含一个非终结符 图灵机 1型 上下文有关文法 在0基础上,β的长度大于等于α 线性界限自动机 2型 上下文无关文法 在1的基础上,α为非终结符 非确定的下推自动机 3型 正规文法 在2的基础上,A→a|aB ,一定要有或"|" 有限自动机 -
如何判断一个串是否为某个文法的句型
正规式
正规式与正规文法之间的转换
文法产生式 | 正规式 | |
---|---|---|
规则1 | A→xB; B→y | A=xy |
规则2 | A→xA|y | A=x*y |
规则3 | A→x,A→y | A=x|y |
有限自动机
表达式
中缀表达式是人常用的方式,可由中序遍历生成
求其他X缀式时,可换成对应的X序遍历
传值与传址
传值相当于复制内存中的某个值到另一个空间,值改变时原值不变
传址相当于公用内存中的某个地址,值改变时,原来的值也会跟着变
使用"&"符号传址
多种程序语言特点
语言 | 特点 |
---|---|
Fortran | 科学计算 |
Pascal | 为教学开发,表达能力强 |
C | 指针操作强,高效 |
Lisp | 函数式程序语言,人工智能 |
C++ | 面向对象,高效 |
Java | 面向对象,中间代码,跨平台 |
C# | 面向对象,中间代码,.Net |
Prolog | 逻辑推理,简洁性,表达能力,数据库和专家系统 |
八、法律法规
所涉及的法律法规角度
- 著作权法
- 计算机软件保护条例
- 商标法
- 专利法
保护期限
主体和权利 | 保护期限 |
---|---|
公民的作品和软件产品 (发表权,使用权,获得报酬权等) | 终生+死后50年年底 (署名权是永久的) |
单位的作品和软件产品 (发表权,使用权,获得报酬权等) | 首发后的50年年底 |
注册商标 | 有效期10年(到期满6月必须续注) |
发明专利权 | 申请之日开始20年 |
实用新型和外观设计专利权 (已经存在的事物优化) | 申请之日开始10年 |
商业秘密 | 不确定,公开后公众可用 |
知识产权人确定
情况说明 | 归属 |
---|---|
在单位的任何情况,包括下班,离职一年内的本职工作 | 单位 |
委托开发 | 有合同约定归约定方; 没约定归创作方 |
合作开发 | 打杂的(物质场地提供等)不享有著作权; 共同创作,共同享有 |
商标 | 谁先申请归谁; 同时申请,提供谁先使用的证据归谁; 无法提供证据,协商解决,不行就抓阄 |
专利 | 谁先申请归谁; 同时申请协商解决 |
侵权判定
中国公民,法人或者其他组织的作品,无论是否发表,都享有著作权
开发软件所用的思想,处理过程,方法等不受保护
著作权法不适用的情形 :
-
国家机关的决议相关文件和正式译文
-
时事新闻
-
历法、通用数表等
标准化
国际、国外标准代号 : 标准代号+专业类号+顺序号+年代号
我国国家标准代号
GB : 强制性标准代号
GB/T : 推荐性标准代号
GB/Z : 指导性标准代号
GSB : 实物标准代号
行业标准代号
由汉语拼音大写字母组成,重复的会换,如电子行业为SJ (GJB国家军用标准现在也属于行业标准)
地方标准代号
DB + 省级行政区代码前两位
企业标准代码
Q + 企业代号
九、多媒体基础
音频相关概念
声音的带宽
-
人耳朵听到 : 20Hz~20KHz
-
人说话 : 300~3400Hz
-
乐器 : 20Hz~20KHz (和人耳听到的一样)
采样
- 采样频率 采样频率越高说明单位时间内采集的点越多(声波的x轴)
- 采样精度 精度越高只声波范围划分越细(声波的y轴)
- 采样频率应为声音最高频率的两倍(电话一般用8k(人声的两倍),乐器一般用44k)
图像的相关概念
彩色空间
- RGB 电脑的显示屏,光的三原色红绿蓝,因为是自主发光
- YUV(电视,兼容) 为了兼容老式的黑白电视
- CMY(CMYK) 颜料的三原色, 青,品红,黄(节省成本直接加黑),因为是反射光
- HSV(HSB) 色相,饱和度,明度
媒体的种类
- 感觉媒体 五官感觉,听,视,嗅,触,味
- 表示媒体 文字,图像,视频,音频等
- 显示媒体(表现媒体) 输入设备和输出设备
- 存储媒体 磁盘光盘内存等
- 传输媒体 光纤电缆等
多媒体的计算
注意单位
b转B需要除以8
K1204,只有存储是用K
k1000,传输时用
十、开发模型
瀑布模型(SDLC)
被淘汰的根本原因在需求不明确,经常改
所以只适用于需求明确或二次开发
原型模型、演化模型、增量模型
- 原型 构造一个简易的小demo,先给用户看,一般用于需求确认(需求不确定时用原型)
- 演化模型 客户看了原型慢慢修改需求达到的最终产品
- 增量模型 先写核心功能模块,最后在核心功能做好的情况下慢慢添砖加瓦
螺旋模型
包含了原型的特性,引入了风险分析
V模型、喷泉模型、快速开发模型(RAD)
- V模型 强调了测试,测试贯穿开发始终
- 喷泉模型 面向对象
- 快速开发模型RAD
构件组装模型(CBSD)
提高了软件开发的复用性(构件模块可以重复使用)
敏捷开发方法
适合小项目
信息系统开发方法
需求的分类
结构化设计
内聚从低到高
偶然内聚->逻辑内聚->瞬时内聚->过程内聚->通信内聚->顺序内聚->功能内聚
耦合从低到高
非直接耦合->数据耦合->标记耦合->控制耦合->外部耦合->公共耦合->内容耦合
测试原则和类型
测试用例设计
测试阶段
McCabe复杂度
有向边数 - 结点数 + 2
系统运行与维护
软件能力成熟度集成CMMI
未通过CMMI称为混乱级
已管理级是个人对项目积累的经验
已定义级是组织和企业积累的经验和解决方案(文档化标准化)
定量管理是企业有量化标准(量化)
优化级(持续优化)
项目管理基础知识
- 时间管理
- Gantt图和PERT图
- 要会算PERT图的最早开始时间和最晚开始时间(通过最后一个节点的最早开始时间反推最晚开始时间)
- 风险管理
- 风险曝光度 = 风险出现概率*风险可能造成的损失
十一、面向对象设计
面向对象基本概念
UML
设计原则
- 单一职责原则 : 设计目的单一的类
- 开放-封闭原则 : 对扩展开放,对修改封闭
- 李氏替换原则 : 子类可以替换父类
- 依赖倒置原则 : 要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程
- 接口隔离原则 : 使用多个专门的接口比使用单一的总接口要好
- 组合重用原则 : 要尽量使用组合,而不是继承关系达到重用目的
- 迪米特原则 : 一个对象应当对其他对象有尽可能少的了解
设计模式的概念
- 架构模式
- 最高层级.全局的,例如C/S结构
- 设计模式
- 中间层级,局部的,关注软件的系统设计,与具体实现语言无关
- 惯用法
- 最低层级,关注软件系统的设计与实现,与具体实现语言有关
设计模式的分类
- 创建型模式 创建对象
- 结构型模式 处理类或对象的组合问题
- 行为型模式 描述类或对象交互情况和指责分配
创建型模式
结构型模式
行为型模式
下午题
一、数据流图
数据流图基本概念
数据流图的分层(DFD)
数据字典
数据流图平衡原则
-
父图与子图的平衡
- 父图和子图的流入和流出要一致
-
子图内的平衡
- 只有输入称为黑洞,只有输出称为奇迹,要有输入也有输出
答题技巧
先分析出题目的实体,加工,数据流,数据存储等信息,再用数据平衡原则分析
二、数据库设计
数据库设计过程
ER模型
-
实体间的联系类型
-
ER图向关系模式转换
- 转换基本原则是 : 实体和联系分别转成关系,属性则转换成相应的关系属性
- 一对一 : 联系可单独作为关系模式,合并可以把联系合并到联系中的任何一个实体里
- 一对多 : 联系可单独作为关系模式,合并只能把联系合并到多的一个实体里
- 多对多 : 联系只可单独作为关系模式
答题技巧
- 详细分析试题说明
- 熟练掌握基本知识
三、UML建模
用例图
- include 包含, 必须的用例.登记用户信息时,必须要用到用户登录
- extend 扩展, 非必要用例
类图
- 泛化 是一种继承关系,描述子类特化父类的所有特征行为.例如:老虎是动物的一种
- 实现 类与接口的关系,表示类似接口所有特征和行为的实现.例如:老虎叫和鸭子叫
- 关联 是一种拥有关系,可以说是双向的可以是单向的.例如老师和学生,学生和课程
- 聚合 整体和部分的关系. 例如:大雁组成雁群
- 组合 一种强的整体和部分关系,例如:鸟必须有翅膀
- 依赖 是一种使用关系. 例如:动物使用氧气和水
各种关系的强弱顺序:
泛化= 实现> 组合> 聚合> 关联> 依赖
顺序图
一般考填消息和对象名
活动图
状态图
通讯图
和顺序图一样,统称交互图,只是顺序图更强调时间概念
四、数据结构及算法
分治法
递归技术
二分查找
回溯法
贪心法
动态规划法
动态规划法和分治法最大的区别是,动态规划法需要填表,通过表来求解
五、面向对象程序设计
记清楚各个关键字,练习上下文填写代码