引言:
为什么要学算法? 对于我而言,以后工作中需要读一段优码包含一些基本算法的思想。你会更快的知道一段乱代码你知道为什么乱,怎样去优化。当需要有一些算法设计在程序里面的时候,对五大经典的算法掌握会让你更有可能给出一完整的方案。而且熟悉算法不仅可以平稳的应对面试官,还能和别的码农聊天不被鄙视,认为你是一个编程大佬。
整体描述:
1、分治算法:(1)基本思想:将一个规模为N的问题,分解成K个规模较小的子问题这些子问题相互独立与原问题性质相同,总之,分解子问题的解并得到原问题的角解。(2)特正:①该问题的规模缩小到一定程度就可以容易的解决.②I该问题可以分角为若于个规模较小的相同问题,即该问题具有最优子结构性质|③利用该问题分解出子问题的角解,可以合为该问题的解;田该问题所分角解出的各个子问题是相独立的,即子问题之间不包含公共的子问题。(3)步澩:分用手:将原问题分解为若于个规模较小相互独立,与原问题形式相同的子问题,角用决若子问题较小而容易被角解决则直接解则递归地角名个子问题合并:将各个子问题的解合并为原问题的年解(4)应用:二分搜索棋盘覆盖线性时间选择合并排序。
2、贪心算法:(1)基本思想从问题的某个初始解出发一步步地进行,根据某个优化测度,每-步都要确保能获得局部最优解。每二步只考虑一一个数据,他的选取应该-满足局部优化的条件下0(2 )特征: 0最大特精征就是快,通掌常是线性二次式,不需要多少额外的内存。国山选择:自顶向下进行,以迭比的方式作出相继的金心选择每一次的金心选择就将所求问题简化为规模更子问题回最优子结构:鱼一次白的好问题都包各最优解。(3)步马骤: 0建立数学模型来描述问题:日把求解的问题分成若于个分问题日对每一个子问题求角解,得到子问题局部最优角解田把子问题的局部最分来合成原来解问题的一个解(4)应用:背包问题、马踏棋盘、均分纸牌
3.动态规划箅法: (1)基思想:动态规划的思想是对贪山常法和分治法的种像,通常具有某种最优性灰的问题。在类似问题中能会镇许多可行解保存以解问题的值 ,之后不管该问题 是否再次用到,只要被计算过值就被保存下来(2)牛特征:①最优3结构:包含子问题的角解是取优的.日子问题重叠:自顶向下对间是球角解日时,軟生的子问题并不总是新问题有些子问题会被重复计算很多次,保存每一次3问题的解,当需再次计算子问题直接查看其解。(3)步骤:0问题具有最优子结构性失;回构造最优值递归关系表达式③最优值算法描述田构造最优争异(4)应用:最长公共子序列问题、矩阵连乘问题凸多边形最优=角各阶问题、电路布线问题。
4.回朔算法:(1)基想想:从-条路往前走,能进则进. ,不能进则退回来换~路再试。是个既带有系统性又带有跳跃性的搜索算法它在包含问题的所有角解的角解空间树中按照深度优先的策略,丛根结点出发搜索解空间树。(2)特征:①搜索策略:节合递规算法,问题解决可以必子间题其子问题与原问题相同,只是数据大不同回控制策略为了避免不要穷举搜索,对搜索过程失败点,取从失败点返回)-点新搜索③数据结构:用数组保存搜索过程的状态、路径。(3 )步骤: 0名确定问题的角间空间确完全解形式,以及构造解的剪枝规则。②确定节点的扩展规规,即下个节点的选择规则,③以深度优先的方式搜索角解间空,如果可以则进入该点的子树进入下一步搜索;如果不可以,跳过该节点,逐层回滋月(4)应用: n皇右问题背包问题。
5.分支限界算法:(1)基本思想;首先确定一个合理的分界叫数,并根据限界凼数。确定目标函数的界,按照广度优先策略搜索问题的解空间树,依次扩展该结点的孩子结点,分别估算孩子结点目标幽数的可能值如男孩子节点目标凶数超出目标凼数的界,则矫否加入待处理结点。(2)特征:因为从最小下界分支,每次算完限胎把搜索树扯前所有的叶子结点分界进行比较,础服界最小的结点,此节点即为下次分支结点。回这种决策的优点是检查子问题较少,较快求得最佳解。(3)步骤:如果问是的目标为最化,投定最优解A=∞;根据分枝法则从尚未被洞悉节点中选择节点并在此点的下一层分为几个新的节点;计算每个新分枝出来的节点下限值;对每一点进行洞器条件测试。应用: 01背包问题、单源最短路径问题、 最优装载问题
案例分析:
**1.问题描述:**给定n种物品和二背包.物品i的重力w,其价值为Y;背包容量为Ic, 应如何选择装背包的物品,使装入当包中物品的总价值最大。
2.不同算注角用决该问题: ( 1 )动态规划:迸推方程:.m(i,) )=mcx{m(i-Lj),mci, .j-wi)+vi} js=wi m(il,jl j< wi; 8时间复度为0(n)(2)贪心法:算法思想; 贪心原则为单位价值最大且重量最小,不超达过背包最大承重量为约束条件。也就是说,存在位重量价值相等的两个包,则选取重量较小的那个包。但是;贪山算法只有在解决物品以分害的当包问题是正确的。(3)回溯法: '对于有n种可选物品的01背包问题,其角空间由长度为的0-1向量组成可用子集数表示。在搜索解空间树时只要其左儿子结点是个可行结点搜索进入左子树。当右子树中有可能包含最优解时就进入右子树搜索。(4)分支限界法,首先.,要对输入数据进行预处里, 将各物品依其单位重量价值从快到小进行排列。在优先队列分支限界法中节点的优先级由已装袋的物品价值加上剩下的最大单位重量们值的物品装满剩镕量的价值和
3.对比不同算法求解该问题的优劣: (山)动态规划:优:求得最优决策序列;缺:速度慢。l2)贪心算法:优:速度较快;缺;很难得到最优角眠,(3)回溯法:优:能得到最优解,缺:时间复杂度较高(14)分支眼界法;优:速度快易求角解;缺:占用内在大效率不高。
总结:
在计算机行业中,算法分析与设计是一门韭常重的课程.在很问题的解决还是程序的编写都要依赖它。算法的学习对培养一个人的逻辑思维能力有极大的帮助,可以培养我们思考分析问题、解决问题的能力。总之,这迸期的算法学习让我收获很大。