剪枝算法(算法优化)

一:剪枝策略的寻找的方法

1)微观方法:从问题本身出发,发现剪枝条件

2)宏观方法:从整体出发,发现剪枝条件。

3)注意提高效率,这是关键,最重要的。

总之,剪枝策略,属于算法优化范畴;通常应用在DFS 和 BFS 搜索算法中;剪枝策略就是寻找过滤条件,提前减少不必要的搜索路径。

二:剪枝算法(算法优化)

1、简介

在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。

2、剪枝优化三原则: 正确、准确、高效.原则

搜索算法,绝大部分需要用到剪枝.然而,不是所有的枝条都可以剪掉,这就需要通过设计出合理的判断方法,以决定某一分支的取舍. 在设计判断方法的时候,需要遵循一定的原则.

剪枝的原则

1) 正确性

正如上文所述,枝条不是爱剪就能剪的. 如果随便剪枝,把带有最优解的那一分支也剪掉了的话,剪枝也就失去了意义. 所以,剪枝的前提是一定要保证不丢失正确的结果.

2)准确性

在保证了正确性的基础上,我们应该根据具体问题具体分析,采用合适的判断手段,使不包含最优解的枝条尽可能多的被剪去,以达到程序“最优化”的目的. 可以说,剪枝的准确性,是衡量一个优化算法好坏的标准.

3)高效性

设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少. 但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾. 因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的. 倘若一个剪枝的判断效果非常好,但是它却需要耗费大量的时间来判断、比较,结果整个程序运行起来也跟没有优化过的没什么区别,这样就太得不偿失了.

3、分类

剪枝算法按照其判断思路可大致分成两类:可行性剪枝及最优性剪枝.

3.1 可行性剪枝 —— 该方法判断继续搜索能否得出答案,如果不能直接回溯。

3.2 最优性剪枝

最优性剪枝,又称为上下界剪枝,是一种重要的搜索剪枝策略。它记录当前得到的最优值,如果当前结点已经无法产生比当前最优解更优的解时,可以提前回溯。

时间: 2024-10-25 20:29:21

剪枝算法(算法优化)的相关文章

算法的优化(C语言描述)

算法的优化 算法的优化分为全局优化和局部优化两个层次.全局优化也称为结构优化,主要是从基本控制结构优化.算法.数据结构的选择上考虑:局部优化即为代码优化,包括使用尽量小的数据类型.优化表达式.优化赋值语句.优化函数参数.全局变量及宏的使用等内容. 一.全局优化 1.优化算法设计 例如,在排序中用快速排序或者堆排序代替插入排序或冒泡排序:用较快的折半查找代替顺序查找法等,都可以极大地提高程序的执行效率. 2.优化数据结构 例如在一堆随机存放的数中使用了大量的插入和删除指令,那么使用链表要快得多.数

java算法插入排序优化代码

原文:java算法插入排序优化代码 代码下载地址:http://www.zuidaima.com/share/1550463280630784.htm 一个细节让插入排序更具效率 运行此方法需要为main方法传递参数 package com.zuidaima.sort; /** *@author www.zuidaima.com **/ public class TestSort { public static void main(String args[]){ int l = args.len

最短路的几种算法及其优化(模板)

一.Dijkstra 算法 dijkstra算法适用于边权为正的情况,求单源最短路,适用于有向图和无向图 模板伪代码: 清除所有点的标号 设d[0]=0,其余d[i]=INF: 循环n次{ 在所有未标记的节点中,寻找d[i]最小的点x 给x做标记 对于从x出发的所有边(x,y)更新d[y]=min(d[y],d[x]+w[x,y]); } memset(v,0,sizeof(v)); for(int i=0;i<n;++i) d[i]=(i==0?0:INF); for(int i=0;i<n

结对测试算法性能优化(用例设计层面)

在<结对测试算法性能优化(代码层面)>一文中, 对原来算法代码进行了一些优化, 对于笛卡尔积后千条数据,是能满足使用需要的. 但在实际业务中,会碰到百万数据. 比如某接口共18个参数,每个参数均可为空,其中8个只需要单个值,10个为多选项,需要多个值. 对于多选项,我的设计是,全选+随机n个多选(1<=n<=len-1)+空. 按照这个策略,笛卡尔积的结果就是3^8*2^10=6718464. 671万数据! parewise根本处理不动. 该怎么处理? 调整用例设计. 1.为空的

关于SPFA算法的优化方式

关于SPFA算法的优化方式 这篇随笔讲解信息学奥林匹克竞赛中图论部分的求最短路算法SPFA的两种优化方式.学习这两种优化算法需要有SPFA朴素算法的学习经验.在本随笔中SPFA朴素算法的相关知识将不予赘述. 上课! No.1 SLF优化(Small Label First) 顾名思义,这种优化采用的方式是把较小元素提前. 就像dijkstra算法的堆优化一样.我们在求解最短路算法的时候是采取对图的遍历,每次求最小边的一个过程,为了寻找最小边,我们需要枚举每一条出边,如果我们一上来就找到这个边,那

meet-in-the-middle 基础算法(优化dfs)

$meet-in-the-middle$(又称折半搜索.双向搜索)对于$n<=40$的搜索类型题目,一般都可以采用该算法进行优化,很稳很暴力. $meet-in-the-middle$算法的主要思想是将搜索区域化为两个集合,分别由搜索树的两端向中间扩展,直到搜索树产生交集,此时即可得到我们的合法情况. 通常适用于求经过$n$步变化,从A集合变到B集合需要的方案数问题. 对于普通dfs来说,其一大弊端是随着搜索层数的不断增加,搜索的复杂度也会极速增长, 而$meet-in-the-middle$算

最优化算法&mdash;&mdash;常见优化算法分类及总结

之前做特征选择,实现过基于群智能算法进行最优化的搜索,看过一些群智能优化算法的论文,在此做一下总结. 在生活或者工作中存在各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题"在一定成本下,如何使利润最大化"等.最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最优的一些学科的总称. 工程设计中最优化问题(optimalization problem)的一般提法是要选择一组参数(变量),在满足一系列有关的限制条件(约束)下,使设计

求解最短路的四个算法及其优化

目录 求解最短路的四个算法及其优化 1.Dijkstra算法 <1.朴素Dijkstra算法: <2:堆优化的Dijkstra算法 2.Floyd算法 3.Bellman-Ford算法 4.SPFA算法 求解最短路的四个算法及其优化 1.Dijkstra算法 Dijkstra很好的运用了贪心算法,其思想是一直找离已加入顶点集合的最短边,更新邻点,下面是实现代码: <1.朴素Dijkstra算法: [题意]:给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值.请你求出1

C数据结构与算法-算法复杂度

算法复杂度分为时间复杂度T(n)和空间复杂度F(n) 时间复杂度:也就是执行算法程序所需的时间,与硬件的速度.编程语言的级别.编译器的优化.数据的规模.执行的频度有关,前三个有很大的不确定性,所以衡量指标只要是后两者即算法的时间复杂度是数据规模n的函数.T(n)=O(F(n)),其中O表示同阶,即当n趋近无穷大是T(n)与F(n)的比值是个不为0的常数,也就是渐进时间复杂度.按照时间复杂度量级递增顺序为:常数阶O(1).对数阶O(log2n).线性阶O(n).线性对数阶O(nlog2n).平方阶