软考中级-软件设计师-18.上午题-算法(4-5分)

72 阅读3分钟

18.1 回溯法

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

一般用于迷宫问题,N皇后问题;

18.2 分治法

递归指子程序(函数)直接调用自己活通过一系列调用语句间接调用自己,是一种描述问题和解决问题的常用方法;

递归两个基本要素:

  • 边界条件(确定递归何时终止,即递归出口)
  • 递归模式(大问题如何分解成小问题,即递归体)

分治法:对于一个规模为n的问题,若该问题可以容易地解决则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各子问题的解合并得到原问题的解;凡是涉及到分组解决的都是分治法;(二分查找、归并排序、快速排序、最大字段和问题[O(nlogn)])

8.3 动态规划法

在求解问题中,对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃哪些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局是最优解;

常用于求解具有某种最优性质的问题;(0-1背包【O(NW) N:物品数量,W:背包数量】、最长公共子序列【蛮力法:O(n*2n),动态规划:O(n2)】、矩阵连乘【时间:O(n3),空间:O(n2)】)

注:最优子结构 + 重叠子问题 => 动态规划法

8.4 贪心法

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

判断此类算法,就看算法是否是每一步都取最优,并且整体题意没有透露出最终结果是最优的,局部最优

注:最优子结构 + 贪心选择性质 => 贪心法

活动场地问题,找零钱的问题,哈夫曼编码问题;

8.5 其他

  1. 分支限界法:依据广度优先算法;
  2. 迪杰斯特拉算法、普利姆算法(Prim)、克鲁斯卡尔算法(Kruscal)、哈夫曼编码都是基于贪心策略的算法;
  3. 设计算法时的原则:首先算法必须是正确的,其次应该有很好的可读性,还必须具有健壮性,最后应该考虑算法的高效率和低存储量;
  4. 拉斯维加斯算法(Las Vegas) 是一种常用的概率算法;
  5. 若一个问题既可以使用迭代的方法也可以使用递归的方法求解,则迭代方法具有更高的时空效率;