软件设计师——算法设计与C语言实现(下午试题四)

软件设计师备考笔记

上午题下午题
计算机网络概述数据流图设计(下午试题一)
程序设计语言基础知识数据库设计(下午试题二)
标准化和知识产权UML分析与设计(下午试题三)
数据库面向对象程序设计与实现(下午试题六)
操作系统算法设计与C语言实现(下午试题四)
结构化开发与方法
软件工程
网络与信息安全
数据结构
算法分析设计

1 程序设计语言

1.1 程序设计语言的基本成分

  • 数据成分:指一种程序设计语言的数据和数据类型。数据分为常量(程序运行时不可改变)、变量(程序运行时可以改变)、全局量(存储空间在静态数据区分配)、局部量(存储空间在堆栈区分配)。数据类型有整型、字符型、双精度、单精度浮点型、布尔型等
  • 运算成分:指明允许使用的运算符号及运算规则。包括算术运算、逻辑运算、关系运算、位运算等
  • 控制成分:指明语言允许表述的控制结构。包括顺序结构、选择结构、循环结构(初始化 + 循环体 + 循环条件)
    在这里插入图片描述
  • 传输成分:指明语言允许的数据传输方式。如赋值处理、数据的输入输出等
  • 函数:C程序由一个或多个函数组成,每个函数都有一个名字,其中有且仅有一个名字为main的函数作为程序运行时的起点。函数是程序模块的主要成分,是一段具有独立功能的程序。函数使用涉及三个概念:函数定义、函数声明(先声明后使用)、函数调用
  • 传值调用:将实参的值传递给形参,形参的改变不会导致调用点所传的实参的值改变。实参可以是合法的变量、常量和表达式
  • 传址调用:即引用调用,将实参的地址传递给形参,即相当于实参存储单元的地址引用,因此其值改变的同时就改变了实参的值。实参不能为常量,只能是合法的变量和表达式

2 算法分析

2.1 时间复杂度

时间复杂度是指程序运行从开始到结束所需要的时间。通常分析时间复杂度的方法是从算法中选取一种对于所研究的问题来说是基本运算的操作以该操作重复执行的次数作为算法的时间度量。一般来说,算法中原操作重复执行的次数是规模n的某个函数T(n)。由于许多情况下要精确计算T(n)是困难的,因此引入了渐进时间复杂度在数量上估计一个算法的执行时间。其定义如下:

  • 如果存在两个常数c和m,对于所有的n,当 n ≥ m 时有 f(n) ≤ cg(n) ,则有 f(n) = O(g(n)) 。也就是说,随着n的增大,f(n)渐进地不大于g(n)。例如,一个程序的实际执行时间为T(n) = 3n3 + 2n2 + n,则T(n)=O(n3)
  • 常见的对算法执行所需时间的度量:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n)

2.2 空间复杂度

空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小

3 算法分类

3.1 分治法

  • 递归:指子程序(函数)直接调用自己活通过一系列调用语句间接调用自己,是一种描述问题和解决问题的常用方法
  • 递归两个基本要素:
    • 边界条件(确定递归何时终止,即递归出口)
    • 递归模式(大问题如何分解成小问题,即递归体)
  • 分治法:对于一个规模为n的问题,若该问题可以容易地解决则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各子问题的解合并得到原问题的解
    • 步骤: 分解(将原问题分解成一系列子问题)――求解(递归地求解各子问题,若子问题足够小,则直接求解)――合并(将子问题的解合并成原问题的解)
    • 凡是涉及到分组解决的都是分治法(二分查找、归并排序等)

3.2 回溯法

  • 回溯法:有 “通用的解题法” 之称,可以系统地搜索一个问题的所有解或任一解。在包含问题的所有解的解空间树中,按照深度优先的策略,从根节点触发搜索解空间树。搜索至任一结点时,总是先判断该结点是否肯定不包含问题的解,如果不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树;继续按深度优先的策略进行搜索
    • 可以理解为先进行深度优先搜索,一直向下探测,当此路不通时,返回上一层探索另外的分支,重复此步骤,这就是回溯,意为先一直探测,当不成功时再返回上一层
    • 一般用于解决迷宫类的问题

3.3 动态规划法

  • 动态规划法:在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃哪些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解
    • 本质也是将复杂的问题划分成一个个子问题,与分治法不同的是每个子问题间不是相互独立的,并且不全都相同
    • 常用于求解具有某种最优性质的问题
    • 此算法会将大量精力放在前期构造表格上面,其会对每一步,列出各种可能的答案,这些答案会存储起来,最终要得出某个结果时,是通过查询这张表来得到的动态规划法不但每一步最优,全局也最优

3.4 贪心法

  • 贪心法:总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择。由于它不比为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以快速得到满意的解,但得不到最优解
    • 局部贪心,只针对当前的步骤取最优,而非整体考虑
    • 判断此类算法,就看算法是否是每一步都取最优,并且整体题意没有透露出最终结果是最优的

4 解题技巧

  • 代码填空:第一小题,最后解决,并不影响解决其他题目,要理解题目算法原理,才能得出答案。另外近几年的算法设计真题有很大的技巧,即便不理解算法原理也可以推导出答案,要结合算法描述中的公式,以及算法代码中类似的支,能够发现填空的答案在代码中其中地方已经给出,因为算法原理的相似可以通用,尤其是分治法算法
    • 要注意的是,当遇到有最小值或最大值参与比较时,若比较出来比最小值更小,接下来肯定要更新这个最小值以及其下标元素值。当遇到一些条件判断的填空时,要注意对应上下文查看哪些变量是作为控制的
  • 算法、时间复杂度:第二小题,先做,考察何种算法很好分辨,涉及到分组就是分治法,局部最优就是贪心法,整体规划最优就是动态规划法,迷宫类的问题是回溯法,记住关键字很好区分;时间复杂度就是看C代码中的for循环层数和每一层的循环次数,涉及到二分必然有O(logn)
  • 特殊值计算:第三小题,一般应该先做,不需要根据C代码,直接根据题目给出的算法原理,一步步推导即可得出答案,耐心推导并不难。但要注意,如果遇到算法原理十分复杂的,建议放弃,掌握问题1和2的技巧即可
  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值