(第八章+第一章)数据结构总复习+错题+一些不清楚的点。

数据结构总复习+错题+一些不清楚的点。


大复习模式,开启!!

不急不躁,复习就要复习透彻!

(慕课错题如果有错误,那就是我搜出来的不对,毕竟测试答了之后也不给答案啊😢

欢迎在评论区里踢我捉错误🐱

持续更新ing

第八章+第一章,排序+时间复杂度

慕课错题:

  1. 设有5000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则用下列( 堆排序 )方法可以达到此目的

    只有堆排序每次最快选出来一个最小的一个,其他都不可以一趟出一个最小,只有堆排序是一次又一次的最小。

    堆排序,快速排序,希尔排序,归并排序适合处理数据量大的序列。

  2. 在对n个元素进行快速排序的过程中,最坏情况下需要进行( n-1)趟

    也就是每一次都没有任何元素动,n-1次定下了n-1个元素的位置,最后一个就不用动了。

  3. 在数据结构中,从逻辑上可以把数据结构分成(线性结构和非线性结构)

  4. 算法评价标准包括正确性、可读性、健壮性和(高效性)

  5. 计算机算法指的是解决问题的有限运算序列,(有穷性、确定性、可行性)等五个特性。

插入排序

主函数和打印函数:


void print(int* sortArr, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", sortArr[i]);
	}
}
int main()
{
	int i, j,len;
	int sortArr[] = { 151,130,92,461,42,77,183,130,20,523,7 };
	len = sizeof(sortArr) / sizeof(sortArr[0]);
	//Insert_direct(sortArr,len);
	//Bin_sort(sortArr, len);
	//Shell_sort(sortArr, len);
}
排序1:直接插入排序(每次都是一点点点的比较)
  • 时间复杂度O(n^2)

void Insert_direct(int* sortArr,int len)//直接插入排序,升序排列的。
{
	int i, j;
	int temp;
	void print(int* sortArr, int len);
	for (i = 1; i < len; i++)
	{
		j = i - 1;
		temp = sortArr[i];
		while (j >= 0 && temp < sortArr[j])
		{
			sortArr[j + 1] = sortArr[j];
			j--;//往后挪,每次j+1的地方就是需要填的位置(也就是未减前,已经被保存的j的位置)
		}
		if (j + 1 != i)//若等于,刚好不用动。
		{
			sortArr[j + 1] = temp;
		}
		//printf("%d:", i);
		//print(sortArr, len);
		//printf("\n");
	}
}
排序2:二分插入排序
  • 时间复杂度(O(n^2))
 void Bin_sort(int* sortArr, int len)
{
	int i, j, high, mid, low,temp;
	for (i = 1; i < len; i++)
	{
		temp = sortArr[i];
		low = 0;
		high = i-1;//i是要插的,只要二分查找前面的就行。
		while (low <= high)//必须要有等号
		{
			mid = (low + high) / 2;
			if (sortArr[i] < sortArr[mid]) high = mid - 1;//并且如果是小于的话,要插入位置是low,这二者除了对于二分之外,还对最后结果也是恰当的。
			else low = mid + 1;//如果大于,就是low+1的位置。
		}//最终low的位置是需要插入的位置
		if (low != i)
		{
			for (j = i - 1; j >=low; j--)//挪位置,注意,把low的位置挪出来就行
			{
				sortArr[j + 1] = sortArr[j];
			}
			sortArr[low] = temp;
		}
		//printf("%d:", i);
		//print(sortArr, len);
		//printf("\n");
	}
}

碎碎念:看着挺简单的东西,不看书自己敲一遍,中间还真的会出现不少错误,呜呜呜,我个菜鸡🐔

排序3:shell排序(希尔排序)
  • 时间复杂度:O(n^1.3)

    本质上是按照增量分组后,分别进行直接插入排序。

    算法是从增量的开始,与前方比较(也就是每一组的第二个和第一个比,然后第三个往前比)

    不过是不是按照每个组的顺序来的,是第一组的第二个、第二组的第二个。。。。

    例题见8-1.(为什么不发出来呢?手写到本上了,字丑拒绝😆)

void Shell_sort(int* sortArr, int len)
{
	 int d = len / 2;//增量
	 int i, j,temp;
	 for (; d > 0; d /= 2)
	 {
		 for (i = d; i < len; i++)//一趟排序
		 {
			 temp = sortArr[i];
			 j = i - d;//同组内j是i前面的数
			 while (j >= 0 && temp < sortArr[j])
			 {
				 sortArr[j + d] = sortArr[j];
				 j -= d;
			 }
			 if(j+d!=i)sortArr[j + d] = temp;//注意位置。别出了这个循环
		 }
		//print(sortArr, len);
		//printf("\n");
	 }
}

📓:插入算法中的直接插入排序算法和二分插入排序算法都默认将第一个数加入到初始序列中了。

选择排序
排序1:直接选择排序
  • 时间复杂度O(n^2)

本质就是对于每一个位置,都从它以及它之后的序列中找最小,然后单独交换这两个,避免了不断的移动数组,但是本身需要移动很多次。

  • 算法很简单,就不写了。考试老师说只考前三个算法,所以就懒得写了
排序2:堆排序
  • 时间复杂度O(nlog2n)

小根堆排出降序(由大到小),大根堆排出升序

交换后的元素不再参与堆的调整,交换到只剩一个元素后完成.

  1. 算法分为调整部分和排序部分,调整是从最后一个非叶子结点,逐步往前进行调整,采用循环的方式,若上层发生变化,也会对下层产生影响,进而继续调整下层,直到结点大于size.
  2. 排序是交换第一个和最后一个数,直至只剩第一个数.每交换一次,就让size-1,并且只针对交换的头节点进行调整部分的调整(会层层往下进行的).
交换排序
排序1:冒泡排序
  • 时间复杂度(O(n^2))

最基本的最简单的全对比都会,不赘述了

主要是可以定义一个交换标志,如果未发生交换,终止进程(排好了)

冒上去的泡就不用再比较了

排序2:快速排序
  • 时间复杂度O(nlog2n)

定枢轴,左右摇摆着交换🐕

算法采用递归的形式,将每一趟进行了递归.

枢轴一般是定义为左侧的第一个

难点:

  1. 注意设置退出标志:即i<j不成立了,也就是i=j了,指向一趟的终止了.
  2. 总循环的结束标志也是i=j;
  3. 递归的时候重新设置左右两边区间的左右.
    :快速排序
  • 时间复杂度O(nlog2n)

定枢轴,左右摇摆着交换🐕

算法采用递归的形式,将每一趟进行了递归.

枢轴一般是定义为左侧的第一个

难点:

  1. 注意设置退出标志:即i<j不成立了,也就是i=j了,指向一趟的终止了.
  2. 总循环的结束标志也是i=j;
  3. 递归的时候重新设置左右两边区间的左右.
<think>好的,我现在需要回答用户关于是否现在备考5月份的系统架构设计师考试是否来得及的问题。首先,我得确认考试的时间。系统架构设计师考试通常在每年的5月和11月举行,所以假设用户指的是5月份的考试,现在的时间应该是3月或4月初左右,用户可能在3月底提问。接下来,我需要分析从当前时间到考试的大致时间跨度,可能还有1个半到2个月的时间。 用户之前已经咨询过关于高级资格考试的选择,这次是具体针对系统架构设计师的备考时间问题。我需要考虑备考这个考试需要的内容、难度以及用户的基础情况。用户已经拥有软件设计师中级证书,因此具备一定的软件工程和开发的基础知识,这对备考系统架构设计师有帮助。 系统架构设计师的考试内容包括综合知识(选择题)、案例分析以及论文写作三个部分。每个部分都有同的准备策略。综合知识涉及广泛的技术和理论,包括软件架构设计、分布式系统、设计模式、数据库、安全性等。案例分析需要解决实际问题,考察应用能力。论文则需要结合项目经验,展示架构设计的思路和实践。 接下来,我需要评估用户的时间安排。假设用户每天能投入2-3小时学习,周末可能更多,那么共有大约6到8周的时间,学习时间可能在120到200小时之间。根据经验,系统架构设计师的备考通常需要300小时左右,但用户已有中级基础,可能可以适当减少时间,但需要高效利用。 然后,我需要分析每个部分的备考策略。综合知识部分需要系统复习教材和历年真题,尤其是高频考。案例分析需要练习解题思路和答题技巧,掌握常见的架构设计问题。论文则需要提前准备模板和素材,结合自身项目经验,避免临场发挥足。 同时,用户可能存在的疑问包括时间是否足够,哪些部分需要优先准备,如何高效分配时间,以及是否有推荐的资料和复习方法。需要针对这些问题给出具体的建议,比如分阶段复习、重突破、模拟考试等。 最后,需要给出一个结论,说明在现有时间内如果能够有效安排学习计划,是有可能通过考试的,同时指出关键的成功因素,如坚持每日学习、针对性练习、论文提前准备等。此外,提醒用户注意避免常见的备考误区,比如只刷题结,或者忽视论文部分的准备。</think>--- **若现在开始全力备考(假设距离考试剩余约6-8周),只要方法得当,完全有机会通过系统架构设计师考试**。以下是分阶段备考策略与关键要: --- ### **一、时间可行性分析(以剩余45天为例)** | 阶段 | 时间分配 | 核心目标 | 每日投入 | |---------------|----------|--------------------------------------|---------| | **基础巩固** | 15天 | 掌握高频考,建立知识框架 | 3-4小时 | | **案例突破** | 15天 | 提炼答题模板,强化架构设计思维 | 3小时 | | **论文冲刺** | 10天 | 完成2-3篇论文框架,积累真实案例 | 2小时 | | **模拟实战** | 5天 | 全真模考,查漏补缺 | 4小时 | --- ### **二、各科目针对性备考策略** #### **1. 综合知识(选择题)** - **高频考速记**: - **分布式系统**:CAP定理、BASE理论、Paxos/Raft协议(近3年出现率超60%) - **架构风格**:分层架构、微服务、事件驱动(对比优缺,如**微服务 vs SOA**) - **设计模式**:重掌握适配器、策略、观察者模式(结合UML类图理解) - **刷题技巧**: - 使用**软考通/希赛网APP**,每日刷50题,错题归类至Excel(标注知识) - 优先攻克**近3年真题**(重复率约20%) #### **2. 案例分析** - **必考题型突破**: - **架构设计题**(如电商系统高并发方案): ```markdown [答题框架] 1. 需求分析:明确性能指标(QPS≥10万)、扩展性要求 2. 技术选型: - 服务拆分:微服务 + Spring Cloud Alibaba - 缓存:Redis集群 + 本地缓存(Caffeine) - 消息队列:Kafka实现削峰填谷 3. 容灾设计:同城双活 + 异地灾备 ``` - **质量属性权衡**:用ATAM方法分析安全性/可修改性(参考《系统架构设计师教程》第8章) - **真题实战**: - 完成2019-2023年案例真题,结**高频考分布**: - 数据库分库分表(出现4次) - 负载均衡算法(轮询、加权最少连接) #### **3. 论文写作** - **速成技巧**: - **模板化结构**: ```markdown 【标题】论×××在××系统中的应用 摘要:300字(背景+架构亮+成果) 正文: 1. 项目背景(突出规模:用户量≥50万,TPS≥5000) 2. 核心问题(性能瓶颈、技术债务) 3. 架构设计(分层图+技术选型对比) 4. 实施效果(量化指标:响应时间降低70%) 结:经验与改进 ``` - **素材库准备**: - 提前编写2-3个虚拟项目(如“物流调度系统”“在线教育平台”),包含**真实技术栈**(如Nginx+Spring Cloud+Redis Cluster) - 背诵**架构图**(使用C4模型或UML部署图) --- ### **三、关键提分技巧** 1. **选择题保底40分**: - 死记**法律法规**(著作权法、政府采购法)和**标准化知识**(ISO/IEC 25010质量模型) 2. **案例题抓住采分**: - 答案按**序号分条**,每条包含“术语+解释”(如“采用**读写分离**策略,通过MySQL主从复制降低主库压力”) 3. **论文避坑指南**: - 避免空洞理论,用**数据支撑**(如“Redis集群缓存热商品数据,缓存命中率从60%提升至92%”) - 技术选型说明**决策依据**(如“选择Kafka而非RabbitMQ,因其吞吐量更高,适合日志采集场景”) --- ### **四、备考资料清单** | 资料类型 | 推荐资源 | 使用建议 | |----------------|---------------------------------|----------------------------| | **教材** | 《系统架构设计师教程(第4版)》 | 精读第5章(架构设计)、第12章(新技术) | | **真题** | 2018-2023年真题及解析 | 案例题手写答案对照评分标准 | | **工具** | ProcessOn在线作图工具 | 练习绘制架构图(需体现分层、通信协议) | | **论文范文** | 《系统架构设计师论文精编》 | 模仿写作结构,勿直接抄袭 | --- ### **五、风险提示与应对** 1. **时间足**: - 优先放弃低频考(如嵌入式架构),集中火力攻占**分布式系统**和**架构设计模式** 2. **论文无项目经验**: - 合理“包装”过往开发经历(如将小型项目描述为“支持百万用户”),但需逻辑自洽 3. **案例分析卡壳**: - 背诵**万能解决方案**(如性能问题优先考虑缓存、异步、分片) --- **结论**:**45天高效备考完全可行**,重在于: ① 选择题抓大放小(保40冲50) ② 案例题模板化答题(按框架填充内容) ③ 论文提前备好“弹药库”(避免临场编造) 每天坚持4小时学习,通过率可达60%以上!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值