(一)八大算法思想

八大算法

八大算法:枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟算法思想。

一、枚举算法思想(暴力算法)

  将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现。

  经典运用:百钱买百鸡、填写运算符

二、递推算法思想

  1.顺推法:从已知条件出发,逐步推算出要解决问题的方法。

  2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。

  经典运用:斐波那契数列(顺推法)、银行存款(逆推法)

三、递归算法思想

  1.递归过程一般通过函数或子过程实现;

  2.递归算法在函数或子过程的内部,直接或间接调用自己的算法

  3.递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解

  注意:必须有一个明确的递归结束条件;如果递归次数过多,容易造成栈溢出。

  经典运用:汉诺塔问题、阶乘问题

四、分治算法思想

  将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可得到原问题的解。

  一般步骤:

    1.分解,将要解决的问题划分成若干个规模较小的同类问题

    2.求解,当子问题划分得足够小时,用较简单的方法解决

    3.合并,按原问题的要求,将子问题的解逐层合并构成原问题的解

  经典运用:大数相乘问题、比赛日程安排

五、贪心算法思想

  从问题的某一个初始解出发,逐步逼近给定的目标,以便尽快求出更好的解。

  局限:

    不能保证最后的解是最优的;

    不能求最大最小解问题;

    只能求满足某些约束条件的可行解范围。

  基本过程:

    1.从问题的某一初始解出发

    2.while能向给定总目标前进一步

    3.求出可行解的一个解元素

    4.由所有解元素组合成问题的一个可行解

  经典运用:装箱问题、找零方案

六、试探算法(回溯法)

  在试探算法中,放弃当前候选解,并继续寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。

  (为求得问题的正确解,会先委婉地试探某一种可能情况。在进行试探过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉地退回一步重新选择,然后继续向前试探。反复进行,直到得到解或证明无解时才死心)

  基本步骤:

    1.针对所给问题,定义问题的解空间

    2.确定易于搜索的解空间结构

    3.以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索

  经典运用:八皇后问题、29选7彩票组合

七、迭代算法(辗转法)

  是一种不断用变量的旧值递推新值的过程,解决问题时总是重复利用一种方法。

  1.确定迭代变量:直接或间接地不断由旧值递推出新值的变量

  2.建立迭代关系式:新值与旧值的公式或关系。(解决迭代问题的关系)

  3.对迭代过程进行控制:确定迭代过程什么时候结束

    所需的迭代次数是个确定值,可以计算出来:可以构建一个固定次数的循环来实现对迭代过程的控制;

    所需的迭代次数无法确定:需要进一步分析出用来结束迭代过程的条件。

  经典运用:求平方根问题

八、模拟算法思想

  对真实事物或者过程的虚拟。

  经典运用:猜数字游戏、掷骰子问题

---end---

原文地址:https://www.cnblogs.com/zuzZ/p/8178950.html

时间: 2024-10-13 09:47:32

(一)八大算法思想的相关文章

八大算法思想

八大算法思想分别是:枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟算法思想. 1.比较“笨”的枚举算法思想 枚举最大的缺点是运算量比较大,解题效率不高. 如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法,而无须太在意是够还有更快的算法,这样可以使你有更多的时间去解答其他难题. //枚举法解决“填写运算符”的问题 import java.util.Scanner; public class meijujisuan5ge5 { public static voi

《转》八大算法详细讲解

转自http://blog.csdn.net/jobbofhe/article/details/51426934 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短:

常用的算法思想总结

对于计算机科学而言,算法是一个非常重要的概念.它是程序设计的灵魂,是将实际问题同解决该问题的计算机程序建立起联系的桥梁.接下来,我们来看看一些常用的算法思想. (一)穷举法思想 穷举法,又称为强力法.它是一种最为直接,实现最为简单,同时又最为耗时的一种解决实际问题的算法思想. 基本思想:在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中得到问题的答案. 使用穷举法思想解决实际问题,最关键的步骤是划定问题的解空间,并在该解空间中一一枚举每一个可能的解.这里有两点需要注意,一是解空

基本算法思想Java实现的详细代码

基本算法思想Java实现的详细代码 算法是一个程序的灵魂,一个好的算法往往可以化繁为简,高效的求解问题.在程序设计中算法是独立于语言的,无论使用哪一种语言都可以使用这些算法,本文笔者将以Java语言为例介绍一些常用的算法思想. 分类 穷举算法思想 递推算法思想 递归算法思想 分治算法思想 概率算法思想  穷举算法思想 穷举算法的基本思想 从所有可能情况中搜索正确答案 1. 对于一种可能情况,计算其结果. 2. 判断结果是否满足,如不能满足者执行第一步来搜索下一个可能的情况:如满足则表示选找到一个

五大算法思想—贪心算法

贪心法理解 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优. 一句话:不求最优,只求可行解. 判断贪心法 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解? 我们可以根据贪心法的2个重要的性质去证明:贪心选择性质和最优子结构性质. 1.贪心选择性质 什么叫贪心选择?从字义上就是贪心也就是目光短线,贪图眼前利益,在

机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

http://www.cnblogs.com/tornadomeet/p/3395593.html 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大.

【算法思想】循环移动一个数组

问题:如何将一个数组循环左移或者右移k位? 在下面的解决方案中,我们以循环左移为例. 我们最容易想到的是,将前k个元素复制到一个临时的数组中,然后将剩下的n-k个元素向左移动k个位置,然后将之前的k个元素复制到剩下的位置.这种方法使用了k个额外的存储空间.我们想到到另一种方法是,只借助一个临时空间,每次只向左移动1位,循环k次.这种方法产生了多于的运行时间.前面一篇文章中用程序实现了循环右移一个数组的算法.前面提到的都是比较常规的算法,下面从其它角度来考虑这一问题: 循环数组x其实就是交换数组x

分冶算法思想

1.分冶算法思想是将一个计算复杂的问题分为规模较小,计算简单的问题,,然后综合各个小问题得到最终问题的答案. 2.分冶算法的执行过程 对于一个对魔为N的问题,若该问题可以容易的解决,则直接解决,否则执行下面的步骤. 将该分解为M个规模较小的子问题,子问题相互独立,并且与原问题形式相同. 递归的解这些问题, 然后,将各子问题的姐合并得到原问题的解. 3.分冶算法例子 java实现: package com.sjx.test1;import java.util.Scanner; public cla

Floyd算法思想

Floyd算法是一个经典的动态规划算法.用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径.从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在),floyd算法加入了这个概念 Ak(i,j):表示从i到j中途不经过索引比k大的点的最短路径. 这个限制的重要之处在于,它将最短路径的概念做了限制,使得该限制有机会满足迭代关系,这个迭代关系就在于研究:假设Ak(i,j)已知,是否可以借此推导出Ak-1(i,j). 假设我现在要得到Ak(i