计算机算法

枚举法[穷举法]

枚举法(通常也称为穷举法)是指在一个有穷的可能的解的集合中,枚举出集合中的每一个元素,用题目给定的约束条件去判断其是否符合条件,若满足条件,则该元素即为整个问题的解;否则就不是问题的解。枚举的思想往往是最容易想到的一种解题策略,枚举法从本质上说是一种搜索的算法,但适用枚举法解题必须满足下列条件:

 

递归法

一个函数、过程、概念或数学结构,如果在其定义或说明内部直接或间接地出现有其本身的引用,或者是为了描述问题的某一状态,必须用到它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或者是递归定义。

       在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用。子程序直接调用自己,称为直接递归;嵌套关系的子程序ab,内层的b调用外层的a,是间接递归;平级关系的子程序ab,其中a调用了b,b又调用了a,这也是间接递归。

1)可预先确定解元素的个数n,且问题的规模不是特别大;

2)对于每个解变量A1A2,。。。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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值