Skip to content

Commit

Permalink
软考
Browse files Browse the repository at this point in the history
  • Loading branch information
[email protected] committed Nov 1, 2024
1 parent ab9cfed commit 66a8e61
Show file tree
Hide file tree
Showing 3 changed files with 165 additions and 28 deletions.
3 changes: 2 additions & 1 deletion docs/.vitepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ export default {
{ text: "算法", link: '/chapter/code/algorithm/leetcode' },
{ text: "java", link: '/chapter/code/language/java' },
{ text: "python", link: '/chapter/code/language/python' },
{ text: "记录", link: '/chapter/note' }
{ text: "记录", link: '/chapter/note' },
{ text: "软考", link: '/chapter/tech/rk' }
]
},
{
Expand Down
190 changes: 163 additions & 27 deletions docs/chapter/tech/rk.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,161 @@
# 软考
## 软件设计师
### 计算机系统
#### 校验码
- 奇偶校验码 检查奇数\偶数的**个数** 实现**检错**
- 海明码 通过扩大码距实现**检错和纠错** 数据n位 校验n位 则
$2^k-1 \geq n+k$
- 循环冗余校验码CRC 总位数n 数据位k 校验位r 则
$n=k+r$
#### 可靠性
- 串联:$R_1*R_2*R_3$
- 并联:$1-(1-R_1)*(1-R_2)*(1-R_3)*$
### 程序设计语言
- 控制结构:顺序结构、选择结构、控制结构
- 编译与解释
- 词法、语法、语义分析不可省略
- 词法分析 逐个字符扫描 输出二元组单词记号流
- 语法分析 判断单词符号序列是否符合语法规则 输出语法树
- 语义分析 类型分析和检查 找出**静态**语义错误
- 中间代码生成、代码优化可省略
- 中间代码生成 与具体机器**无关** 常用**后缀式****三地址码****三元式****四元式****树(图)**
- 目标代码生成 与具体的**工作机器密切相关** **寄存器的分配相关**
- 符号表参与所有阶段,收集记录**符号类型和特征信息**
- **正规式** 用于描述字符串集合的符号表示法
- `a`表示字符a
- `a*`表示0或多个字符a
- `a|b`表示字符a或者字符b
- `(ab)*`表示0或多个字符ab组合
- **正规集** 有正规式定义的字符串集合
- 闭合性 对并、交、补等操作是封闭的
- 可判定性 对于任何给定的正规集,存在可以有效地判断一个字符串是否属于该集合的算法,通常通过有限状态自动机(FSA)实现
- 简洁性 正规集可以通过正规式进行简洁描述。
- 有限自动机 **词法分析工具**
- 上下文无关文法 **表示语法规则**
- 中缀式、后缀式(逆波兰式),利用****求值
### 数据结构
##### 线性表
1. 顺序存储
长度改变时,移动元素的个数期望值:插入$E_{insert} = \frac{n}{2}$,删除$E_{delete} = \frac{n-1}{2}$
2. 链式存储
##### 二叉树
1. 二叉树的性质
1. 第i层最多有$2^{i-1}$个节点
2. 高度为k的节点最多有$2^k-1$个节点
3. 对于任何二叉树,叶子节点数为$n_0$,度为2的节点数为$n_2$,则$n_0=n_2+1$
4. 具有n个节点的完全二叉树,其深度为$(log_2n)+1$

- 算法时间复杂度
$O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)$
- 算法空间复杂度 占用额外的空间 一般为$O(1)$ $O(n)$ $O(n^2)$
- 渐进符号 $O$记号为上界 $\Omega$记号为下界 $\Theta$记号为紧致界
$\Omega < \Theta < O$
- **递归式** 主定理
- $T(n) = aT(a/b) + f(n)$ 记住**关键公式** $n^{log_ba}$
- 若有常数k,有$f(n)=O(^{log_b{a-k}})$,则$T(n)=\Theta(n^{log_ba})$
- 若$f(n)=\Theta(n^{log_ba}lg^kn)$,则$T(n)=\Theta(n^{log_ba}lg^{k+1}n)$
- **线性表**
- 顺序存储 移动元素的个数期望值:插入$E_{insert} = \frac{n}{2}$,删除$E_{delete} = \frac{n-1}{2}$
- 链式存储
- **队列** 公式$(Q.front + Q.size -1 + M) \bmod M == Q.rear$
- **** 有字符构成的线性表
- 朴素模式匹配 最好$O(1)$ 最坏$O(n*m)$ 平均$O(n+m)$
次数分别为m次 、n-m+1)*m 、(n+m)/2
- **矩阵**
- 上下三角矩阵压缩存储 i>j 则 $k=[\frac{i(i+1)}{2}+j+1]$
- n阶三对角矩阵 存一维数组[k] $k=2i+j-2$
- 稀疏矩阵 三元组顺序表 十字链式存储
- ****
- 树的度是子节点数量的最大值
- 节点总数=节点的度数之和加1
- 度为m的树中第i层上最多有$m^{i-1}$个节点
- 高度为h度为m的树上最多有$\frac{m^h-1}{m-1}$
- n个节点度为m的树上最小高度为$log_m(n(m-1)+1)$
- **二叉树**
- 第i层最多有$2^{i-1}$个节点
- 高度为k的节点最多有$2^k-1$个节点
- 对于任何二叉树,叶子节点数为$n_0$,度为2的节点数为$n_2$,则$n_0=n_2+1$
- 具有n个节点的完全二叉树,其深度为$(log_2n)+1$
- 有中序才能构造出二叉树
- 平衡二叉树,任意节点左右高差不超过1
- 二叉排序树 **左<根<右** 中序序列**有序**
- 最优二叉树 哈夫曼树 n个叶子节点的带权路径长度最小
- 基于**贪心策略** 总结点数$2n-1$
- 哈夫曼编码压缩比 $\frac{等长*权-带权路径和}{等长*权}$
- ****
- 完全图 顶点数n 无向的边数$\frac{n(n-1)}{2}$ 有向图边数$n(n-1)$
- 顶点的边数叫做度
- 连通图 无向图中任意两个顶点是连通的 最少边数$n-1$ 最多$\frac{n(n-1)}{2}$
- 强连通图 有向图中任意两个顶点带方向连通的 最少边数$n$ 最多$n(n-1)$
- 邻接矩阵表示法(稠密) 邻接链表表示法(稀疏)
- 拓扑序列:1、取入度为0的顶点 2、删除改顶点的边 3、循环直到没顶点
- **小顶堆大顶堆**
- 小:$k_i \leq k_{2i} 且 k_i \leq k_{2i+1}$
- 大:$k_i \geq k_{2i} 且 k_i \geq k_{2i+1}$
- **排序** 适用基本有序的数组
- 直接插入排序 把第i个大的元素插入i位置,依次右移
稳定,复杂度:平均$O(n^2)$最坏$O(n^2)$最好$O(n)$空间$O(1)$
- 计数排序 使用元素范围固定 先统计个元素数量,再重新生成数组
- 简单选择排序 找到第i个大的元素,并与当前i位置的元素交换位置
不稳定,复杂度:平均$O(n^2)$最坏$O(n^2)$最好$O(n^2)$空间$O(1)$
- 堆排序 即构建大\小顶堆
不稳定,复杂度:平均$O(nlog_2n)$最坏$O(nlog_2n)$最好$O(nlog_2n)$空间$O(1)$
- 冒泡快速 两两相比,交换顺序,不断比出最大最小值
稳定,复杂度:平均$O(n^2)$最坏$O(n^2)$最好$O(n)$空间$O(1)$
- 快速排序 分治 以基准元素分前后来递归
不稳定,复杂度:平均$O(log_2n)$最坏$O(n^2)$最好$O(nlog_2n)$空间$O(log_2n)$
- 归并排序 分治分解=>合并 基本有序时比较次数比较少
稳定,复杂度:平均$O(nlog_2n)$最坏$O(nlog_2n)$最好$O(nlog_2n)$空间$O(n)$
### 知识产权
- 著作权
- 人身权 发表权(**有时间限制**)、署名权、修改权、保护作品完整权
- 财产权 复制权、发行权等等
- 地域性 只保护本国内
- 软件著作权
- 依据 **中华人民共和国著作权法****计算机保护条例**
- 保护程序(包含原码)和文档 50年
- 完成创作时就产生
- 职务开发的作品著作权归属单位,开发人员只享有**署名权**
- 委托开发 有合同按合同来,无合同归开发者
- 专利权 **申请**(先到先得,同到协商)
- 商业秘密 保护**技术信息****经营信息**
- 商标权 归**注册人** 可无限延长 冲突则抽签
### 数据库
- 数据模型
- 概念数据模型 E-R 按用户观点建模
- 实体 客观存在的事物
- 属性 描述实体的属性
- 码 实体的唯一标识
- 域 属性的取值范围
- 联系 实体间的对应关系 1对1、1对n、n对n
- 结构数据模型
- 层次模型 **有向树**
- 网状模型 ****
- 关系模型 **二维表**
- 三级模式结构
- 概念模式 **基本表**
- 外模式 **视图**
- 内模式 **存储文件**
- 模式->内模式
- 外模式->模式
- 物理独立性 改动模式<->内模式
- 逻辑独立性 改动模式<->外模式
- 关系代数
- $\theta$连接-比较、等值连接、自然连接(属性**等值**并去重)
- 关系模式
### 大题
#### 数据流图
一般试题上上用 E-外部实体 P-加工 D-数据存储 来表示
![DFD](/DFD.png)
- 名词解释
- 外部实体E:存在与软件之外的人、物体、组织、系统
- 数据存储D:存储加工后的输出数据、提供加工前的输入数据
- 加工P:将输入数据处理后得到输出数据
- 黑洞 只有输入没有输出
- 白洞/奇迹 只有输出没有输入
- 灰洞 输入数据不足以产生输出数据
- 数据流 **两端至少有一个加工流**
- 加工流->加工流
- **** 加工流->数据存储
- **** 数据存储->加工流
- **输出** 加工流->外部实体
- **输入** 加工流->加工流
- 上下文(顶层)数据流图 => 0层数据流图
- 实体E识别、数据存储D识别
- 数据流补充
- 方法1 父图子图数据流平衡
- 方法2 加工要有输入输出
- 方法3 加工要符合说明
- 格式:数据流xx 起点aa 终点bb
### 名词术语
- 二进制数据的表示
- 原码 最高位是符号位0正/1负,其余为绝对值
Expand All @@ -24,24 +168,16 @@
- 请求保持条件
- 不可剥夺条件
- 环路条件
- **正规式** 用于描述字符串集合的符号表示法
- `a`表示字符a
- `a*`表示0或多个字符a
- `a|b`表示字符a或者字符b
- `(ab)*`表示0或多个字符ab组合
- **正规集** 有正规式定义的字符串集合
- 闭合性 对并、交、补等操作是封闭的
- 可判定性 对于任何给定的正规集,存在可以有效地判断一个字符串是否属于该集合的算法,通常通过有限状态自动机(FSA)实现
- 简洁性 正规集可以通过正规式进行简洁描述。

- **开发阶段**
- 需求分析 确定软件要完成的功能及非功能性要求
- 概要设计 将需求转化为软件的模块划分,确定模块之间的调用关系
- 详细设计 将模块进行细化,得到详细的数据结构和算法
- **开发模型**
|模式|优点|缺点|
|-|-|-|
|瀑布模型|简单易懂,适合需求明确且不易变更的项目。<br>各阶段明确,便于管理和控制。|不灵活,难以应对需求变更。<br>一旦进入后期阶段,修改成本高。|
|敏捷模型|适应性强,能够快速响应需求变更。<br>频繁交付可工作的软件,提高用户满意度。|需要团队成员高度协作和沟通。<br>不适合大型、复杂的项目,可能导致缺乏文档。|
|迭代模型|允许逐步开发和反馈,便于发现和修复问题。<br>适合需求不明确或可能变化的项目。|可能导致频繁的需求变更,影响进度控制。<br>各迭代之间的整合可能复杂。|
|螺旋模型|结合了迭代和瀑布的优点,重视风险管理。<br>允许频繁的用户反馈和需求调整。|不实施复杂,需要较强的项目管理能力。<br >可能导致成本和时间的高消耗。|
|V模型|强调验证和确认,适合安全性高的项目。<br>各阶段都有明确的测试活动,便于质量控制。|仍然是线性的,不够灵活。<br>对需求变更的适应性较差。|
| 模式 | 优点 | 缺点 |
| -------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| 瀑布模型 | 简单易懂,适合需求明确且不易变更的项目。<br>各阶段明确,便于管理和控制。 | 不灵活,难以应对需求变更。<br>一旦进入后期阶段,修改成本高。 |
| 敏捷模型 | 适应性强,能够快速响应需求变更。<br>频繁交付可工作的软件,提高用户满意度。 | 需要团队成员高度协作和沟通。<br>不适合大型、复杂的项目,可能导致缺乏文档。 |
| 迭代模型 | 允许逐步开发和反馈,便于发现和修复问题。<br>适合需求不明确或可能变化的项目。 | 可能导致频繁的需求变更,影响进度控制。<br>各迭代之间的整合可能复杂。 |
| 螺旋模型 | 结合了迭代和瀑布的优点,重视风险管理。<br>允许频繁的用户反馈和需求调整。 | 不实施复杂,需要较强的项目管理能力。<br >可能导致成本和时间的高消耗。 |
| V模型 | 强调验证和确认,适合安全性高的项目。<br>各阶段都有明确的测试活动,便于质量控制。 | 仍然是线性的,不够灵活。<br>对需求变更的适应性较差。 |
Binary file added docs/public/DFD.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 66a8e61

Please sign in to comment.