由于工作单位是国企原因,似乎还满看重软考的。
鉴于目前的水平,在同事的建议下想在新年下半年尝试一下软考中级中,软件设计师这个证书。
这个周末开始学习,发现这个考试的考点非常多,而且非常侧重于概念和理论,还有很多计算机基础的知识点。
这对于没有计算机基础的我来说是一次查漏补缺的过程,虽然基本上都是空白需要填满。。。
以下是一些零散整理的学习笔记,是在看考题和教学视频中间记录下来帮助记忆的。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
规格化浮点数就是将尾数的绝对值限定在[0.5 , 1]
IEEE 754标准中定义浮点数的表示范围为:
单精度浮点数 二进制:± (2-2^-23) × 2^127 对应十进制: ~ ± 10^38.53
双精度浮点数 二进制:± (2-2^-52) × 2^1023
浮点数的表示有一定的范围,超出范围时会产生溢出(Flow),
一般称大于绝对值最大的数据为上溢(Overflow),小于绝对值最小的数据为下溢(Underflow)。
指数部分正常为emin = -126, emax = 127
128用于表示NaN
面向对象
特定多态:
专用多态 重载 = 过载 overload
void test (int x);
void test (String x);
强制多态 = 赋值多态
Parent p = new Child();
通用多态:
包含多态 = 覆盖 Override
参数多态 : 泛型
海明校验码:
n位数据,需要k个校验位。
n和k的关系是:2^k - 1 >= n + k
硬盘容量:
格式化容量 = 面数 x 磁道数/面 x 扇区数/道 x 字节数/扇区
非格式化容量 = 面数 x 磁道数/面 x 内圆周长 x 最大位密度
按总线上传送的内容分为: 数据总线,地址总线和控制总线。
吞吐率: 单位时间执行出的结果数。
流水线建立时间为所有子过程时长总和。流水线一旦建立好,其吞吐率为最长子过程所需时间的倒数。
人耳可以听到的信号范围是20-20kHz, Hz是声波每秒变化的次数
RUP是Rational Unified Proces 的缩写。模型元素:角色,活动,制品和工作流
角色:谁做; 制品: 做什么; 活动: 怎么做; 工作流:什么时候做。
数据结构
链表插入操作。后来的先衔接已有的,再改变已有的指针
循环列队
队满时,tail + 1 = head.最后一个单元不存储数据。
tail = head 表示队空
哈夫曼树
将最小的2个节点组成一棵树,循环这个过程,直到只有一棵树
只有N0和N2两种节点组成。
N0 = N2 + 1适用于任何的二叉树
其中N0代表度为0的节点,即叶子节点。N2代表有左右子树,即度为2的节点。
树的节点:
分支节点: 非叶子节点的节点
内部节点,中间层的节点
二叉树
满二叉树,子节点个数最大。
完全二叉树,n-1层为满二叉树,最后一层从左到右排列。
完全二叉树 N1 = 0 或者 1
二叉树的中序遍历 = 树的后续遍历
图:
由有限个顶点集合V,边集合E组成。
有向图的边是有方向的。
无向图边BD:(B,D)
有向图边BD: 表示B指向D
顶点的度:与之相关联边的数量。
拓扑排序
根据AOV网络,先找入度为0的节点完成之后,删除该节点所有出度。
再重复找入度为0的节点直到结束。
关键路径是最长路径,关键路径可能不止一条。
AOE网:有权值的AOV网
前趋图DAG: 一个有向无循环图
用于进程之间执行的前后关系
临界资源:互斥使用的共享资源,比如打印机
临界区:访问临界资源的那段代码
信号量: 变量s
P操作:wait操作。使s = s - 1, 若s < 0 则暂停执行.
V操作 :notify操作: s = s + 1 , s<= 0 唤醒一个等待的进程。
常用排序算法
插入排序(直接插入,希尔)
选择排序(简单排序,堆排序)
交换排序(冒泡,快速)
归并排序
基数排序
希尔排序(shell)
先计算步长:= 元素个数n/2,根据步长两两配对比较。
再逐步缩小步长,直到步长=1。
public static void shellSort(int[] p) {
int len = p.length;
int step = len;
while (step > 1) {
step = getNewStep(step);
for (int i = 0; (i + step) < len; i++) {
if (p[i] > p[i+step]) {
swap(p,i,i+step);
}
}
}
System.out.println(Arrays.toString(p));
}
private static int getNewStep(int step) {
return (step % 2 == 0) ? step/2 : step/2 + 1;
}
private static void swap(int[] p, int a1, int a2) {int temp = p[a1];p[a1] = p[a2];p[a2] = temp;}
堆排序
小顶堆:子节点都大于父节点的满二叉树。
大顶堆:父节点都大于子节点
i>= n/2时候,表示节点i为叶子节点。
基数排序:
从个位开始收集,形成新的链表,再收集十位,百位...。
Hash地址
直接求址法:a + b * key
求余法 a mod key
基数转换法 把数据转换成另外一种进制的数
平方取中法 平方之后取中间的一位
双散列函数
拉链法
查找算法
平均查找长度:ASL
顺序查找ASL : (1+n)/2
二分查找ASL: log(n+1)-1 要求是有序表
分块查找:先确定块,再顺序查找。
元素个数n, 等分成b块, 每块元素个数s = n / b
二分查找块: ASL1 = long(n/s + 1) + s/2
顺序查找快: ASL2 = (s^2 + 2s + n)/(2s)
程序语言:
一个文法产生的句子是从文法开始符号出发推导出的所有终结符号串
终结符:不能拆分的语句,原子量,一般用小写字母表示,不能在推导式左边。
非终结符:可以拆分,一般用大写字母
Vn 非终结符集合
Vt 终结符结合
P 推导式
S 开始符
0型文法: 短语文法,具有图林机的处理能力
a -> b
V = Vn 并 Vt
a,b都是V的一个实例,
并且a至少包含一个非终结符
例Sa -> cba
0型文法都是递归和枚举的,反之递归可枚举集必定是0型
1型:上下文有关文法
a -> b
在0型基础上,
b.length >= a.length
例如:aB -> B 不属于1型。
2型:上下文无关文法
在1型基础上,
a是非终结符
3型: 正规文法
在2型基础上,
b只能是左线性,右线性中的一种。
例:A -> a | aB (右线性) 或者 A -> a | Ba (左线性)
正规式:正则表达式
NFA不确定的有限自动机 (S0可以有多个初态)
DFA确定的有限自动机
5元组。
S代表状态,其中S0初始是唯一的
Z代表终态集
∑输入字母表
f关系映射 f(S,a) = S' 代表输入a,S状态会变成S'
语法推导树
S -> aAc 且 A (->*) b .则b是abc相对于A的短语
直接短语: A ->b
推导树的最左直接短语称为
句柄
死锁发生的条件:
互斥条件:资源不能被共享
保持和等待条件:不能释放
不剥夺条件:系统不能强行收回,只能由进程自己释放
环路等待条件:若干个进程形成环路,每个占用对方要申请的下一个资源。
避免死锁的算法:银行家算法
先根据已分配资源计算系统剩余资源。
将剩余资源分配给目前可以执行完的进程,等待该进程完毕释放资源后再分配后续进程。