![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法设计基础
文章平均质量分 91
林梓烯
这个作者很懒,什么都没留下…
展开
-
算法设计基础——综合
算法设计基础中最基础的几种算法:分治法、减治法、贪心法、动态规划法、回溯法基本都掌握后,我们现在可以对这些算法做整体的比较,本次实验使用蛮力法、动态规划法、回溯法来求解0/1背包问题,来比较各个算法的优劣。问题描述:有n个物品待装入背包,给出各个物品的价值和重量以及背包的容量,需要求出一个最佳的方案使得装入背包的物品总价值最高。此问题为子集问题,总共的方案数有2^n种,这些方案可以用一串二进制序列表示:000、001、010等,这样要求出一个个的方案只需要求出一系列的二进制数即可,然后再对这些方案一个个试探原创 2023-12-16 23:41:15 · 1003 阅读 · 0 评论 -
算法设计基础——贪心法
从上面两个例子中我们能得到贪心法求解问题的基本步骤,首先根据问题描述选择一个合适的贪心策略,贪心策略是在每个阶段求解最优解的方法,与动态规划法的动态规划函数类似,同动态规划函数一样,贪心策略也是贪心法的关键。接着将问题划分为若干个阶段,对于每个阶段,运用贪心策略求解得到最优解,贪心策略都是只根据当前的已知的信息作出的贪心选择,而不会去考虑作出此选择后对后续的影响是好是坏,因此使用贪心策略求出的解都是局部最优解,而不是整体最优解,对每个阶段都求出最优解后就能得到原问题的最优解。原创 2023-11-29 22:14:13 · 1086 阅读 · 0 评论 -
算法设计基础——动态规划法
斐波那契数列递归求解的过程类似二叉树的后序遍历,先求左子树,再求右子树,最后得到原结点,如上图,在getFibo(5)中左子树求解完getFibo(3)后,右子树getFibo(3)可以直接从表中取出该问题的解,无需再次计算,getFibo(4)也是同理,这样的执行过程就相当于剪去了右子树,只计算左子树,使得时间复杂度规模直接从O(2^n)直接降到O(log2(2^n)),即O(n),提升时非常巨大的。此外,动态规划法的填表也使得算法减少了很多重复的计算,避免了分治法的缺点。直到0到1、0到2、0到3。原创 2023-11-09 22:17:45 · 252 阅读 · 0 评论 -
算法设计基础——减治法
分治法是将一个大问题划分为多个子问题,接着对所有子问题求解,再将子问题的解进行合并得出原问题的解。减治法与分治法类似,也是将原问题分解为多个子问题,但却并不需要对所有子问题进行求解,它只需要求解其中一个子问题,因此不需要对子问题的解进行合并,只需通过这个子问题的解来得到原问题的解。减治法可以看做是一种特殊的分治法,但它在分解子问题的同时会不断地减少问题的规模,通常情况下其时间复杂度会比分治法低。作为入门,我们先从减一治、减半治开始来逐步了解和掌握减治法。原创 2023-11-03 12:30:00 · 670 阅读 · 0 评论 -
算法设计基础——分治法
那么这样的分解要到什么时候结束呢,我们知道递归需要有递归体和递归出口,分治法也要有分解的部分和终止条件,而这个终止条件就是问题无法再继续分解下去或者这个问题的解我们已经知道了,此时就没必要再求解下去了,根据实际情况返回结果即可。分治法是一种很基础的算法,其实现原理是将大问题分解成多个子问题,通过求解子问题来得到原问题的解,而这些子问题的求解也与原问题一样可以通过将其拆分,求解它们的子问题的解来得到本身的解,这是一种典型的递归思想,因此一般我们编写程序也通常使用递归法来实现分治算法。原创 2023-10-30 18:59:19 · 180 阅读 · 1 评论