软件设计师综合知识点总结(根据 教材+视频+刷题 总结整理)
目录
备考建议★★★★★
第一章 计算机系统知识 5~6分
1.CPU的组成
2.数据表示
3.校验码
4.计算机体系结构
5.安全性、可靠性与系统性能评测基础知识
第二章程序设计语言 3~6分
1.程序设计语言的基本成分
2.编译程序基本原理★★★
第三章 数据结构 9分
1.线性结构
2.数组
3.矩阵
4.树 ★
5.图
6.查找
7.排序
第四章 标准化和软件知识产权基础知识 2~3分
第五章 数据库技术基础 6分
1.数据库设计
2.数据库的三级模式结构
持续更新中……
该文章是针对软件设计师的教材+视频教程+历年真题进行整合的备考笔记及备考建议,通过学习该笔记再加上刷题,我平时模考正确率达94%左右【下图为模考记录】,应该对你会有帮助;
我是参加了2024年下半年的考试,一次通过的(基础知识60分,应用技术62分);这次考试基础知识部分比往年真题考查的知识点略偏些(比如Python相关题目占比大了些,不过考的都比较基础,不用太过担心),所以整套试卷做完后发现大部分都加了标注,不太确定,哈哈;多数人反馈这次的应用技术(案例)部分比较简单;
2024年下半年软件设计师真题我整理在另一篇文章里了,有需要的可以去看看;
须知:2023年下半年开始改为机考,考前的几天官方会给出时间熟悉机考系统【建议抽出时间熟悉下,不用所有题都做,重点在于熟悉系统操作方式,尤其是应用技术(案例)题,需要画图】
改成机考后,就不分上下午了,上午连续考试4小时(基础知识2小时+应用技术2小时)。
基础知识答题完成交卷后(可提前半小时交卷)直接进入应用技术答题,单科均需达到45分以上才算通过;
备考建议★★★★★
1.过程规划:
(1)基础知识部分(选择题)
- 先做套真题了解下考点及考察方式;
- 笔记学习:按章节来,每学完一个章节去app上刷对应章节的题;
- 刷题:按章节刷题结束后,开始刷历年真题;开始刷历年真题后记得计时;
- 查漏补缺:错题、易混淆的题、收藏夹里的题;
(2)应用技术部分(案例题)
- 按照题型学习:某站里的视频教程,每学完一个题型,去做几套真题里该题型的题;
- 刷题:按题型刷题结束后,开始刷历年真题;开始刷历年真题后记得计时;
- 总结:总结历年算法题考查类型及答题技巧(算法题有不少人会选择直接放弃,在另外4道题上拿分,但我建议算法题大家最好也准备准备,万一出同类型的题,有备无患,能拿一分是一分,上考场也有底气是不是);
2.纸质资料:
- 教材:可视自己的学习习惯决定买不买,我是买了(官方买的),也挨着看了,不过600+页看完挺费时间的,也不能全部记住,时间紧张的话就别买了;
- 真题、试卷、冲刺...:我买了,但是没看完,软考有对应的题库app,直接手机上刷也比较方便,所以不建议买纸质的;
3.学习路线:
- 基础知识(学习):这篇笔记基础知识部分先过一遍,后续刷题过程中遇到不会的、记不住的随时翻看,不知不觉就记住了;
- 基础知识(刷题):基础知识部分的题刷两遍(尤其是近6年的);软考有对应的题库app,两个软件排版方式有点区别,内容差不多;一个模考记录列表比较直观(上面的模考记录图就是),另一个看不到模考记录;这两个软件我用的频率都很高,哪个功能方便用哪个;
- 基础知识(错题):错题部分一定要多刷几遍(app上有错题本);
- 应用技术(学习):某站里有对应的视频教程,共5道大题,每道题对应一种题型,把对应题型的答题技巧掌握即可;
- 应用技术(刷题):历年真题刷一遍(近6年的吧,重点是学会分析以及答题技巧,如果有时间可以都刷一遍,没坏处);
- 历年高频考点(必背):23种设计模式、排序方式及特点、加密认证、编译原理、知识产权;【这里列出的是超高频的,笔记里的基本都是需要记住的】
重要!!!:刷题时不管是基础知识还是应用技术,尽量养成计时的习惯,尤其是应用技术(案例)部分,每道题尽量别超过20分钟,前期可能达不到这个要求,熟练后就可以了,别太担心;
注:时间就不给大家规划了,每个人的计算机基础不同,知识接受能力不同,根据自身条件各自规划吧,大致1~4个月,战线别拖太长,容易有疲累感;也尽量别裸考,既然决定考了,就认真对待吧,毕竟也是花了心力和财力的(有报名费哈哈);
付出终将有回报,希望那时你也能一次通过~~~
那咱们进入正题↓↓↓
-----基础知识部分↓-----
第一章 计算机系统知识 5~6分
- 计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成;
- 中央处理单元CPU是计算机系统的核心部件,它负责获取程序指令、对指令进行译码并加以执行;
- CPU的功能:程序控制、操作控制、时间控制、数据处理;
- 拓展:CPU依据指令周期的不同阶段来区分在内存中以二进制编码形式存放的指令和数据;
1.CPU的组成
- CPU主要由运算器、控制器、寄存器组合内部总线等部件组成;
(1)运算器
- 组成:算术逻辑单元、累加寄存器、数据缓冲寄存器和状态条件寄存器;
- 主要功能:执行算术运算、逻辑运算并进行逻辑测试;
- 拓展:同或(相同为1,不同为0)、异或(相同为0,不同为1);
① 算术逻辑单元(ALU)
- 负责处理数据,实现对数据的算术运算和逻辑运算;
② 累加寄存器(AC)★★★
- 又称累加器,是一个通用寄存器;
- 功能:当运算器的算术逻辑单元执行算术或逻辑运算时,为ALU提供一个工作区;用于保存运算结果;
- 运算器中至少要有一个累加寄存器;
③ 数据缓冲寄存器(DR)
- 主要作用:作为CPU和内存、外部设备之间数据传送的中转站;作为CPU和内存、外部设备之间在操作速度上的缓冲;
④ 状态条件寄存器(PSW) 【了解】
- 由算术指令运行或测试的结果建立的各种条件码内容;
- 主要分为:状态标志、控制标志;
(2)控制器
- 控制器用于控制整个CPU的工作,它决定了计算机运行过程的自动化。它不仅要保证程序的正确执行,而且要能够处理异常事件;
- 一般包括:指令控制逻辑、时序控制逻辑、总线控制逻辑、中断控制逻辑等部分;
- 控制器包含:指令寄存器、程序计数器、地址寄存器、指令译码器;
①指令寄存器(IR)
- 位数取决于指令字长;
②程序计数器(PC)★★★★★
- 又称为指令计数器;
- 程序执行分两种情况:顺序执行、转移执行(不常见);
- PC中存储的是程序的起始地址,执行指令时,CPU自动修改PC的内容,以便使其总是保存将要执行的下一条指令地址,对于顺序执行而言,修改的过程通常只是简单地对PC加1;
③地址寄存器(AR)
- 保存当前CPU所访问的内存单元的地址;
④指令译码器(ID)
- 指令包含:操作码、地址码;
- 操作码和地址码都应存入指令寄存器中;
- 拓展:在汇编语言中,程序员可以直接访问通用寄存器以存取数据,可以访问状态寄存器以获取有关数据处理的相关信息,可以通过相对程序计数器进行寻址,但是不能访问指令寄存器;
- 拓展:指令寻址方式有以下7种:(前5种记忆,后2种了解即可)
- 拓展:指令系统中采用不同寻址方式的目的是:扩大寻址空间并提高编程灵活性;
2.数据表示
- 计算机中最小的数据单位是位(bit,b);最小的存储单位是字节(Byte,B);
- 进制转换:
- 各种数值再计算机中表示的形式称为机器数,其特点是采用二进制计数制;机器数对应的实际数值称为数的真值;小数点则隐含表示而不占位置;
- 机器数有无符号数和带符号数之分。对带符号数(0为正,1为负),机器数的最高位为符号位,其余表示数值;
- 带符号数科采用原码、反码、补码、移码等编码方法,这些编码方法称为码制;
(1)原码、反码、补码、移码
- 正数的原码、反码、补码均相同;
- 补码可以简化计算机运算部件的设计;
- 负数的反码:除符号位外,其他位均按位取反;
- 负数的补码:反码的末位加1;
- 拓展:已知内存按字节编址区间为X~Y,则其容量为(Y-X+1),单位为字节;
- 在偏移2^(n+1)的情况下,只要将补码的符号位取反即为移码;
- 拓展:
(2)定点数和浮点数
- 机器字长为N时各种码制表示的带符号数的范围:
①定点数
- 分为定点整数和定点小数;
- 当机器数字长为n时,定点数的补码和移码可表示2^n个数,而其原码和反码只能表示2^(n-1)个数(0的表示占用了两个编码);
②浮点数
- 浮点表示法:用阶码和尾数表示浮点数;
- 一个二进制数N可表示的形式为N = 2^E * F,其中E称为阶码,F称为尾数;
- 在浮点表示法中,阶码为带符号的纯整数,尾数为带符号的纯小数;
- 一个数的浮点表示是不唯一的;
- 判断:
- 浮点数的运算要经过对阶、求尾数和(差)、结果规格化并判溢出、舍入处理和溢出判别等步骤;
- 两个阶码不同的浮点数进行运算,需要先对阶,且小阶向大阶对齐,同时将尾数右移n位;
- 浮点数所能表示的数值范围主要由阶码决定,所表示数值的精度由尾数决定;
- 如果浮点数的阶码(包括1位阶符)用R位的移码表示,尾数(包括1位数符)用M位的补码表示,则该浮点数所能表示的数值范围为:
- 浮点数总长度固定,增加E的位数,减少F的位数,可以扩大能表示数的范围,同时降低精度;
- 在总位数相同的情况下,浮点数要比定点数可表示的数值范围更大;
3.校验码
- 计算机系统运行时,为了确保数据在传送过程中正确无误,一是提高硬件电路的可靠性,二是提高代码的校验能力,包括查错和纠错;
- 码距是指一个编码系统中任意两个合法编码之间至少有多少个二进制位不同;
- 码距 =2,只有检错能力;码距 ≥3,才可能有纠错能力;
- 常用的3种校验码:奇偶校验码、海明码、循环冗余校验码;
(1)奇偶校验码
- 只能检错,不能纠错;
- 通过在编码中增加一位校验位来使编码中1的个数为奇数(奇校验)或偶数(偶校验),从而使码距变为2;
- 奇偶校验码可以检测代码中奇数位(奇数个数据位)出错的编码,但不能发现偶数位(偶数个数据位)出错的情况;
(2)海明码
- 海明码是一种利用奇偶性来检错和纠错的校验方法;
- 判断:
- 海明码的构成方法是在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错;
- 设数据位是n位,校验位是k位,则n和k必须满足以下关系:
(3)循环冗余校验码CRC
- 码距 =2,可以检错,但不能纠错;
- CRC由两部分组成:左边的信息码(数据),右边为校验码;
- 利用生成多项式为k个数据位产生r个校验位来进行编码,其编码长度为k+r;
- CRC表示为k个数据位之后跟r个校验位;
- 在求CRC编码时,采用的是模二运算;
- 校验码是由信息码产生的,校验码位数越多,该代码的校验能力越强;
4.计算机体系结构
- VLIW:超长指令字;
- 移位指令中,算术左移指令的操作结果相当于对操作数进行乘2操作;
- 在程序运行过程中,CPU需要将指令从内存中取出并加以分析和执行;CPU依据指令周期的不同阶段来区分在内存中以二进制编码形式存放的指令和数据;
- 指令控制方式有三种:顺序方式、重叠方式、流水方式;
- 吞吐率相关概念:
- 判断:
- 精简指令集计算机(RISC)与复杂指令集计算机(CISC)的区别:
(1)存储系统
①存储器的分类:
- 计算机采用分级存储体系的主要目的是为了解决存储容量、成本和速度之间的矛盾;
- 计算机分级存储体系时,CPU对各层级按访问速度由快到慢排序为:CPU内部通用寄存器、Cache、主存储器(内存)、联机磁盘存储器、、脱机光盘/磁盘存储器;
- 常用的虚拟存储器由主存-辅存两级存储器组成;
- 内存:
- 外存:也称为辅存,如磁盘、磁带、光盘等;
- 只读存储器分类:固定只读存储器(ROM)、可编程只读存储器(PROM)、可擦除可编程的只读存储器(EPROM)、电擦除可编程的只读存储器(EEPROM)、闪速存储器;
- 闪速存储器:简称闪存,特性介于EPROM和EEPROM之间,以块为单位进行删除操作,断电后信息不会丢失,可代替ROM,但不可代替主存;
- 相联存储器是一种按内容访问的存储器;
②高速缓存(Cache)
- 主要由静态随机存储器(SRAM)构成;
- 用来存放当前最活跃的程序和数据,其特点是:位于CPU和主存之间,容量一般在几千到几兆字节之间,速度一般比主存快5~10倍;
- Cache对程序员来说是透明的;
- Cache与主存地址的映射(转换工作)是由硬件自动完成的;
- Cache设计思想是在合理成本下提高命中率;
- Cache容量越大,则命中率越高,随着容量的增加,命中率逐渐接近100%;
- 判断:Cache的设置扩大了主存的容量;【×】 (ps:与主存无关)
- CPU内外常需设置多级高速缓存Cache,主要目的是提高CPU访问主存数据或指令的效率;
- Cache的地址映像方法:直接映像、全相联映像、组相联映像;
- Cache的替换算法:
- (了解)Cache存储器部分用来存放主存的部分拷贝信息;控制部分的功能是判断CPU要访问的信息是否在Cache存储器中,若在即为命中,否则没有命中;命中时直接对Cache存储器寻址;未命中时,要按照替换原则决定主存的一块信息放到Cache存储器的哪一块里;
- (了解)在CPU工作时,送出的是主存单元地址,而应从Cache存储器中读/写信息;这就需要将主存地址准换成Cache存储器的地址,这种地址的转换成为地址映像;
③虚拟存储器
- 由主存和辅存构成;
- 拓展:CPU从内存读取数据时存在两种局部性:时间局部性、空间局部性;
(2)输入/输出技术
- 输入输出控制方式有三种:程序查询方式、中断驱动方式、直接存储器存取方式(DMA);
- 由I/O设备提出的中断请求是可屏蔽中断,电源掉电是不可屏蔽中断;
- 采用DMA方式传送数据时,每传送一个数据都需要占用一个存储周期;
①程序查询方式
- 特点:
②中断驱动方式
- 相关概念:
- 为了便于实现多级中断嵌套,使用堆栈来保护断点和现场最有效;
- (了解)计算机在执行程序过程中,当遇到急需处理的事件时,暂停当前正在运行的程序,转去运行有关服务程序,处理完后自动返回源程序,这个过程称为中断;
- 特点:
③直接存储器存取方式(DMA)
- 特点:
- DMA控制方式是在主存与外设之间直接建立数据通路进行数据的交换处理;
- DMA方式下是由DMA控制器直接控制数据的传送过程,CPU需要让出对总线的控制权,并不需要CPU执行程序指令来传送数据;
- 在由Cache、主存和硬盘构成的三级存储体系中,DMA控制器和CPU发出的数据地址是主存物理地址;
(3)总线结构
- 微机中的总线分为3类:数据总线、地址总线、控制总线;
- 地址总线宽度由内存容量决定,如内存容量为4GB(2^32B),则地址总线宽度为32位;
- 数据总线宽度与字长位数相同;
- 总线的带宽 = 每个时钟周期可传送的数据大小 * 时钟频率,单位:Mbit/s;
- 系统总线用于CPU、内存及外设部件的连接;
- CPU是在一个总线周期结束时响应DMA请求的;
- 计算机系统中采用总线结构,可以减少信息传输线的数量;
- 总线复用方式可以减少总线中信号线的数量;
- 专用总线在设计上可以与连接设备实现最佳匹配;
- 单总线结构在一个总线上适应不同种类的设备,设计简单、通用性强,但无法达到高的性能;
- 常见的总线有:ISA总线、EISA总线、PCI总线、PCI Express总线、前端总线、RS-232C、SCSI总线、SATA、USB、IEEE-1394、IEEE-488总线;
- PCI总线:并行内总线;
- SCSI总线:并行外总线; (SCSI:小型计算机系统接口)
- 并行总线适合近距离高速数据传输,串行总线适合长距离数据传输;
5.安全性、可靠性与系统性能评测基础知识
- 主动攻击(直接使数据变化)包含:重放、IP地址欺骗、拒绝服务、分布式拒绝服务DDOS、系统干涉、修改数据命令、信息篡改、资源使用、欺骗、伪装;
- 被动攻击(监听分析)包含:流量分析、会话拦截、嗅探、信息收集;
- 认证处理被动攻击;加密处理被动攻击;
- SQL注入是常见的Web攻击,直接有效的防护措施包括:
(1)加密技术 ★★★★★ 【防止窃听】
- 加密技术分类:对称加密技术、非对称加密技术、混合加密技术;
①对称加密(私有密钥加密)
- 特点:密钥分发有缺陷;加密/解密速度快;适合加密大量明文数据;
- 文件加密和解密使用相同的密钥;
- 对称加密算法:又称私钥算法、私有密钥加密算法、共享密钥加密算法;
- 常用的对称加密算法有:数据加密标准算法(DES)、三重DES(3DES或TDEA)、RC-5、RC-2、RC-4、国际数据加密算法(IDEA)、高级加密标准算法(AES)、SM1、SM4;
- AES是一个迭代的、对称密钥分组的密码;
②非对称加密(公开密钥加密)
- 特点:密钥分发没有缺陷;加密/解密速度很慢;
- 用接收方的公钥加密明文,可以实现防止窃听的效果;
- 非对称加密算法:又称非对称密钥算法、公钥算法、公开密钥加密算法;
- 非对称加密算法需要两个密钥:公开密钥和私有密钥;用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;用私钥加密,只有用对应的公钥才能解密;
- 非对称加密算法有:RSA、DSA、ECC、DH、SM2、ELGamal;
③混合加密
- 是指对实际明文数据使用对称加密,然后将加密后的数据连同对称密钥一起用非对称加密算法进行加密,进行传输;
- 特点:适合大数量明文加密;
(2)认证技术 ★★★★★
- 公钥体系中,私钥用于解密和签名,公钥用加密和认证(验证);
- 私钥不可在网络中传输,否则会导致泄密;
- PKI体制中,保证数字证书不被篡改的方法是用CA(权威机构)的私钥对数字证书签名;
- 两个CA机构想要相互信任,首先要互换公钥;
- 发送方用CA私钥对数字证书加密,接收方用CA公钥解密;
- 某网站向CA申请了数字证书,用户通过CA的签名来验证网站的真伪;
- 用户向CA机构申请数字证书,将个人信息和公钥发给CA机构,CA机构颁给用户数字证书,数字证书用CA的私钥进行签名(加密),用CA的公钥验证(解密)数字证书,得到用户的公钥;
- 数字证书的作用:防止假冒;
- 数字签名的作用:防止否认;
- 数字签名:是对网络安全真实性的保护,接收者无法伪造或篡改消息;
- 用户A和B进行网络安全通信,使用数字证书来对用户的身份进行认证,使用数字签名确保消息不可否认;
- 信息摘要的作用是防止篡改;将发送的明文进行Hash算法后得到的摘要放在密文后一起发送过去,与接收方解密后的明文进行相同的Hash算法得到的摘要进行对比,若一致,则没被篡改,否则有篡改;
- MD5摘要算法可以防止报文被篡改;
- MD5以512位分组来处理输入的信息,生成一个128位散列值;
- SHA-1安全散列算法:又称为安全哈希算法,是一种数字签名算法,其特性是:不可以从消息摘要中复原信息,两个不同的消息不会产生同样的消息摘要;
(3)计算机可靠性模型
- 常见的系统可靠性数学模型有:串联系统、并联系统、N模冗余系统;
第二章程序设计语言 3~6分
- 计算机硬件只能识别由0和1组成的机器指令序列,即机器指令程序。
- 机器语言和汇编语言为低级语言;
- 更适合用来开发操作系统的编程语言是C/C++;
- Lisp是函数式编程语言,Prolog是逻辑式程序语言,Python支持过程式编程和面向对象编程,Java/C++是面向对象的编程语言;
- 敏捷开发方法SCRUM的步骤:Product Backlog(产品待办事项清单)、Sprint Backlog(Sprint待办事项清单)、Sprint(冲刺迭代);
- Python语言的特点:跨平台、开源、支持面向对象程序设计、支持动态编程,是一种解释型的脚本语言;
- Python中:元组(不可变/有序/可重复)、字符串(不可变)、数字(不可变)、字典(可变/无序/不可重复)、列表(可变/有序/可重复)、集合(可变/无序/不可重复);
- Python语言模块中深度学习的主要框架:TensorFlow、Keras和Pytorch;
- 程序运行时的用户内存空间一般划分为代码区、静态数据区、栈区、堆区,其中栈区和堆区也称为动态数据区,全局变量的存储空间在静态数据区;
- 栈区一般在进行函数调用和返回时由系统进行控制和管理。堆区由用户在程序中根据需要申请和释放;
- 标记语言常用于描述格式化和链接;
- 若一个程序语言可以提供链表的定义和运算,则其运行时的数据空间必须采用堆存储分配策略;
1.程序设计语言的基本成分
- 高级程序设计语言不依赖于具体的机器硬件;
- 程序设计语言的基本成分包括:数据、运算、控制和传输等;
(1)数据成分
- 在源程序中,可由程序员为变量、函数和数据类型等命名;
- 程序中局部变量的值在运行时可以改变;
- 变量具有对应的存储单元,常量则没有;
- 许多程序设计语言规定,程序中的数据必须具有类型,其作用是:
(2)控制部分
- 程序的三种基本控制结构是:顺序、选择、循环;
(3)函数
- 声明形式:
- 定义形式:
- 调用形式:
- 函数调用时实参与形参间交换信息的方法有:值调用和引用调用;
①值调用(Call by Value)
- 若实现函数调用时将实参的值传递给相应的形参, 则称为是传值调用。
- 将实参的值传递给形参,实参可以是变量、常量和表达式。
- 不能实现形参和实参间双向传递数据。
②引用调用(Call by Reference)
- 当形式参数为引用类型时,函数中对形参的访问和修改实际上就是针对相应实参所做的访问和改变。
- 将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式。
- 可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值。
2.编译程序基本原理★★★
- 语言之间的翻译基本方式为汇编、解释、编译;
- 如果源程序是用某种高级语言编写的,则需要对应的解释程序或编译程序对其进行翻译;
- 解释器:翻译源程序时,不生成独立的目标程序,解释程序和源程序要参与到程序的运行过程中;
- 编译器:翻译时将源程序翻译成独立保存的目标程序,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的运行过程;
- 与编译器相比,解释器需参与运行控制,程序执行的速度慢;
- 脚本语言在维基百科上被定义为‘为了缩短传统的编写-编译-运行过程而创建的计算机编程语言;
- 脚本语言属于动态语言,其程序结构可以在运行中改变;
- 脚本语言主要采用解释方式实现;
- 在对高级语言源程序进行编译的过程中,为变量分配存储单元所用的地址是逻辑地址,程序运行时再映射为物理地址;
- 用C/C++语言为某个应用程序编写的程序,经过预处理、编译、汇编、链接后形成可执行程序;
- 编译程序的工作过程分为6个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成;【前3个阶段不可省略,顺序不可变,‘中间代码生成/代码优化’可省略】
- 解释程序的工作过程分为3个阶段:词法分析、语法分析、语义分析;
- 已知某高级语言源程序A经编译后得到机器C上的目标程序B,则对B进行反编译,不能还原出源程序A;
(1)词法分析
- 输入为源程序,输出为记号流。
- 该阶段的主要作用是:分析构成程序的字符及由字符按照构造规则生成的符号是否符合程序语言的规定;
- 词法分析将源程序看作一个线性字符序列进行分析;
- 可检测的错误类型:单词拼写错误、非法字符(如:~.@);
(2)语法分析
- 输入为记号流,输出为语法树(分析树);
- 该阶段的主要作用是:对各条语句的结构进行合法性分析,分析程序中的句子结构是否正确;
- 该阶段可以发现程序中的 所有语法错误 ;
- 语法分析可以确定变量是否定义(或声明);
- 可检测的错误类型:括号不配对、分号缺失、表达式不完整、缺少必要的标点符号、关键字输入错误、数据类型不匹配、循环或选择语句的关键字不匹配等;
(3)语义分析
- 输入为语法树(分析树);
- 该阶段的主要作用是进行类型分析和检查;
- 该阶段不能发现程序中所有的语义错误;
- 该阶段可以发现静态语义错误,不能发现动态语义错误,动态语义错误在运行时才能被发现;(例:语义分析可以确定变量的值是否正确;)
(4)中间代码生成
- 与具体的机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码。
- 因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性;
(5)目标代码生成
- 该阶段的工作与具体的机器密切相关;
- 寄存器的分配工作处于目标代码生成阶段;
- 中间代码可以跨平台;
- 常见的中间代码:后缀式、三地址码、三元式、四元式和树(图)等形式。
(6)符号表
- 作用:不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,以辅助语义的正确性检查和代码生成;
- 编译过程中,对高级语言程序语句的翻译主要考虑声明语句和可执行语句。对声明语句,主要是将所需要的信息正确地填入合理组织的符号表中;对可执行语句,则是翻译成中间代码或目标代码;
(7)词法分析工具
①正规式
- 运算符:
- 正规式与正规集示例:
②有限自动机
- 它能准确地识别正规集;
- 分类:确定的有限自动机(DFA)、不确定的有限自动机(NFA);
(8)语法分析方法
- 根据产生语法树的方向,语法分析方法分类为:自底向上、自顶向下;
①上下文无关文法
- 该方法被广泛地用于表示各种程序设计语言的语法规则;
②自顶向下分析法
- 常见方法:递归下降分析法、预测分析法;
③自底向上分析法
- 又称为:移进-归约分析法,其数学模型是下推自动机;
- 常见方法:算符优先分析法、LR分析法;
(9)语法制导翻译和中间代码生成
- 程序设计语言的语义分为:静态语义、动态语义;
- 语法制导翻译是静态语义分析方法;
- 后缀式特点:
- 拓展:
第三章 数据结构 9分
1.线性结构
- 是一种逻辑结构,主要用于对具有单一前驱和后继的数据关系进行描述;
- 特点:数据元素之间呈现一种线性关系,即元素“一个接一个排列”;
(1)线性表
- 主要的基本操作:插入、删除、查找等;
- 一个线性表是n(n≥0)个元素的有限序列;
- 非空线性表的特点:
- 线性表的存储结构分为:顺序存储、链式存储;
①顺序存储
- 特点:查询速度快,插入/删除速度快;
- 线性表的顺序存储是指用一组地址连续的存储单元依次存储表中数据元素,从而使逻辑上相邻的两个元素在物理位置上也相邻。(元素间的逻辑关系无须占用额外的空间)
- 优缺点:
- 顺序存储时,各操作对应时间复杂度为:
②链式存储
- 若结点中只有一个指针域,则称为线性链表(单链表);
- 单链表各操作对应时间复杂度为:(带不带头结点的时间复杂度一样)
- 对于线性表,相对于顺序存储,采用链表存储的缺点是数据元素之间的关系需要占用存储空间,导致存储密度不高;
- 采用顺序表和单链表存储长度为n的线性序列,根据序号查找元素,其时间复杂度分别为:O(1)、O(n);
- 循环链表(特点):可以从表中任意结点开始遍历整个链表;
(2)栈和队列
- 拓展:
①栈 (后进先出)
- 实现函数过程或过程的递归调用及返回处理时必须用栈;
- 栈的典型应用包括:表达式求值、括号匹配;
- 若用单链表作为栈的存储结构,并用头指针作为栈顶指针,则入栈和出栈操作都不需要遍历链表;
②队列 (先进先出)
- 队尾指针指向队尾下一个位置;
- 队列的数据规模确定时,采用顺序存储比链式存储效率更高;
- 单循环链表队列中入队和出队都不需要遍历链表;
- 单循环链表队列只需设置队尾指针就可以使入队和出队操作的时间复杂度为O(1);
- 循环队列的优点是:入队和出队都不需要移动队列中的其他元素;
- 循环队列:队头指针head,队尾指针rear,容量为M,当前队列长度为len,则:
③串 (下标从1开始)
- 仅由字符构成的有限序列,记为S='a1,a2,...,an',S为串名;
- S为长度n的非空字符串,则其互异的非平凡子串(非空且不同于S本身)个数为:(n+2)(n-1)/2;
- 子串的定位操作称为串的模式匹配;
- 设n为主串长度,m为子串长度(n>m>0),则模式匹配时匹配成功时:
- 改进的模式匹配算法又称为KMP算法;
- 串的前缀:包含第一个字符且不包含最后一个字符的子串;串的后缀:包含最后一个字符且不包含第一个字符的子串;
- 第i个字符的next = 从1~i-1串中最长相等前后缀长度+1;(特殊:next[1] = 0,next[2] = 1)
2.数组
- 数组适合采用顺序存储结构;
- 二维数组的存储结构可分为:以行为主序、以列为主序;
- 设:Loc为第一个元素的首地址,L为元素占用内存大小,n为行数,m为列数,ai为第i个元素的首地址,则不同情况下ai值为:
3.矩阵
- n阶对称矩阵:矩阵An*n中的元素特点为aij=aji(1≤i,j≤n);
- 以行为主序存储下三角(包括对角线)中的元素,则一维数组B[k](1≤k<n(n+1)/2)与矩阵元素aij(aji)的关系为:
- 以列为主序将n阶三对角An*n的非0元素aij存储在一维数组B[k]中,则元素位置之间的对应关系为:k = 2i + j - 2 , (1≤i,j≤n);
- 稀疏矩阵的三元组表的顺序存储结构称为三元组顺序表,常用的三元组表的链式存储结构是十字链表;
- 三元组顺序表与十字链表是对稀疏矩阵的压缩存储方式;
4.树 ★
- 树是非线性结构;
- 在任一非空树中(n>0),有且仅有一个根结点;
- 相关概念:
- 树的性质:
- 拓展:度为0的结点个数记为n0,度为k的结点个数为nk,树中仅有n0和nk,则:n0+nk = n;nk*k+1=n; => n0 = [n(k-1)+1]/k;
- 拓展(经典问题):
(1)二叉树
- 二叉树中的结点要区分左子树和右子树;
- 二叉树结点最大度为2;
- 二叉树具有递归性质;
- 具有n个结点的二叉树,有C(2n,n)/(n+1)种形态;
- 二叉树的性质:
(2)二叉树的存储结构
- 分为两种:顺序存储、链式存储;
- 假设某二叉树共有n个结点,采取顺序存储,存在编号为i的结点,则有以下性质:
- 在最坏情况下,一个深度为k且只有k个结点的二叉树(单支树)需要2^k-1个存储单元;
- n个结点的二叉树存在n-1个分支,则:
(3)二叉树的遍历
- 常用的4种递归遍历方法:
(4)二叉树类别
-
满二叉树、完全二叉树、平衡二叉树、二叉排序树、最优二叉树、线索二叉树;
-
当二叉树的结点数目确定时,完全二叉树的高度一定是最小的;
-
一般二叉树适合采用链式存储,完全二叉树适合采用顺序存储;
①平衡二叉树
-
特点:二叉树中任一结点的左右子树高度之差的绝对值不超过1;
-
推论:完全二叉树一定是平衡二叉树,反之不成立;
②二叉排序树(二叉查找树、二叉检索树)
- 特点:根结点的关键字小于左子树中所有结点的关键字,小于右子树中所有结点的关键字;
注:中序遍历二叉排序树得到的序列是有序序列;
- 使用二叉排序树进行查找时,查找效率最差的是单支树,此时查找效率与树的高度有关;
③线索二叉树
- 作用:保存结点在任一序列(先序、中序、后续遍历得到的序列)中的前驱和后继信息;
④最优二叉树 (哈夫曼树)
- 是一类带权路径长度最短的树;
- 特点:
- 构造哈夫曼树的注意事项:
- 哈夫曼树不唯一,但树的带权路径长度WPL唯一;
- 英文字符集中的26个字符可采用5位二进制位串表示;
- 哈夫曼编码是基子贪心策略的;
5.图
- 图中一个结点的前驱和后继结点的数目是沒有限制的;
- 无向完全图:无向图中有n个顶点,每一个顶点均与其他n-1个顶点有边;
- 无向完全图n个顶点,共有n(n-1)/2条边;
- 有向完全图n个顶点,共有n(n-1)条弧;
- 顶点的度 = 入度+出度;
- 有向图或无向图的总度数 = 2e;
- 第一个项点和最后一个顶点相同的路经称为回路或环;
- 简单路径:路经上除了 Vp和Vq可以相同外,其余顶点均不相同;
- 无向连通图最少n-1条边,最多n(n-1)/2条边;
- 有向连通图最少n条边,最多n(n-1)条边;
(1)图的存储结构
- 两种:邻接矩阵、邻接链表;
- 邻接矩阵中 两结点有边或Vi到Vj有弧,则为1,否则为0;
- 有向图的邻接矩阵不一定是对称的,无向图的邻接矩阵一定是对称的;
- 邻接矩阵中非0元素个数在有向图中有e个(e为弧数);在无向图中有2e个(e为边数);
- 邻接矩阵适合存储稠密图;
- 邻接链表适合存储稀疏图;
- 边(或弧)带权值的图称为网;
- 邻接表中结点后方挂接的结点个数为当前结点的出度;
- 逆邻接表中结点后方挂接的结点个数为当前结点的入度;
(2)图的遍历
- 遍历方法:深度优先搜索DFS、广度优先搜索BFS;
①深度优先搜索DFS 采用递归思想
- 使用邻接矩阵表示图时,遍历图的时间复杂度为O(n^2);
- 使用邻接表表示图时,遍历图的时间复杂度为O(n+e);
②广度优先搜索BFS 采用队列思想 适合采用分支界限算法
- 时间复杂度同DFS;
(3)最小生成树
- 常用的最小生成树求解算法有:普里姆(Prim)算法、克鲁斯卡尔(Kruskal)算法;
- Prim适合稠密图, Kruskal适合稀疏图;
- 两种算法得到的最小生成树不一定是一致的;
- 无向连通图的最小生成树中,顶点数恰好比边数多1;
(4)AOV网
- 对AOV网进行拓扑排序的方法如下:
- 在有向无环图G的拓扑序列中,顶点Vi在Vj之前,则:
(5)关键路径
- 在从源点到汇点的路径中,长度最长的路径称为关键路径;
6.查找
- 关键字:数据元素(或记录)的某个数据项的值;
- 对于含有n个记录的表,查找成功时的平均查找长度定义为:
(1)静态查找方法
- 包含:顺序查找、折半(二分)查找、分块查找;
①顺序查找
- 不要求表中元素有序,最多比较的次数:n;
- 顺序存储和链式存储的查找表均适合用顺序查找方法;
- 顺序查找成功的平均查找长度为ASLss=(n+1)/2;
②折半查找(二分查找)
- 要求表中元素有序(递增);
- 该方法仅适用于顺序存储结构;
- 折半查找最多比较的次数:log2n(下取整) + 1;
- 折半查找过程中关键字的比较序列的特点:大大大大...、小小小小...、大小大小...、小大小大...,满足其中一种(不一定所有序列都能符合该特点);
- 对序列进行折半查找的过程符合平衡二叉树的形态特点;
- 折半查找mid=(l+r)/2 (下取整); l:首元素下标,r:尾元素下标;
- 折半查找的平均查找长度为:ASLbs≈log2(n+1)-1;
(2)动态查找方法
- 包含:二叉排序树、平衡二叉树、B树、哈希表;
(3)哈希表
- 对某个哈希函数H和两个关键字K1和K2,若K1≠K2,而H(K1) = H(K2),则称为冲突;
- 具有相同哈希函数值的关键字对该哈希函数来说称为同义词;
- 冲突只能尽可能减少,而不能完全避免;
- 常用的哈希函数构造方法:直接定址法、数字分析法、平方取中法、折叠法、随机数法、除留余数法等;
- 哈希函数应具有较好的散列性,以尽可能减少冲突;
- 在构造哈希函数时,一般都要对关键字进行计算,且尽可能使关键字的所有组成部分都能起作用;
- 除留余数法哈希函数:H(key) = key%m = 地址,其中,若共n个元素,则m取值一般为接近n但不大于n的质数(只能被1和它本身整除);
- 哈希表和二叉排序树都可以在查找过程中动态创建,属动态查找表;
①冲突处理方法
- 开放定址法:Hi=(H(key)+di)%m,di为常见的增量序列;
- 链地址法;
- 再哈希法;
②哈希表的查找
- 查找过程中需要和给定值进行比较的关键字的个数取决于3个因素:哈希函数、冲突处理方法、哈希表的装填因子;
- 哈希表的装填因子a定义为:a=表中装入的记录数/哈希表的当度;
- a越小,发生冲突的可能性越小;
7.排序
- 若待排序序列中存在Ri与Rj的关键字相同,排序前后Ri与Rj的次序不变,则称该排序方法是稳定的,否则是不稳定的;
(1)直接插入排序 插入排序、稳定、不可归位
- 排序思想:插入第i个元素时,前R1...Ri-1已排好序,此时将Ri依次与Ri-1...R1进行比较,找到相应的插入位置并插入Ri,插入位置及其后的元素依次向后移动;
- 该排序方法是局部有序,在排序完成前的每次排序都不能确定任一元素的最终位置;(该特性称为不可归位)
- 该方法适合对基本有序的序列进行排序;(最好情况)
(2)希尔排序 插入排序、不稳定、不可归位
- 排序思想:Ri与若干组Ri+di进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序;(di<di-1)
(3)简单选择排序 选择排序、不稳定、可归位
- 排序思想:第i次排序,将Ri与剩余未排序的所有元素比较,找出最小值放在位置i处;
- 拓:优先序列通常采用堆实现,向优先队列中插入一个元素的时间复杂度为O(log2n);
(4)堆排序 选择排序、不稳定、可归位
- 构建堆数,大顶堆特点:根结点最大,从上至下从左至右得到的序列可确定第1个元素为最大值,将第1个元素与最后一个元素交换,最后一个元素的位置确定,剥离未排序列,剩余元素再次调整为大顶堆,重复上述过程,直到所有元素为止确定,得到一个递增序列;
(5)冒泡排序 交换排序、稳定、可归位
- 排序思想:将第i个元素依次与剩余元素比较,最终最后一个位置是序列中的最大值,将该值剥离未排序序列,剩余元素重复上述过程,直到所有元素位置确定,得到一个递增序列;
(6)快速排序 交换排序、不稳定、可归位 基于分治思想
- 排序思想:取第1个元素为枢轴记录,经过一轮排序后,枢轴元素位于中间位置,左侧序列的元素值均小于它,右侧序列的元素值均大于等于它,然后对左右两侧的序列再次使用快速排序,直到所有元素为止确定;
- 对基本有序的序列是该排序方法的最坏情况;
(7)归并排序 稳定、不可归位 基于分治思想
- 排序思想:将n个元素划分为n/2组,然后将每个组再划分成n/2组,直到每组只含一个元素,然后逆向归并,先归并为两个元素一组,然后归并为4个元素一组,每次归并后保证组内元素递增排序,直到所有元素为一个有序递增序列;
- 拓展:序列中元素值仅为0~9之间的数字则适用于计数排序;
- 7种排序算法的时间/空间复杂度、稳定性:
第四章 标准化和软件知识产权基础知识 2~3分
- 知识产权也称为智慧财产权;
- 知识产权可分为工业产权和著作权两类;
- 工业产权包括:专利、实用新型、工业品外观设计、商标、服务标记、厂商名称、产地标记或原产地名称、制止不正当竞争等;
- 著作权:也称版权,是指作者对其创作的作品享有人身权和财产权;
- 人身权包括:发表权、署名权、修改权、保护作品完整权等;
- 发表权:保护时间受限;
- 署名权、修改权、保护作品完整权:保护时间不受限(权利永久有效);
- 除去人身权的四种,其他均属于财产权(保护时间受限);
- 知识产权具有严格的地域性特点,即各国主管机关依照本国法律授予的知识产权,只能在其本国领域内受法律保护,如:外国人在我国领域外使用中国专利局授权的发明专利,不侵犯我国专利权;
- 著作权受地域限制;
- 我国发明专利的保护期为20年,实用新型专利权和外观设计专利权的期限为10年,均自专利申请日起计算;
- 我国公民的作品发表权的保护期为作者终生及其死之后的50年;
- 我国商标权的保护期限自核准注册之日起10年内有效,但可以根据其所有人的需要无限地延长权利期限,在期限届满前6个月内申请续展注册,每次续展注册的有效期为10年,续展注册的次数不限;
- 软件商标权的权利人是指软件注册商标所有人;
- 商标权:
- 专利权
- 专利法明确规定,智力活动的规则和方法不取得专利权;通常,智力活动规则和方法是一些人为的规则,如管理规则、游戏规则、统计方法、分类方法和计算方法等;
- 软件许可使用的三种形式:
- 烟草类商品必须使用注册商标;
- 各类知识产权可保护的内容为:
1.计算机软件著作权
- 保护计算机软件著作权的两个法律文件是:《中华人民著作权法》(简称《著作权法》)、《计算机软件保护条例》;
①计算机软件著作权的主体
- 是指享有著作权的人;
②计算机软件著作权的课题
- 是指著作权法保护的计算机软件著作权的范围(受保护的对象);
- 著作权法保护的计算机软件包括:计算机源程序、计算机目标程序、软件文档;
- 软件文档一般以程序设计说明书、流程图和用户手册等表现;
- 软件盗版行为是指任何未经软件著作权人许可,擅自对软件进行复制、传播,或以其他方式超出许可方位传播、销售和使用的行为;
- 《计算机软件保护条例》是国务院颁布的,用来保护软件著作权人的权利;
- 用户购买了具有版权的软件,则具有对该软件的使用权,但不具有复制权;
③《中华人民共和国著作权法》
- 规定软件作品享有两类权利:软件著作权的人身权(精神权利)、软件著作权的财产权(经济权利);
- 《计算机软件保护条例》规定,软件著作权人享有发表权和开发者身份权;
- 开发者身份权又称署名权,该权利不随软件开发者的消亡而丧失,且无时间限制;
- 计算机软件的著作财产权包括:使用权、复制权、修改权、发行权、翻译权、注释权、信息网络传播权、出租权、使用许可权和获得报酬权、转让权;
- 翻译权:将原软件从一种自然语言文字转换成另一种自然语言文字的权利;
④计算机软件著作权
- 权利自软件开发完成之日起产生,保护期为50年,保护期满,除开发者身份权外,其他权利终止;
⑤计算机软件著作权的归属
- 职务软件作品是指公民在单位任职期间为执行本单位工作任务所开发的计算机软件作品;即公民在单位任职期间所开发的计算机软件,若是执行本职工作的结果,则该软件的著作权属于该单位,开发者仅有署名权;
- 雇员机型本职工作以外的软件开发创作,必须同时满足以下三个条件,雇员个人才享有软件著作权:
⑥委托开发的软件著作权归属
- 接受他人委托开发的软件,其著作权的归属由委托者与受委托者签订书面合同约定;若无合同约定,其著作权由受托人享有;
⑦计算机软件侵权行为
2.计算机软件的商业秘密权
- 《反不正当竞争》中商业秘密定义为:“指不为公众所知悉的、能为权利人带来经济利益、具有实用性并经权利人采取保密措施的技术信息和经营信息。”
①专利申请的原则
- 专利申请人及其代理人在办理各种手续时都应当采用书面形式;
- 一份专利申请文件只能就一项发明创造提出专利申请;(一份申请一项发明)
- 两个或两个以上的人分别就同样的发明创造申请专利的,专利授权给最先申请人;
- 总结:
第五章 数据库技术基础 6分
1.数据库设计
- 一般策略:自顶向下、自底向上;
- 数据库设计的步骤分为4个阶段(新奥尔良法):用户需求分析、概念设计、逻辑设计、物理设计;
- 各阶段功能:
- 需求分析是逻辑设计和物理设计以及应用程序设计的依据;
- 需求分析阶段的成果是系统需求说明书,主要包括数据流图、数据字典、需求说明文档、各种说明性文档、统计输出表、系统功能结构图等;
2.数据库的三级模式结构
- 数据库系统体系结构采用‘三级模式和两级映像’;
(1)三级模式
- 概念模式、外模式、内模式;
①概念模式(模式)
- 对应‘基本表’;
- 一个数据库只有一个概念模式;
②外模式(用户模式或子模式)
- 对应‘视图’;
③内模式(存储模式)
- 对应‘存储文件’;
- 一个数据库只有一个内模式;
- 内模式定义所有的内部记录类型、索引和文件的组织方式;
- 拓:如果对数据库的一张表创建聚簇索引,改变的是数据库的内模式;
(2)两级映像
- 数据库系统在三级模式之间提供了两级映像:模式/内模式映像、外模式/模式映像。
- 保证了数据库中的数据具有较高的逻辑独立性和物理独立性。
- 数据的物理独立性和逻辑独立性分别是通过修改模式与内模式之间的映像、外模式与模式之间的映像来完成的;
3.数据模型
- 最常用的数据模型分为概念数据模型、基本数据模型;
- 概念数据模型:又称信息模型,主要用于数据库设计,最常见的一种是实体-联系模型(E-R模型);
(1)数据模型三要素
- 三要素:实体、联系、属性;
①实体
- 用矩形表示,矩形框内写实体名;
- 实体是现实世界中可以区别于其他对象的‘事件’或‘物体’;
- 分类:
②联系
- 用菱形表示;
- 指:实体之间的对应关系;
- 用无向边分别于有关实体连接起来,在无向边旁标注联系类型:1:1, 1:n, n:m;
③属性
- 用椭圆表示;
- 指实体某方面的特性;
- 分类:
- 数据模型,又称结构数据模型,常见的有:层次模型(如:树状结构)、网状模型、关系模型、面向对象模型;
(2)关系模型
- 用表格结构表达实体集之间的联系;
- 关系模型是由若干个关系模式组成的集合;
- 一个关系模式相当于一个记录型,关系是一个实例,也是一张表;
- 基本术语:
4.关系代数
(1)相关名词
(2)完整性约束
- 分类:实体完整性、参照完整性、用户定义完整性;
- 实体完整性:关系中主码的值不能为空或部分为空;
- 参照完整性:针对外键;
- 用户定义完整性:指用户对某一具体数据指定的约束条件进行检验;
(3)5种基本的关系代数运算
- 包括:并、差、笛卡尔积、投影、选择;
①并
- R∪S:R与S所有元素合并(去重);
②差
- R-S:从R中去掉术语S的元素;
③笛卡尔积
- R×S:列数n+m,行数n×m;
④投影
- πA(R):从R中取出A列;
⑤选择
- σ1>3(R):从R中选出第1列值大于第3列值的元组;
⑥连接
- 分类:θ连接、等值连接、自然连接;
- 连接运算是从两个关系的笛卡尔积中选出满足条件的元组;
- 表现形式:
⑦外连接
- 分类:左外连接、右外连接、全外连接;
- 全外连接:将左外和右外新生成的元组均并入新关系;
5.SQL
- 分类:数据查询语言DQL、数据定义语言DDL、数据操纵语言DML、数据控制语言DCL;
(1)数据定义语言DDL
- 包括对表、视图、索引的创建和删除;
①创建表
- create table 表名(列名 数据类型,...,完整性约束,...)
- 完整性约束主要有3种子句:主键(primary)、检查(check)、外键(foreign key);
②修改表
- alter table 表名[add 新列名 数据类型 [完整性约束]] [drop 完整性约束][modify 列名 数据类型];
③删除表
- drop table表名;
④创建索引
- create [unique][cluster] index 索引名 on 表名(列名 [次序]...);
⑤删除索引
- drop index 索引名;
⑥创建视图
- 视图是一个或者多个基本表或视图中导出的虚拟表;
- create view 视图名(列表名) as select 查询子句 [with check option];
- 通常子查询中不含order by 和 distinct;
- with check option:进行增删改操作时,保证操作的行满足视图定义中的条件(子查询中的条件表达式);
⑦删除视图
- drop view 视图名;
(2)数据控制语言DCL
①授权