C语言算法

在这里插入图片描述
算法分析与设计15分,有8-10分和代码相关

算法分析与设计

算法复杂度

算法的复杂度:

  • 时间复杂度是指程序运行从开始到结束所需要的时间。
  • 空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小

常见的对算法执行所需时间的度量:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)

上述的时间复杂度,经常考到,需要注意的是,时间复杂度是一个大概的规模表示,一般以循环次数表示,O(n)说明执行时间是n的正比,另外,log对数的时间复杂度一般在查找二叉树的算法中出现。渐进符号O表示一个渐进变化程度,实际变化必须小于等于O括号内的渐进变化程度。

排序算法

在这里插入图片描述
有能力的可以看一下各个语言的代码实现:菜鸟教程,该网站有各个算法的介绍以及C语言、C++、Java等语言实现的代码

经典算法

分治法:对于一个规模为n的问题,若该问题可以容易地解决则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。

回溯法(Backtracking)是一种选优的暴力搜寻法。但是,由于暴力,回溯法的时间复杂度较高,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

动态规划法(Dynamic Programming):在求解问题中,对于每一步决策,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其它局部解,以每一步都是最优解来保证全局是最优解。

贪心法:总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不比为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但得不到最优解。

下午案例考的最多的是动态规划法和贪心法

练习题

2021年下真题

阅读下列说明和C代码,回答问题1至问题2,将解答填入答题纸的对应栏内。
【说明】
生物学上通常采用编辑距离来定义两个物种DNA序列的相似性,从而刻画物种之间的进化关系。具体来说,编辑距离是指将一个字符串变换为另一个字符所需要的最小操作次数。操作有三种,分别为:插入一个字符、删除一个字符以及将一个字符修改为另一个字符。用字符数组str1和str2分别表示长度为len1和len2的字符串,定义二维数组d记录求解编辑距离的子问题最优解,则该二维数组可以递归定义为:
在这里插入图片描述

【C代码】
下面是算法的C语言实现。
(1)常量和变量说明
A,B:两个字符数组
d[][]:二维数组
i,j:循环变量
temp:临时变量
在这里插入图片描述
【问题1】(8分)
根据说明和C代码,填充C代码中的空(1)一(4)。
【问题2】(4分)
根据说明和C代码,算法采用了(5)设计策略,时间复杂度为(6)(用O符合表示,两个字符串的长度分别用m和n表示)。
【问题3】(3分)
已知两个字符串A=“CTGA”和B=“ACGCTA”,根据说明和C代码,可得出这两个字符串的编辑距离为(7)。

  • 问题1
    1:d[0][j]=j;
    2:str1[i-1]==str2[j-1]
    3:d[i-1][j-1]+1
    4:d[len1][len2]
  • 问题2
    动态规划法,看题目是最优解
    O(m*n),看代码的循环,有两个嵌套循环len1和len2的for循环
  • 问题3
    4,删除G,插入A C G

2022年下真题

试题四(共15分)
阅读下列说明和C代码,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
排序是将一组无序的数据元素调整为非递减顺序的数据序列的过程,堆排序是一种常用的排序算法。用顺序存储结构存储堆中元素。非递减堆排序的步骤是:
(1)将含n个元素的待排序数列构造成一个初始大顶堆,存储在数组R(R[1],R[2],…,R[n])中。此时堆的规模为n,堆顶元素R[1]就是序列中最大的元素,R[是堆中最后一个元素。
(2)将堆顶元素和堆中最后一个元素交换,最后一个元素脱离堆结构,堆的规模减1,将堆中剩余的元素调整成大顶堆;
(3)重复步骤(2),直到只剩下最后一个元素在堆结构中,此时数组R是一个非递减的数据序列。
在这里插入图片描述

【问题1】(8分)
根据以上说明和C代码,填充C代码中的空(1)~(4)。
【问题2】(2分)
根据以上说明和C代码,算法的时间复杂度为(5)(用O符号表示)。
【问题3】(5分)
考虑数据序列R=(7,10,13,15,4,20,19,8),n=8,则构建的初始大顶堆为(6),第一个元素脱离堆结构,对剩余元素再调整成大顶堆后的数组R为(7)。

  • 问题1
    1:R[0]<R[j]
    2:Heapify(R,i,n)
    3:i=1或者i>=2
    4:R[1]=R[0]
  • 问题2
    O(nlogn)
  • 问题3
    R=(20,15,19,10,4,13,7,8)
    R=(19,15,13,10,4,8,7,20)

2023年上真题

试题四(共15分)
阅读下列说明和C代码,回答问题1至问题2,将解答写在答题纸的对应栏内。
【说明】
下面的C程序采用深度优先遍历(DFS)来计算图G中的连通分量数。其中图G采用邻接表表示。
【C代码】
(1)主要变量说明
G:图,用邻接表存储
visited[]:数组,长度为MaxVnum,visited[i]=0表示顶点i未被访问;visited[i]=1表示顶点i已经被访问
count:图G的连通分量数
(2)函数定义
在这里插入图片描述
没有找到代码,只考虑做问题2
【问题1】(10分)
根据以上说明和C代码,填充C代码中的空(1)~(5)。
【问题2】(5分)
给出图4-1中图G的邻接表表示。

问题2
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yoyo勰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值