算法思想快速入门

算法分类

分治法

分治法和动态规划有点像,都是分解成子问题

中科大的张署老师课件很清楚,摘录如下:

1.什么是分治法

当求解的问题较复杂或规模较大时,不能立刻得到原问题的解,但这些问题本身具有这样的特点,它可以分解为若干个与原问题性质相类似的子问题,而这些子问题较简单可方便得到它们的解,因此通过合并这些子问题的解就可得到原问题的解。

  1. 应用分治法的三个基本步骤

①分解问题(divide):把原问题分解为若干个与原问题性质相类似的子问题

②求解子问题(conquer):不断分解子问题直到可方便求出子问题的解为止

③合并子问题的解(combine):合并子问题的解得到原问题的解

做题时的三步(与上面类似)

①divide:把具有n个元素的数组分解为二个n/2大小的子数组

②conquer:递归地分解子数组,直到子数组只包含一个元素为止

③combine:二二合并已排好序的子数组使之成为一个新的排好序的子数组,重复这样二二合并的过程直到得到原问题的解

3.分治法适用条件

①原问题可以分解为若干个与原问题性质相类似的子问题

②问题的规模缩小到一定程度后可方便求出解

③子问题的解可以合并得到原问题的解

④分解出的各个子问题应相互独立,即不包含重叠子问题

如求Fib数问题

有代表性的就是我们在数学上学的二分法
这里在洛谷上有几个题
1
2
3
4
4.经典例子:

  • 归并排序(Merge Sort) 思想:如果能把原待排序的数组分解成若干个待排序的子数组,而这些子数组可以方便地排好序,并且通过合并这些子数组的解将能得到原问题的解,则整个数组将排好序。

  • 快速排序:

  • 二分查找:一个有序数组,通过均匀二分,每次折半查找,不就是分治法吗!!!

FFT快速傅里叶变换:这是DSP课本里的知识,离散时域信号转换为频域信号,运算量太大,故拆分计算再合并,每部分的处理方式和没拆分时总体的方式一样的,所以符合分治法!!!

5.三种常用算法:

替换法,递归树,主方法

原文链接:https://blog.csdn.net/zhangfan1913775361/article/details/80155348

枚举与贪心

就是由局部最优解得到整体最优解

贪心算法
贪心算法简介:
  贪心算法是指:在每一步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解。

贪心算法每一步必须满足一下条件:

1、可行的:即它必须满足问题的约束。

2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。

3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。

动态规划

1.定义及性质
就是一个通过不断的划分子问题然后得出递推的一个公式的问题

动态规划是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,用时往往远少于朴素解法。

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

2.算法设计步骤
动态规划算法的设计可以分为4个步骤:

动态规划法所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线图。动态规划法一般需要经历以下几个步骤:

1.划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或是可排序的,否则问题就无法求解。

2.确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

3.确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来本阶段的状态。所以如果确定了决策,状态转移方程也就可以写出。但事实上尝尝是反过来做,根据相邻连个状态之间的关系来确定决策方法和状态转移方程。

4.寻找边界条件:给出的状态转移方程是一个递推式,需要一个地推的终止条件或边界条件。

实际应用中一般按一下步骤进行设计:

1.描述最优解的结构,可以利用子问题的最优解来构造原问题的最优解;

2.递归定义最优解的值

3.按自底向上的方式计算最优解的值

4.由计算出的结果构造一个最优解

3.动态规划法的适用情况:

能采用动态规划求解的问题的一般要具有3个性质:

(1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

(2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

4.算法实现说明
动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。

 使用动态规划求解问题,最重要的就是确定动态规划三要素:

(1)问题的阶段 (2)每个阶段的状态

(3)从前一个阶段转化到后一个阶段之间的递推关系。

递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。

确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。
f ( n , m ) = m a x f ( n − 1 , m ) , f ( n − 1 , m − w [ n ] ) + P ( n , m ) f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)} f(n,m)=maxf(n1,m),f(n1,mw[n])+P(n,m)

原文: https://blog.csdn.net/longshengguoji/article/details/8806533

  1. 简单概述
    回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。

基本思想类同于:

图的深度优先搜索
二叉树的后序遍历
分支限界法:广度优先搜索 思想类同于:图的广度优先遍历, 二叉树的层序遍历,

  1. 详细描述
    详细的描述则为:

     回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。
    
     回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。
    
     问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。解空间树分为两种:子集树和排列树。两种在算法结构和思路上大体相同。
    
  2. 回溯法应用
    当问题是要求满足某种性质(约束条件)的所有解或最优解时,往往使用回溯法。

    它有“通用解题法”之美誉。
    

二. 回溯法实现 - 递归和递推(迭代)
回溯法的实现方法有两种:递归和递推(也称迭代)。一般来说,一个问题两种方法都可以实现,只是在算法效率和设计复杂度上有区别。
【类比于图深度遍历的递归实现和非递归(递推)实现】
4. 递归
5. 递推
6. 经典问题;
(1)装载问题
(2)0-1背包问题
(3)旅行售货员问题
(4)八皇后问题
(5)迷宫问题
(6)图的m着色问题

分治限界法

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

原文链接:https://blog.csdn.net/qjt19950610/article/details/89476784

博弈论

传送门

goto这个博客总结竞赛用到的算法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值