【算法分析】简答考核+算法

1.简答题

1.1基本思想

✨分治法的基本思想✨
将一个规模为 n 的问题分解为 k 个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

✨动态规划的基本思想✨
将求解的较大规模的问题分割成k个更小规模的子问题。
对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而提高计算效率。
经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。

✨动态规划基本步骤✨
(1)分析最优解的性质,并刻划其结构特征。
(2)递归地定义最优值。
(3)以自底向上的方式或自顶向下的记忆化方法(备忘录法)计算出最优值。
(4)根据计算最优值时得到的信息,构造一个最优解。

✨回溯法的基本思想✨
为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法

✨分支限界法的基本思想✨
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。
此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

✨分支限界法设计算法的步骤✨
(1)针对所给问题,定义问题的解空间(对解进行编码);
(2)确定易于搜索的解空间结构(按树或图组织解) ;
(3)以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜
索过程中用剪枝函数避免无效搜索

2. 分支限界法与回溯法的不同与相同点

不同点👇

  1. 求解目标:
    回溯法的求解目标是找出解空间树中满足约束条件的所有解,
    而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
  2. 搜索方式的不同:
    回溯法以深度优先的方式搜索解空间树,
    而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树
    相同点👇
    分支限界法与回溯法的相同点是:都是一种在问题的解空间树 T 中搜索问题解的算法。

分治法与动态规划法的相同点

将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题
的解得到原问题的解。
两者的不同点是:适合于用动态规划法求解的问题,经分解得到的子问题
往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相 独立的。

动态规划算法与贪心算法的异同

共同点👇
都需要最优子结构性质,
都用来求有优化问题。
不同点👇
动态规划:每一步作一个选择—依赖于子问题的解。
贪心方法:每一步作一个选择—不依赖于子问题的解。

动态规划方法的条件:子问题的重叠性质。
可用贪心方法的条件:最优子结构性质;贪心选择性质。

动态规划:自底向上求解;
贪心方法: 自顶向下求解。

可用贪心法时,动态规划方法可能不适用;
可用动态规划方法时,贪心法可能不适用

1.3 性质

✨子问题的重叠性质✨
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次

✨最优子结构性质✨
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征

✨贪心选择性质✨
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的重要要素。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

1.4常见的两种分支限界法

队列式(FIFO)分支限界法
按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
优先队列式分支限界法
按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点

2. 算法题

2.1子集树

在这里插入图片描述
遍历子集树需O(2n)计算时间

void backtrack (int t)
{
  if (t>n) output(x);
    else
      for (int i=0;i<=1;i++) {
        x[t]=i;
        if (legal(t)) backtrack(t+1);
      }
}

2.2 排列树

在这里插入图片描述
遍历排列树需要O(n!)计算时间

void backtrack (int t)
{
  if (t>n) output(x);
    else
      for (int i=t;i<=n;i++) {
        swap(x[t], x[i]);
        if (legal(t)) backtrack(t+1);
        swap(x[t], x[i]);
      }
} 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

司六米希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值