枚举法[穷举法]
枚举法(通常也称为穷举法)是指在一个有穷的可能的解的集合中,枚举出集合中的每一个元素,用题目给定的约束条件去判断其是否符合条件,若满足条件,则该元素即为整个问题的解;否则就不是问题的解。枚举的思想往往是最容易想到的一种解题策略,枚举法从本质上说是一种搜索的算法,但适用枚举法解题必须满足下列条件:
递归法
一个函数、过程、概念或数学结构,如果在其定义或说明内部直接或间接地出现有其本身的引用,或者是为了描述问题的某一状态,必须用到它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或者是递归定义。
在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用。子程序直接调用自己,称为直接递归;嵌套关系的子程序a和b,内层的b调用外层的a,是间接递归;平级关系的子程序a和b,其中a调用了b,b又调用了a,这也是间接递归。
1)可预先确定解元素的个数n,且问题的规模不是特别大;
2)对于每个解变量A1,A2,。。。An的可能值必须为 一个连续的值域。
枚举法的算法流程:设ai1为解变量Ai的最小值;aik为解变量的最大值;其中1 ≤ i ≤ n.
A1∈ {a11,a12,…,a1K}
A2∈ {a21,A22,…,A2K}
……
Ai∈ {ai1,Ai2,…,AiK}
……
An∈ {an1,An2,…,AnK}
我们称解变量为枚举变量。例如某问题的枚举变量有三个: A1, A2, A3。
枚举法的优化方法:
1)减少枚举的变量,在使用枚举法之前,先考虑一下解元素之 间的关联,将一些非枚举不可的解元素列为枚举变量,其他元素通过计算得出解元素的可能值。
2)减少枚举变量的值域
3)分解约束条件,将拆分的约束条件嵌套在相应的循环体间。
回溯法
回溯是重要的算法之一,有一些问题,要求找到一组解,或要求找到一个满足某些限制的最优解。对于解决这样的问题,可以通过使用彻底的搜索方法来解决。然而,彻底搜索的运算量很大,有时大到计算机承受不了的程度。彻底的搜索,要进行大量的比较,大量的舍弃,以大量的运算,大量的时间为代价。因此,用穷举法解某些实际问题是不现实的,回溯算法为我们提供了一个好方法,使用回溯法可以大大减少实际的搜索。例如,迷宫问题,八皇后问题,骑士周游世界问题。
关键:找到回溯的条件
算法思想:
通过对问题的分析,找出一个解决问题的线索,然后沿着这个线索往前试探,若试探成功,就得到解,若试探失败,就逐步往回退,换别的路线再往前试探。实际上是广度与深度搜索结合的搜索,深度搜索过程中碰到条件不满足,则退回上一层,在每一层上也进行全面的搜索。
模拟法
随机数的介绍
在自然界和日常生活中,许多现象具有不确定的性质,有些问题甚至很难建立数学模型,或者很难用计算机建立递推,递归,枚举,回溯法等算法.在这种情况下,一般采用模拟策略.在对实际问题中的随机现象进行数学模拟时,利用计算机产生的随机数是必不可少的,由于用计算机产生的随机数总是受字长的限制,其随机的意义要比实际问题中真实的随机变量稍差,因此,通常将计算机产生的随机数称为伪随机数.
就是模拟某个过程,通过改变数学的各种参数,进而观察变更这些参数所引起过程状态的变化.一般题目给定或者隐含某一概率.设计者利用随机函数和取整函数设定某一范围的随机值,将符合概率的随机值作为参数.然后根据这一模拟的数学模型展开算法.
模拟策略的关键:
是如何按照概率的要求确定随机值的范围.这个随机值设计得好,模拟效果就好.
贪心法
是从问题的某一个初始解出发,向给定的目标推进.但不同的是 ,推进的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择,不断地将问题实例归纳为更小的相似的子问题,并期望通过所做的局部最优选择产生出一个全局最优解.
分治策略
分治策略指的是分而治之的方法。当我们处理大规模问题时,求解可能比较困难,对于这类问题,我们可以将原问题分解成规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后由这些小问题的解构造出原问题的解。因此一个问题能否用分治法解决,关键是看该问题算法能否将原问题分成n个规模较小而结构与原问题相似的子问题。递归地解决这些子问题,然后合并其结果就得到原问题的解。当n=2时的分治法又称二分法。
分治策略一般分为三个步骤:
1、分解:将要解决的问题划分成若干个规模较小的同类问题。
2、求解:当子问题划分得足够小时,用较简单的方法解决。
3、合并:按原问题的要求,将子问题的解逐层合并成原问题的解
使用分治策略的问题常常要借助递归的结构,逐层求解,当问题规模达到某个简单情况时,解容易直接得出,而不必继续分解。其过程大致如下:
If 问题不可分 then begin
直接求解;
返回问题的解;
else begin
从原问题中划分出含1/n运算对象的子问题1;
递归调用分治法过程,求出解1;
从原问题中划分出含1/n运算对象的子问题2;
递归调用分治法过程,求出解2;
……
从原问题中划分出含1/n运算对象的子问题n;
递归调用分治法过程,求出解n;
将解1、解2、……解n组合成整个问题的解;
end;
I don’t know what i’ll do. Sometime, I hope there will be some one told me how and what I should do. But, as we all know, everything during your own life, you must decide by yourself and nobody can help you.
Thus, you should make a decision of your future.