目录
- 前言
- 考前学习
- 宏观
- 什么是软考
- 涉及的知识范围
- 软考整体导图总结
- 微观
- 我的分享——希尔排序
- 学习过程
- 结构化
- 做题
- 考试阶段
- 确定
- 不确定
- 考后总结
前言
作为一名中级软件设计师,考试是衡量自己技能和水平的一项重要指标。在备考和考试过程中,我通过总结经验和教训,在提高自己的同时,也为后来者提供一些参考。
考前学习
下面对中级软件设计师的学习从宏观和微观两点来给大家讲解,请大家耐心观看。
宏观
什么是软考
软考全称“计算机技术与软件专业技术资格(水平)考试”,由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试,设置了27个资格包括初级、中级、高级三个级别。本博主此次考的是软考下的中级软件设计师。
涉及的知识范围
中级软件设计师整本书的内容可以用一个字来形容——“广”,他涵盖了计算机专业的所有专业科目,包括《计算机网络原理》、《操作系统概论》、《数据库系统原理》、《数据结构导论》、《信息系统开发与管理》、《管理经济学》、《C++程序设计》等。在考此证书前,你需要有计算机专业的基本能力。
软考整体导图总结
微观
我的分享——希尔排序
希尔排序(Shell’s Sort)是插入排序的一种,是插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。——百度百科
插入排序性能低的原因分析:插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
希尔排序的思想逻辑:
- 先分组:找到一个间隔,每隔一定的间隔把这些元素排成一组(在希尔排序当中对间隔没有明确的要求,可以任意找间隔,通常会取总长度的一半)
- 对组内元素进行插入排序
- 重新设置间隔、分组,在原来的间隔基础之上减半
- 组内元素排序
- 直到间隔为1,间隔为1以为着所有的元素为一组,此时进行最后一次组内排序
代码实现:
public class ShellSort {
public static void main(String[] args){
int[] array={3,5,9,2,4,7};
System.out.println("排序之前:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
//希尔排序
int[] arraySort = shellSort(array);
System.out.println("\n排序之后:");
for(int i=0;i<arraySort.length;i++){
System.out.print(arraySort[i]+" ");
}
}
public static int[] shellSort(int[] arr){
//1.先定义间隙大小 第一次分组一般是数组长度的一半
int step= arr.length/2;
//2.直到间隙为1时结束循环
while (true) {
//我想要干什么?怎么干?
for(int start=0;start<step;start++){
quickSort(arr, step, start);
}
//间隙减半,两种情况——偶数、奇数
if(step%2==0){
step=step/2;
}else {
if(step !=1){
step=step/2+1;
}else{
break;
}
}
}
return arr;
}
/*
* @Author:ET_momo
* CreateTime: 2023/4/26 9:01
* @param: arr是int类型的数组,要进行排序的数组;step是间隙;start是起始索引。
* @return: 排好序的
*/
public static void quickSort(int[] arr,int step,int start){
//2.外循环:遍历索引为位置的元素进行排序 i代表待插入元素的索引
for (int i = start; i < arr.length; i+=step) {
//3.内循环:相邻的两个数进行比较,左边数(j)大于右边数(j+1)才进行交换。 j是已排序区域的元素索引
for(int j=i-step;j>=0;j-=step){
//判断左边数是否大于右边数
if(arr[j]>arr[j+step]){
//定义一个int类型的变量暂时存放数据
int temp=arr[j];
arr[j]=arr[j+step];
arr[j+step]=temp;
}
}
}
}
}
学习过程
结构化
按照整体的软考计划,制定自己每周的计划,每天以PDCA的形式来对自己的学习内容进行归纳总结和提升。
知识分类总结:
一、系统开发基础
1.1.以多维度表格的形式总结了软件开发模型,如下图所示:
1.2.系统测试中的白盒测试的几种测试方法容易混淆,也做了二维表上的区分,如下图所示:
二、面向对象技术
23种设计模式三种分类:创建型、结构型和行为型,每种类型的设计模式都有不同的目标和应用场景。创建型模式关注对象的创建过程,它们提供了一种更灵活的方法来创建对象,从而降低了对象之间的耦合性;结构型模式关注对象之间的组合,旨在提供一种更灵活的方法来设计软件结构;行为型模式关注对象之间的通信,旨在提供一种更灵活的方法来实现对象间的交互。
三个类型模式的具体分类:
- 创建型模式(公园丑单狗)为工厂方法模式、原型模式、抽象工厂模式、单例模式、构建器模式。
- 结构型模式(石桥组装外箱带)有适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。
- 行为型模式:模板方法模式、解释器模式、职责链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式。
这一块我们做的结构化是模式的首个字编一句比较容易理解的话,创建型的是公园里面有只丑的单身狗;结构型的是用石头组装的桥用外卖箱带走;其余十一个是行为型模式。
三、数据结构
对常见的七种排序的时间复杂度、空间复杂度和稳定性做了结构化:
时间复杂度:看了七种类型的时间复杂度后,发现选择排序的两种排序直接选择和堆排序,归并排序,他们分别最好、最坏和平均的时间复杂度都是一样的,共享的是同一个值,所以从共享和共享的首字母g、x能想到归并和选择。那他们三个的区别是共享和堆排序是nlogn,那用到什么算法的排序是nlogn呢,在这儿我们发现了归并排序和快速排序的算法思想是分治法,而堆排序用到的是树,所以我们可以得出用到了分治法和树形的排序,他们的时间复杂度是nlogn;冒泡、直接插入和希尔排序他们在数组基本有序的情况下,只需要执行n次逻辑代码。空间复杂度:找到的共性是大部分都是O(1),只有两个比较特殊,一个是归并,一个是快排,排序我们之前都互相分享过,结合到具体的人来做的结构化;稳定性:口令快选希堆不稳定,其余稳定。
做题
现在的做题软件(希赛软考助手)设计的真的很贴合人们的需求,首先映入眼帘的是你的做题数,甚至还给标识了正确题数和正确率,这是给我们的做完题后的反馈,看着正确率不断的提升,让我们得成长看得见;其次是分类展示,可以选择真题训练,也可专项训练,错题训练,为用户考虑,为用户着想,全心全意为人民服务。
在做题过程中,一部分是识记的知识点,这部分的题在做题过程中如果不明确的话,去查书做结构化,不仅要会做当前的题,还要把相关的一部分知识学会,这样学起来不会像是一盘散沙,容易丢失,而是一张知识网,牵一发而动全身;一部分是关于计算的题,这部分首先要将计算题的基础知识掌握了,然后再研究如何思路,我们组不会的题会先往群里发,谁会谁去解答,或者是直接去问,梦杰这边做真题做到了2013年的,遇到了很多没有遇见的问题,我会去主动学习,看课本、看视频,学会了之后将此计算题讲给他人听,最后我对这道题的印象尤其深刻,不易忘记,教是最好的学。
考试阶段
在考试过程中,我也把题分为了两类,一类是我确定能做对的,一类是我不确定能不能对的。
确定
确定能做对的题型大多数都是我们小组一起做过结构化的、我给其他人讲过的知识,我一想到可能其他人会因为听我讲过,而得到这个分数,我就莫名的开心,而我自己也确保这个分数能拿到,就更加开心。
当我在考前遇到不会的知识点越多,我越高兴,当不会的知识结构化后或者是经过讨论后,我掌握了此知识,那我在考试中再遇见他,就迎刃而解,不费吹灰之力的拿到分数,乐栽乐哉!
不确定
这一部分大多是关于识记的知识点,在学习这一类的知识时没有理解,就往下进行,导致当他换一种方式出题就不会做了,学习的不到位,才会出现这种情况;还有一个题型是让画无向图的邻接表,这个是让我感到最遗憾的,没拿到分数的题,我在看数据结构那一章树和图的知识点时,认为之前自考考过了,分数也挺高的,简单到没必要再次学习,因为这个心态,让我惨失五分。我需要对我所面临的所有事情持敬重的态度,不轻敌,认真对待每件事情,每个知识。
考后总结
制定月计划、周计划、每日的PDCA、小组学习、知识做结构化(思维导图)、讲给别人、费斯汀格法则,是我迎接下一个考试还要继续延续的学习方法,甚至在我以后任何知识的学习过程中也要延续的学习方法,这些对我很重要!认为自己会了,不需要再次学习的这种傲慢心态、容易得过且过的心态要避之远之!