今天无意中从箱子里发现了大学时学算法的教材《算法设计与分析》,虽然工作这么几年没在什么地方用过算法,但算法的思想还是影响深刻的,可以在系统设计时提供一些思路。大致翻了翻,重温了一下几种几种经典的算法,做一下小结。
- 分治法
- 动态规划
- 贪心算法
- 回溯法
- 分支限界法
分治法
1)基本思想
将一个问题分解为多个规模较小的子问题,这些子问题互相独立并与原问题解决方法相同。递归解这些子问题,然后将这各子问题的解合并得到原问题的解。
2)适用问题的特征
- 该问题的规模缩小到一定的程度就可以容易地解决
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
3)关键
- 如何将问题分解为规模较小并且解决方法相同的问题
- 分解的粒度
4)步骤
分解->递归求解->合并
- divide-and-conquer(P)
- {
- if ( | P | <= n0) adhoc(P); //解决小规模的问题
- divide P into smaller subinstances P1,P2,...,Pk;//分解问题
- for (i=1,i<=k,i++)
- yi=divide-and-conquer(Pi); //递归的解各子问题
- return merge(y1,...,yk); //将各子问题的解合并为原问题的解
- }
google的核心算法MapReduce其实就是分治法的衍生
5)分治法例子:合并排序
规约过程:
动态规划
1)基本思想
将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的,如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算
2)适用问题的特征
- 最优子结构
- 在递归计算中,许多子问题被重复计算多次
3)步骤
- 找出最优解的性质,并刻划其结构特征。
- 递归地定义最优值。
- 以自底向上的方式计算出最优值。
- 根据计算最优值时得到的信息,构造最优解。
贪心算法
1)基本思想
贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择
2)适用问题的特征
- 贪心选择性质,即所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
- 最优子结构性质
3)步骤:不断寻找局部最优解
4)例子:找硬币,哈夫曼编码,单源最短路径,最小生成树(Prim和Kruskal)
最小生成树图示:
回溯法
1)基本思想
在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索
2)适用问题的特征:容易构建所解问题的解空间
3)步骤
- 定义问题的解空间
- 确定易于搜索的解空间结构
- 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索
4)回溯法例子:N皇后问题
分支限界法
1)基本思想
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非 最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找 到所需的解或活结点表为空时为止。
2)分支限界法例子:单源最短路径问题
问题描述:在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。
相关推荐
【标题】"CNCC 2019 计算机经典算法回顾与展望——机器学习与数据挖掘论坛" 涵盖了计算机科学领域的核心主题,特别是机器学习和数据挖掘方面的重要算法。这个论坛汇聚了业界专家和学者,他们分享了各自的见解和研究...
这些代码可能包括但不限于以下几种类型的算法: 1. **排序算法**:如快速排序(Quick Sort)、归并排序(Merge Sort)、冒泡排序(Bubble Sort)和插入排序(Insertion Sort)。排序算法在数据处理中极为重要,用于...
排序是计算机科学中最基础的算法之一,C++中常见的排序算法有以下几种: 1. 冒泡排序(Bubble Sort):通过不断地交换相邻的未排序元素来逐步完成排序。 2. 选择排序(Selection Sort):每次找出剩余元素中的...
根据题目给出的部分内容,我们将重点讨论以下几个算法: ##### 1. 判断点是否在矩形内 **算法原理**:判断一个点是否位于矩形内最直观的方法是检查该点的坐标值是否都在矩形的边界范围内。这种方法简单有效,适用于...
首先,让我们回顾一下几种常见的排序算法,并讨论它们在PHP中的实现: 1. **冒泡排序**(Bubble Sort):这是一种简单的排序算法,通过重复遍历待排序序列,比较相邻元素并交换顺序来完成排序。在PHP中,你可以创建...
其中,BP算法(Back Propagation algorithm)是训练多层前馈神经网络的经典方法之一。然而,BP算法存在一些局限性,如容易陷入局部最小值、收敛速度慢等问题。遗传算法作为一种全局优化方法,可以很好地解决这些问题...
该文通过对现有的几种典型四参数正弦波拟合算法进行回顾,并提出了一种改进的方法,旨在解决在高维参数空间中寻找最优解的问题。 #### 四参数正弦曲线拟合背景 正弦曲线的基本形式可以表示为: \[ f(t) = A \sin...
在本讲义中,我们将回顾算法的基本概念、复杂度分析以及几种重要的算法设计策略。 首先,算法的基本概念包括五个关键性质:有穷性、确定性、可行性、输入和输出。有穷性意味着算法必须在有限步骤内结束,确保不会...
2. **排序与搜索**:如冒泡排序、快速排序、归并排序、二分查找等经典算法,这些是数据处理的基础。 3. **图论**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径算法(如Dijkstra算法和Floyd算法)以及...
它不仅回顾了神经网络的基础知识,还深入分析了随机单点在线梯度算法训练Pi-Sigma网络时权值较小导致收敛速度下降的问题,并提出了相应的解决方案——带惩罚项的随机单点在线梯度算法。此外,该论文还讨论了Pi-Sigma...
对于计算机科学专业的学生和从业者,本书对每个计算机科学家必须理解的关键算法都进行了很好的回顾。对于非专业人士,它确实打开了每天所使用的工具的核心——算法世界的大门。”—— G. Ayorkor Korsah,阿什西大学...
### 关于头脑风暴优化算法的知识点回顾 #### 一、头脑风暴优化算法简介 头脑风暴优化算法(Brain Storm Optimization Algorithm, BSO)是由史玉回教授于2011年提出的一种新颖的群体智能优化算法。该算法的设计灵感...
Zeller公式是一种用于确定公历(格里高利历)中任何日期为星期几的有效算法。它由德国数学家克里斯蒂安·卡尔斯·冯·泽勒于19世纪末提出,并且被广泛应用于计算领域。 #### 公式表达 Zeller公式的数学表达形式...
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。 #### 8. 回溯算法 回溯算法是一种通过试错来寻找问题解的算法,它尝试分步的去解决一个...
粒子的更新公式综合了两种算法的特点,采用了随机惯性权重策略以增加动态调整能力,并引入了全局扰动算子以防止算法陷入局部最优。此外,为了保留优秀解,文章还引入了精英保留策略,即在每次迭代中,将表现最差的...
在介绍新算法之前,先回顾一下几种常用的背景提取算法,以便更好地理解新算法的优势所在。 ##### 1. 统计直方图法 该方法通过对一定时间内多帧图像中每个像素点的不同亮度出现次数进行统计,选取出现次数最多的...
《C C++常用算法手册-带详细目录书签.pdf》...对于有一定经验的开发者,它将是一个很好的参考资料,帮助回顾和巩固算法知识。在学习过程中,结合实际编程练习,将理论与实践相结合,将有助于更好地理解和掌握这些算法。